https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87913
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Target| |x86_64-*-*, i?86-*-*
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-11-07
Component|tree-optimization |target
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed. For f we fail to detect the max() operation at the tree level
because the test is using != 0 instead of < 1.
f (unsigned int num)
{
unsigned int iftmp.0_1;
<bb 2> [local count: 1073741825]:
if (num_2(D) != 0)
goto <bb 4>; [50.00%]
else
goto <bb 3>; [50.00%]
<bb 3> [local count: 536870913]:
<bb 4> [local count: 1073741825]:
# iftmp.0_1 = PHI <num_2(D)(2), 1(3)>
return iftmp.0_1;
g is represented as
g (unsigned int num)
{
_Bool _1;
unsigned int _2;
unsigned int _4;
<bb 2> [local count: 1073741825]:
_1 = num_3(D) == 0;
_2 = (unsigned int) _1;
_4 = _2 + num_3(D);
return _4;
expanded to (after combine)
(insn 6 3 7 2 (set (reg:CCZ 17 flags)
(compare:CCZ (reg/v:SI 85 [ num ])
(const_int 0 [0]))) "/tmp/t.c":13:16 7 {*cmpsi_ccno_1}
(nil))
(insn 8 7 9 2 (set (reg:SI 87)
(eq:SI (reg:CCZ 17 flags)
(const_int 0 [0]))) "/tmp/t.c":13:16 652 {*setcc_si_1_movzbl}
(insn 9 8 14 2 (parallel [
(set (reg:SI 86)
(plus:SI (reg:SI 87)
(reg/v:SI 85 [ num ])))
(clobber (reg:CC 17 flags))
]) "/tmp/t.c":13:14 190 {*addsi_1}
that's a target missed optimization. I'll fix the MIN/MAX detection
and thus make this issue a target one.