On Sun, Jan 19, 2014 at 3:30 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. >>>> >>> >>> Yes, the resulting GCC works correctly. However, we generate >>> extra >>> >>> (set (reg:DI) (zero_extend:DI (reg:SI))) >>> >>> It is because we generate >>> >>> (set (reg:SI) (reg:SI) >>> (set (reg:DI) (zero_extend:DI (reg:SI))) >>> >>> REE pass doesn't know >>> >>> (set (reg:SI) (reg:SI) >>> >>> has an implicit ZERO_EXTEND. Here is a testcase: >> >> This is the correct sequence,and REE pass should be improved to handle >> this situation. >> >> Note, that the problem was that we assumed SImode operations >> (including move) have implicit DImode zero-extend, but in fact we >> haven't communicate this to the compiler in a proper way. >> >> So, I propose we go with my patch and file an enhancement PR for the REE >> pass. >> > > That is fine with me. Please install it on all affected branches > and close the PR. I will open a new PR for REE pass. Installed with following ChangeLog: 2014-01-18 Uros Bizjak <ubiz...@gmail.com> H.J. Lu <hongjiu...@intel.com> PR target/59379 * config/i386/i386.md (*lea<mode>): Zero-extend return register to DImode for zero-extended addresses. Bootstrapped and regression tested on x86_64-pc-linux-gnu, will backport in a couple of days. Uros.