OSDN Git Service

* combine.c (try_widen_shift_mode) <LSHIFTRT>: Allow widening if the
authornemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Jul 2009 21:48:19 +0000 (21:48 +0000)
committernemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Jul 2009 21:48:19 +0000 (21:48 +0000)
high-order bits are zero.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149779 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c

index 9643005..1c418d1 100644 (file)
@@ -1,5 +1,10 @@
 2009-07-18  Adam Nemet  <anemet@caviumnetworks.com>
 
+       * combine.c (try_widen_shift_mode) <LSHIFTRT>: Allow widening if the
+       high-order bits are zero.
+
+2009-07-18  Adam Nemet  <anemet@caviumnetworks.com>
+
        * combine.c (simplify_shift_const_1): Split code to determine
        shift_mode into ...
        (try_widen_shift_mode): ... here.  Allow widening for ASHIFTRT if the
index a0157df..12f0ed8 100644 (file)
@@ -9005,8 +9005,15 @@ try_widen_shift_mode (enum rtx_code code, rtx op,
          > (unsigned) (GET_MODE_BITSIZE (mode)
                        - GET_MODE_BITSIZE (orig_mode)))
        return mode;
-      /* fall through */
+      return orig_mode;
+
     case LSHIFTRT:
+      /* Similarly here but with zero bits.  */
+      if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
+         && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
+       return mode;
+      /* fall through */
+
     case ROTATE:
       return orig_mode;