(nonzero_bits, case REG): Check POINTERS_EXTEND_UNSIGNED.
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 3 Apr 1995 22:11:26 +0000 (18:11 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 3 Apr 1995 22:11:26 +0000 (18:11 -0400)
(num_sign_bit_copies, case REG): Likewise.

From-SVN: r9303

gcc/combine.c

index b25191e587f2678466c24898c475c4e869749595..05ec5d3e8a95d7b056acdaa61fab56f4c2e54474 100644 (file)
@@ -6752,10 +6752,18 @@ nonzero_bits (x, mode)
          sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment);
 #endif
 
-         return nonzero & ~ (sp_alignment - 1);
+         nonzero &= ~ (sp_alignment - 1);
        }
 #endif
 
+#ifdef POINTERS_EXTEND_UNSIGNED
+      /* If pointers extend unsigned and this is a pointer in Pmode, say that
+        all the bits above ptr_mode are known to be zero.  */
+      if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
+         && REGNO_POINTER_FLAG (REGNO (x)))
+       nonzero &= GET_MODE_MASK (ptr_mode);
+#endif
+
       /* If X is a register whose nonzero bits value is current, use it.
         Otherwise, if X is a register whose value we can find, use that
         value.  Otherwise, use the previously-computed global nonzero bits
@@ -7091,6 +7099,14 @@ num_sign_bit_copies (x, mode)
     {
     case REG:
 
+#ifdef POINTERS_EXTEND_UNSIGNED
+      /* If pointers extend signed and this is a pointer in Pmode, say that
+        all the bits above ptr_mode are known to be sign bit copies.  */
+      if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
+         && REGNO_POINTER_FLAG (REGNO (x)))
+       return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
+#endif
+
       if (reg_last_set_value[REGNO (x)] != 0
          && reg_last_set_mode[REGNO (x)] == mode
          && (reg_n_sets[REGNO (x)] == 1