On Sat, Jan 18, 2014 at 9:15 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > For LEA operation with SImode_address_operand, which zero-extends SImode > to DImode, ix86_split_lea_for_addr turns > > (set (reg:DI) ...) > > into > > (set (reg:SI) ...) > > We need to do > > (set (reg:DI) (zero_extend:DI (reg:SI))) > > at the end. If the LEA operation is > > (set (reg:DI) (zero_extend:DI (reg:SI)))
ree pass should remove these. However, we can just emit zero-extend insn at the end of sequence, and ree (which is located after post-reload split) should handle it: --cut here-- Index: config/i386/i386.md =================================================================== --- config/i386/i386.md (revision 206753) +++ config/i386/i386.md (working copy) @@ -5428,12 +5428,17 @@ operands[0] = SET_DEST (pat); operands[1] = SET_SRC (pat); - /* Emit all operations in SImode for zero-extended addresses. Recall - that x86_64 inheretly zero-extends SImode operations to DImode. */ + /* Emit all operations in SImode for zero-extended addresses. */ if (SImode_address_operand (operands[1], VOIDmode)) mode = SImode; ix86_split_lea_for_addr (curr_insn, operands, mode); + + /* Zero-extend return register to DImode for zero-extended addresses. */ + if (mode != <MODE>mode) + emit_insn (gen_zero_extendsidi2 + (operands[0], gen_lowpart ((mode), operands[0]))); + DONE; } [(set_attr "type" "lea") --cut here-- The patch was tested with a testcase from Comment #9 of the PR using "-O --march=corei7 -mtune=slm", and resulting binary runs without problems. Uros.