[Bug rtl-optimization/106032] [12/13 Regression] wrong code at -Os and above on x86_64-linux-gnu
pinskia at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Jun 19 21:04:37 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106032
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Component|tree-optimization |rtl-optimization
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
The tree level looks ok. THe only difference is 12/13 has:
if (c.0_1 < 0)
goto <bb 3>; [67.00%]
else
goto <bb 4>; [33.00%]
<bb 3> [local count: 679839639]:
e_15 = *d.1_2;
<bb 4> [local count: 59055800]:
While 11 does:
if (c.0_1 < 0)
goto <bb 3>; [67.00%]
else
goto <bb 4>; [33.00%]
<bb 3> [local count: 679839639]:
d.1_2 = d;
e_15 = *d.1_2;
<bb 4> [local count: 59055800]:
That is the load from the global d is now unconditional but the load from *d is
still conditional.
I see ce2 is doing ifcvt on that and changing it to be an unconditional load.
IF-THEN-JOIN block found, pass 1, test 3, then 4, join 5
(insn 57 56 58 2 (parallel [
(set (reg:SI 89)
(ashiftrt:SI (reg:SI 90 [ c ])
(const_int 31 [0x1f])))
(clobber (reg:CC 17 flags))
]) "/app/example.cpp":7:9 758 {ashrsi3_cvt}
(expr_list:REG_DEAD (reg:SI 90 [ c ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(expr_list:REG_EQUAL (ashiftrt:SI (mem/c:SI (symbol_ref:DI ("c")
[flags 0x2] <var_decl 0x7ff174377d80 c>) [1 c+0 S4 A32])
(const_int 31 [0x1f]))
(nil)))))
(insn 58 57 16 2 (parallel [
(set (reg:SI 91)
(and:SI (reg:SI 89)
(mem:SI (reg/f:DI 83 [ d.1_2 ]) [1 *d.1_2+0 S4 A32])))
(clobber (reg:CC 17 flags))
]) "/app/example.cpp":7:9 533 {*andsi_1}
(expr_list:REG_DEAD (reg:SI 89)
(expr_list:REG_DEAD (reg/f:DI 83 [ d.1_2 ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil)))))
More information about the Gcc-bugs
mailing list