[Bug tree-optimization/59747] [4.9 Regression] wrong code at -Os and above on x86_64-linux-gnu in 64-bit mode
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jan 10 11:08:00 GMT 2014
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?
More information about the Gcc-bugs
mailing list