[Bug tree-optimization/70546] ifconvert if(cond) ++count; to count += cond; fails because of mergephi and failed loop header copying
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 5 10:31:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70546
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-04-05
Summary|ifconvert if(cond) ++count; |ifconvert if(cond) ++count;
|to count += cond; |to count += cond; fails
| |because of mergephi and
| |failed loop header copying
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
I think the issue is that the increment of n is in the latch block and that
we didn't properly copy the loop header:
;; Function int f0() (_Z2f0v, funcdef_no=3715, decl_uid=71164, cgraph_uid=957,
symbol_order=963)
fix_loop_structure: fixing up loops for function
Disambiguating loop 1 with multiple latches
Merged latch edges of loop 1
It is mergephi that merges the header and latch PHIs:
<bb 3>:
# n_1 = PHI <0(2), n_2(6)>
# i_3 = PHI <1(2), _22(6)>
_8 = (long unsigned int) i_3;
_33 = MEM[(int * *)&v];
...
if (_29 != 0)
goto <bb 5>;
else
goto <bb 6>;
<bb 5>:
n_30 = n_1 + 1;
<bb 6>:
# n_2 = PHI <n_1(4), n_30(5)>
goto <bb 3>;
to
<bb 3>:
# n_1 = PHI <0(2), n_30(5), n_1(4)>
# i_3 = PHI <1(2), _22(5), _22(4)>
_8 = (long unsigned int) i_3;
...
if (_29 != 0)
goto <bb 5>;
else
goto <bb 3>;
<bb 5>:
n_30 = n_1 + 1;
goto <bb 3>;
creating multiple latches. We still fail to copy loop headers properly
for -fdisable-tree-mergephi[123] though.
So the issues are elsewhere and tree ifcvt should handle this fine
already.
More information about the Gcc-bugs
mailing list