(make_extraction): When making a low part subreg of a reg,
authorRichard Stallman <rms@gnu.org>
Thu, 26 Nov 1992 05:34:24 +0000 (05:34 +0000)
committerRichard Stallman <rms@gnu.org>
Thu, 26 Nov 1992 05:34:24 +0000 (05:34 +0000)
use inner_mode, not is_mode.

(num_sign_bit_copies): Inhibit x-1 special case
when x is a paradoxical subreg.

From-SVN: r2802

gcc/combine.c

index 76fbe1b64f068123314abf5b3f4a62e7914769e0..1021391f0feaa56c3ea06c1cc27315c6db13e7c5 100644 (file)
@@ -4632,8 +4632,8 @@ make_extraction (mode, inner, pos, pos_rtx, len,
           a SUBREG and it would sometimes return a new hard register.  */
        new = gen_rtx (SUBREG, tmode, inner,
                       (WORDS_BIG_ENDIAN
-                       && GET_MODE_SIZE (is_mode) > UNITS_PER_WORD
-                       ? ((GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (tmode))
+                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD
+                       ? ((GET_MODE_SIZE (inner_mode) - GET_MODE_SIZE (tmode))
                           / UNITS_PER_WORD)
                        : 0));
       else
@@ -6345,7 +6345,12 @@ num_sign_bit_copies (x, mode)
         be such a carry.  Furthermore, if the positive number is known to
         be 0 or 1, we know the result is either -1 or 0.  */
 
-      if (code == PLUS && XEXP (x, 1) == constm1_rtx)
+      if (code == PLUS && XEXP (x, 1) == constm1_rtx
+         /* Don't do this if XEXP (x, 0) is a paradoxical subreg
+            because in principle we don't know what the high bits are.  */
+         && !(GET_CODE (XEXP (x, 0)) == SUBREG
+              && (GET_MODE_SIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
+                  < GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))))
        {
          sig = significant_bits (XEXP (x, 0), mode);
          if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & sig) == 0)