PATCH: PR rtl-optimization/49504: Invalid optimization for Pmode != ptr_mode

H.J. Lu hongjiu.lu@intel.com
Wed Jun 22 19:39:00 GMT 2011


Hi,

I just don't see how nonzero_bits1 can assume if pointers extend unsigned
and this is an addition or subtraction to a pointer in Pmode, all the bits
bove ptr_mode are known to be zero.  We never run into it before x32
since x32 is the first such target.

This patch deletes it.  OK to install the nonzero_bits1 part for trunk?

Thanks.


H.J.
---
diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32
index 564e123..9bbb05b 100644
--- a/gcc/ChangeLog.x32
+++ b/gcc/ChangeLog.x32
@@ -1,3 +1,9 @@
+2011-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR rtl-optimization/49504
+	* rtlanal.c (nonzero_bits1): Properly handle addition or
+	subtraction a pointer in Pmode if pointers extend unsigned.
+
 2011-06-15  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR middle-end/48016
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index b52957d..e5c045d 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -4134,20 +4134,6 @@ nonzero_bits1 (const_rtx x, enum machine_mode mode, const_rtx known_x,
 
 	if (result_low > 0)
 	  nonzero &= ~(((unsigned HOST_WIDE_INT) 1 << result_low) - 1);
-
-#ifdef POINTERS_EXTEND_UNSIGNED
-	/* If pointers extend unsigned and this is an addition or subtraction
-	   to a pointer in Pmode, all the bits above ptr_mode are known to be
-	   zero.  */
-	/* As we do not know which address space the pointer is refering to,
-	   we can do this only if the target does not support different pointer
-	   or address modes depending on the address space.  */
-	if (target_default_pointer_address_modes_p ()
-	    && POINTERS_EXTEND_UNSIGNED > 0 && GET_MODE (x) == Pmode
-	    && (code == PLUS || code == MINUS)
-	    && REG_P (XEXP (x, 0)) && REG_POINTER (XEXP (x, 0)))
-	  nonzero &= GET_MODE_MASK (ptr_mode);
-#endif
       }
       break;
 
diff --git a/gcc/testsuite/ChangeLog.x32 b/gcc/testsuite/ChangeLog.x32
index ab8dd76..6581a45 100644
--- a/gcc/testsuite/ChangeLog.x32
+++ b/gcc/testsuite/ChangeLog.x32
@@ -1,3 +1,8 @@
+2011-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR rtl-optimization/49504
+	* gcc.target/i386/pr49504.c: New.
+
 2011-06-15  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* gcc.dg/pr44194-1.c: Also allow x32.
diff --git a/gcc/testsuite/gcc.target/i386/pr49504.c b/gcc/testsuite/gcc.target/i386/pr49504.c
new file mode 100644
index 0000000..9128196
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr49504.c
@@ -0,0 +1,18 @@
+/* PR target/49504 */
+/* { dg-do run { target { x32 } } } */
+/* { dg-options "-O" } */
+
+unsigned long long 
+foo (const void* p, unsigned long long q)
+{
+  unsigned long long a = (((unsigned long long) ((unsigned long) p)) + q) >> 32;
+  return a;
+}
+
+int
+main ()
+{
+  if (foo ((const void*) 0x100, 0x100000000ULL) == 0)
+    __builtin_abort ();
+  return 0;
+}



More information about the Gcc-patches mailing list