[Bug middle-end/55259] plus_constant doesn't handle zero-extended address properly

2012-11-11 Thread ebotcazou at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55259



--- Comment #2 from Eric Botcazou ebotcazou at gcc dot gnu.org 2012-11-11 
21:52:53 UTC ---

Author: ebotcazou

Date: Sun Nov 11 21:52:49 2012

New Revision: 193415



URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=193415

Log:

PR rtl-optimization/55247

PR middle-end/55259

* emit-rtl.c (adjust_address_1): If POINTERS_EXTEND_UNSIGNED  0,

handle ZERO_EXTEND.

* recog.c (offsettable_address_addr_space_p): Likewise.



Added:

trunk/gcc/testsuite/gcc.target/i386/pr55247-2.c

Modified:

trunk/gcc/ChangeLog

trunk/gcc/emit-rtl.c

trunk/gcc/recog.c

trunk/gcc/testsuite/ChangeLog


[Bug middle-end/55259] plus_constant doesn't handle zero-extended address properly

2012-11-11 Thread hjl.tools at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55259



H.J. Lu hjl.tools at gmail dot com changed:



   What|Removed |Added



 Status|UNCONFIRMED |RESOLVED

 Resolution||FIXED

   Target Milestone|--- |4.8.0



--- Comment #3 from H.J. Lu hjl.tools at gmail dot com 2012-11-11 23:54:51 
UTC ---

Fixed.


[Bug middle-end/55259] plus_constant doesn't handle zero-extended address properly

2012-11-09 Thread hjl.tools at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55259



--- Comment #1 from H.J. Lu hjl.tools at gmail dot com 2012-11-10 04:13:32 
UTC ---

A potential fix:



diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c

index 95bbfa7..d7c454c 100644

--- a/gcc/emit-rtl.c

+++ b/gcc/emit-rtl.c

@@ -2109,6 +2109,12 @@ adjust_address_1 (rtx memref, enum machine_mode mode,

HOS

T_WIDE_INT offset,

 addr = gen_rtx_LO_SUM (address_mode, XEXP (addr, 0),

plus_constant (address_mode,

   XEXP (addr, 1), offset));

+  else if (GET_CODE (addr) == ZERO_EXTEND)

+{

+  addr = XEXP (addr, 0);

+  addr = plus_constant (GET_MODE (addr), addr, offset);

+  addr = gen_rtx_ZERO_EXTEND (address_mode, addr);

+}

   else

 addr = plus_constant (address_mode, addr, offset);

 }