http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50603

--- Comment #5 from H.J. Lu <hjl.tools at gmail dot com> 2011-10-06 19:37:56 
UTC ---
Taking from combine.c:

     else if (GET_CODE (t) == ZERO_EXTEND
               && (GET_CODE (XEXP (t, 0)) == PLUS
                   || GET_CODE (XEXP (t, 0)) == IOR
                   || GET_CODE (XEXP (t, 0)) == XOR)
               && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
               && HWI_COMPUTABLE_MODE_P (mode)
               && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
               && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
               && ((nonzero_bits (f, GET_MODE (f))
                    & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1)))) 
                   == 0))
        {     
          c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
          extend_op = ZERO_EXTEND;
          m = GET_MODE (XEXP (t, 0));
        }     

I think this patch:

diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 89cc8a7..4386b82 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -600,8 +600,8 @@
 ;; Match exactly 0x0FFFFFFFF in anddi as a zero-extension operation
 (define_predicate "const_32bit_mask"
   (and (match_code "const_int")
-       (match_test "trunc_int_for_mode (INTVAL (op), DImode)
-            == (HOST_WIDE_INT) 0xffffffff")))
+       (match_test "(nonzero_bits (op, GET_MODE (op))
+             & ~GET_MODE_MASK (DImode)) == 0")))

 ;; Match 2, 4, or 8.  Used for leal multiplicands.
 (define_predicate "const248_operand"

should work.

Reply via email to