(simplify_shift_const): Inhibit hacks based on
authorRichard Stallman <rms@gnu.org>
Mon, 26 Jul 1993 22:16:16 +0000 (22:16 +0000)
committerRichard Stallman <rms@gnu.org>
Mon, 26 Jul 1993 22:16:16 +0000 (22:16 +0000)
num_sign_bit_copies if shift_mode differs from the mode of varop.

From-SVN: r4994

gcc/combine.c

index fa18f29a134da4741f81a93cf150ec34ad1d75ec..b821af258696a2258a33eb64c1876698d8ce9d12 100644 (file)
@@ -7122,25 +7122,31 @@ simplify_shift_const (x, code, result_mode, varop, count)
       else if (count < 0)
        abort ();
 
-      /* An arithmetic right shift of a quantity known to be -1 or 0
-        is a no-op.  */
-      if (code == ASHIFTRT
-         && (num_sign_bit_copies (varop, shift_mode)
-             == GET_MODE_BITSIZE (shift_mode)))
-       {
-         count = 0;
-         break;
-       }
+      /* If we have replaced VAROP with something wider
+        (such as, the SUBREG_REG), then this won't work;
+        num_sign_bit_copies will give the wrong answer in that case.  */
+      if (shift_mode == GET_MODE (varop))
+       {
+         /* An arithmetic right shift of a quantity known to be -1 or 0
+            is a no-op.  */
+         if (code == ASHIFTRT
+             && (num_sign_bit_copies (varop, shift_mode)
+                 == GET_MODE_BITSIZE (shift_mode)))
+           {
+             count = 0;
+             break;
+           }
 
-      /* If we are doing an arithmetic right shift and discarding all but
-        the sign bit copies, this is equivalent to doing a shift by the
-        bitsize minus one.  Convert it into that shift because it will often
-        allow other simplifications.  */
+         /* If we are doing an arithmetic right shift and discarding all but
+            the sign bit copies, this is equivalent to doing a shift by the
+            bitsize minus one.  Convert it into that shift because it will often
+            allow other simplifications.  */
 
-      if (code == ASHIFTRT
-         && (count + num_sign_bit_copies (varop, shift_mode)
-             >= GET_MODE_BITSIZE (shift_mode)))
-       count = GET_MODE_BITSIZE (shift_mode) - 1;
+         if (code == ASHIFTRT
+             && (count + num_sign_bit_copies (varop, shift_mode)
+                 >= GET_MODE_BITSIZE (shift_mode)))
+           count = GET_MODE_BITSIZE (shift_mode) - 1;
+       }
 
       /* We simplify the tests below and elsewhere by converting
         ASHIFTRT to LSHIFTRT if we know the sign bit is clear.