http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47744
--- Comment #17 from H.J. Lu <hjl.tools at gmail dot com> 2011-07-17 21:21:01 UTC --- (In reply to comment #16) > Following patch to original ix86_decompose_address solves all failures for me: > > --cut here-- > Index: i386.c > =================================================================== > --- i386.c (revision 176373) > +++ i386.c (working copy) > @@ -11149,8 +11149,11 @@ ix86_decompose_address (rtx addr, struct > return 0; > break; > > - case REG: > case SUBREG: > + if (GET_CODE (op) != REG) > + return 0; > + > + case REG: > if (!base) > base = op; > else if (!index) > --cut here-- > > The patch simply prevents subregs of anything else than registers in > addresses. > > So, instead of mess as in comment 14, we have a sequence of two instructions: > > (insn 185 87 89 3 (set (reg:DI 0 ax) > (plus:DI (reg/f:DI 7 sp) > (const_int 200 [0xc8]))) pr47744.c:5 248 {*lea_1} > (nil)) > > (insn 89 185 90 3 (set (reg:SI 40 r11 [177]) > (plus:SI (plus:SI (mult:SI (reg:SI 40 r11 [175]) > (const_int 8 [0x8])) > (reg:SI 0 ax)) > (const_int -160 [0xffffffffffffff60]))) pr47744.c:5 286 > {*lea_general_3} > (nil)) > > Please note, that "normal" lea instructions are now generated, no need for > some > special x32 versions. > > BTW: I'd also argue that this sequence is more correct w.r.t. to overflows, > but > I didn't investigate this since it is already late in the night here... I will give it a try on x32 branch. Thanks.