[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