This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/59747] [4.9 Regression] wrong code at -Os and above on x86_64-linux-gnu in 64-bit mode


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?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]