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.