https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113134

--- Comment #21 from JuzheZhong <juzhe.zhong at rivai dot ai> ---
Hi, Richard. I looked into ivcanon.

I found that:

      /* If the loop has more than one exit, try checking all of them
         for # of iterations determinable through scev.  */
      if (!exit)
        niter = find_loop_niter (loop, &exit);

In find_loop_niter, we iterate 2 exit edges:

1. bb 5 -> bb 6 with niter = (unsigned int) N_13(D).
2. bb 3 -> bb 6 with niter = 1001.

It just skip niter = (unsigned int) N_13(D) in:
      if (!integer_zerop (desc.may_be_zero))
        continue;

find_loop_niter (loop, &exit) return 1001 with skipping  (unsigned int)
N_13(D).

Should it return MIN (1001, (unsigned int) N_13(D)).

I prefer fix it in ivcanon since I believe it would be more elegant than fix it
in loop splitter.

I am still investigating, any guides will be really appreciated.

Thanks.

Reply via email to