[Bug target/78794] [7 Regression] We noticed ~9% regression in 32-bit mode for 462.libquntum on Avoton after r243202

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Dec 13 14:55:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78794

--- Comment #8 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Uroš Bizjak from comment #7)

> Yes, this is a good idea.
Also, since pandn on non-BMI target replaces four arith insns with one, the
gain should be raised for 2 * ix86_cost->add for a total of 3 * ix86_cost->add.

The final patch is thus:

--cut here--
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 1cd1cd8..6a746b2 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3417,7 +3417,11 @@ dimode_scalar_chain::compute_convert_gain ()
               || GET_CODE (src) == AND)
        {
          gain += ix86_cost->add;
-         if (CONST_INT_P (XEXP (src, 0)))
+         /* Additional gain for andnot for targets without BMI.  */
+         if (GET_CODE (XEXP (src, 0)) == NOT
+             && !TARGET_BMI)
+           gain += 2 * ix86_cost->add;
+         else if (CONST_INT_P (XEXP (src, 0)))
            gain -= vector_const_cost (XEXP (src, 0));
          if (CONST_INT_P (XEXP (src, 1)))
            gain -= vector_const_cost (XEXP (src, 1));
--cut here-

Please also note that on BMI targets, the attached testcase won't be converted,
which is a good thing - the loop on BMI targets looks like:

.L4:
        movl    4(%eax), %edi
        andn    4(%esp), %edi, %ebx
        movl    (%eax), %esi
        movl    %ebx, %ebp
        andn    (%esp), %esi, %ecx
        orl     %ecx, %ebp
        jne     .L3
        xorl    8(%esp), %esi
        xorl    12(%esp), %edi
        movl    %esi, (%eax)
        movl    %edi, 4(%eax)
.L3:
        addl    $12, %eax
        cmpl    %edx, %eax
        jne     .L4


More information about the Gcc-bugs mailing list