http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59747
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, before ree we have: (insn 13 12 14 4 (set (reg:HI 0 ax [orig:88 D.1782 ] [88]) (mem/c:HI (symbol_ref:DI ("e") <var_decl 0x7fbcde42c260 e>) [3 e+0 S2 A16])) pr59747.c:18 91 {*movhi_internal} (expr_list:REG_EQUIV (mem/c:HI (symbol_ref:DI ("e") <var_decl 0x7fbcde42c260 e>) [3 e+0 S2 A16]) (nil))) (insn 14 13 15 4 (set (reg:SI 1 dx [orig:97 D.1782 ] [97]) (sign_extend:SI (reg:HI 0 ax [orig:88 D.1782 ] [88]))) pr59747.c:18 145 {extendhisi2} (expr_list:REG_EQUIV (mem/c:SI (symbol_ref:DI ("d") <var_decl 0x7fbcde42c1c8 d>) [2 d+0 S4 A32]) (nil))) (insn 15 14 17 4 (set (mem/c:SI (symbol_ref:DI ("d") <var_decl 0x7fbcde42c1c8 d>) [2 d+0 S4 A32]) (reg:SI 1 dx [orig:97 D.1782 ] [97])) pr59747.c:18 90 {*movsi_internal} (nil)) (insn 17 15 18 4 (set (reg:DI 0 ax [orig:99 f ] [99]) (sign_extend:DI (reg:HI 0 ax [orig:88 D.1782 ] [88]))) pr59747.c:19 144 {extendhidi2} (nil)) Before Jeff's ree changes, we'd transform it into: (insn 13 12 14 4 (set (reg:DI 0 ax) (sign_extend:DI (mem/c:HI (symbol_ref:DI ("e") <var_decl 0x7fbcde42c260 e>) [3 e+0 S2 A16]))) pr59747.c:18 144 {extendhidi2} (expr_list:REG_EQUIV (mem/c:HI (symbol_ref:DI ("e") <var_decl 0x7fbcde42c260 e>) [3 e+0 S2 A16]) (nil))) (insn 14 13 15 4 (set (reg:SI 1 dx [orig:97 D.1782 ] [97]) (sign_extend:SI (reg:HI 0 ax [orig:88 D.1782 ] [88]))) pr59747.c:18 145 {extendhisi2} (expr_list:REG_EQUIV (mem/c:SI (symbol_ref:DI ("d") <var_decl 0x7fbcde42c1c8 d>) [2 d+0 S4 A32]) (nil))) (insn 15 14 18 4 (set (mem/c:SI (symbol_ref:DI ("d") <var_decl 0x7fbcde42c1c8 d>) [2 d+0 S4 A32]) (reg:SI 1 dx [orig:97 D.1782 ] [97])) pr59747.c:18 90 {*movsi_internal} (nil)) which is of course suboptimal, now we transform it into: (insn 13 12 39 4 (set (reg:DI 1 dx) (sign_extend:DI (mem/c:HI (symbol_ref:DI ("e") <var_decl 0x7f76d96ba260 e>) [3 e+0 S2 A16]))) pr59747.c:18 144 {extendhidi2} (expr_list:REG_EQUIV (mem/c:HI (symbol_ref:DI ("e") <var_decl 0x7f76d96ba260 e>) [3 e+0 S2 A16]) (nil))) (insn 39 13 15 4 (set (reg:SI 0 ax) (reg:SI 1 dx [orig:97 D.1782 ] [97])) pr59747.c:18 -1 (nil)) (insn 15 39 18 4 (set (mem/c:SI (symbol_ref:DI ("d") <var_decl 0x7f76d96ba1c8 d>) [2 d+0 S4 A32]) (reg:SI 1 dx [orig:97 D.1782 ] [97])) pr59747.c:18 90 {*movsi_internal} (nil)) which is wrong, insn 39 move would need to be performed in DImode rather than SImode. Or alternatively in this case if insn 13 set DImode %rax as it used to do, it would be sufficient to do a SImode %edx = %eax move in insn 39. Jeff, can you please have a look?