diff mbox

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

Message ID 20110622193657.GA8942@intel.com
State New
Headers show

Commit Message

H.J. Lu June 22, 2011, 7:36 p.m. UTC
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.
---

Comments

Eric Botcazou June 24, 2011, 8:58 a.m. UTC | #1
> 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.

I agree that this is overly optimistical, but this was done on purpose:
  http://gcc.gnu.org/ml/gcc-patches/2001-02/msg00316.html

Could you evaluate the pessimization that the patch introduces (if any) for the 
generated code on x32?  If there is none or it is negligible, the patch is OK 
if completed by the removal of the equivalent code in num_sign_bit_copies1.
If it isn't negligible, we may need to be clever and devise something else.
H.J. Lu June 24, 2011, 1:38 p.m. UTC | #2
On Fri, Jun 24, 2011 at 1:58 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> 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.
>
> I agree that this is overly optimistical, but this was done on purpose:
>  http://gcc.gnu.org/ml/gcc-patches/2001-02/msg00316.html
>
> Could you evaluate the pessimization that the patch introduces (if any) for the
> generated code on x32?  If there is none or it is negligible, the patch is OK
> if completed by the removal of the equivalent code in num_sign_bit_copies1.
> If it isn't negligible, we may need to be clever and devise something else.
>

I compared x32 glibc built with the old x32 gcc against x32 glibc built with
this patch and

http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00913.html

reverted, the new glibc is little smaller:

New:

[hjl@gnu-33 build-x86_64-linux]$ size libc.so
   text	   data	    bss	    dec	    hex	filename
1537648	  10076	  12944	1560668	 17d05c	libc.so
[hjl@gnu-33 build-x86_64-linux]$

Old:

[hjl@gnu-33 build-x86_64-linux.old]$ size libc.so
   text	   data	    bss	    dec	    hex	filename
1538968	  10076	  12944	1561988	 17d584	libc.so
[hjl@gnu-33 build-x86_64-linux.old]$

I looked at assembly codes.  The new one is better.
I will check it in.

Thanks.
Eric Botcazou June 24, 2011, 2:07 p.m. UTC | #3
> I compared x32 glibc built with the old x32 gcc against x32 glibc built
> with this patch and
>
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00913.html
>
> reverted, the new glibc is little smaller:
>
> New:
>
> [hjl@gnu-33 build-x86_64-linux]$ size libc.so
>    text	   data	    bss	    dec	    hex	filename
> 1537648	  10076	  12944	1560668	 17d05c	libc.so
> [hjl@gnu-33 build-x86_64-linux]$
>
> Old:
>
> [hjl@gnu-33 build-x86_64-linux.old]$ size libc.so
>    text	   data	    bss	    dec	    hex	filename
> 1538968	  10076	  12944	1561988	 17d584	libc.so
> [hjl@gnu-33 build-x86_64-linux.old]$
>
> I looked at assembly codes.  The new one is better.
> I will check it in.

OK, but remove the equivalent code in num_sign_bit_copies1 then, otherwise 
someone in a couple of years from now will adapt it to nonzero_bits1 and we 
will be back to square one.
diff mbox

Patch

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;
+}