[Bug tree-optimization/101291] turns infinite loop into finite
guojiufu at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jul 2 09:00:57 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101291
--- Comment #7 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
When generates doloop.xxx in ivopts, gimple looks like:
<bb 13> [local count: 21023864]:
_38 = val_4(D) - start_3(D);
_29 = _38 / 16;
doloop.15_35 = _29 + 1;
<bb 9> [local count: 191126041]:
# cnt_17 = PHI <0(13), cnt_19(10)>
# doloop.15_28 = PHI <doloop.15_35(13), doloop.15_23(10)>
cnt_19 = cnt_17 + 1;
doloop.15_23 = doloop.15_28 - 1;
if (doloop.15_23 != 0)
goto <bb 10>; [89.00%]
else
goto <bb 8>; [11.00%]
<bb 10> [local count: 170102176]:
goto <bb 9>; [100.00%]
Before it
<bb 13> [local count: 21023864]:
<bb 9> [local count: 191126041]:
# cnt_17 = PHI <0(13), cnt_19(10)>
# i_18 = PHI <start_3(D)(13), i_20(10)>
cnt_19 = cnt_17 + 1;
i_20 = i_18 + 16;
if (val_4(D) >= i_20)
goto <bb 10>; [89.00%]
else
goto <bb 8>; [11.00%]
<bb 10> [local count: 170102176]:
goto <bb 9>; [100.00%]
<bb 4> [local count: 118111600]:
# cnt_11 = PHI <cnt_2(8), 0(2)>
return cnt_11;
-------
In number_of_iterations_exit_assumptions, there is code:
if (!integer_zerop (niter->assumptions)
&& loop_constraint_set_p (loop, LOOP_C_FINITE))
niter->assumptions = boolean_true_node;
At here niter->assumptions was reset to true. And then doloop.xx is generated
as if niter is always ok.
More information about the Gcc-bugs
mailing list