[Bug tree-optimization/26939] loop number of iterations analysis not working

rguenth at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Sun Feb 8 14:45:00 GMT 2009



------- Comment #17 from rguenth at gcc dot gnu dot org  2009-02-08 14:45 -------
The situation is still worse than originally reported.  Even without PRE we
have

Analyzing # of iterations of loop 2
  exit condition [1, + , 1] <= i1_6(D)
  bounds on difference of bases: -1 ... 2147483646
  result:
    under assumptions i1_6(D) != 2147483647
    # of iterations (unsigned int) i1_6(D), bounded by 2147483647
  (set_nb_iterations_in_loop = scev_not_known))

for the inner loop which is just

<bb 4>:

<bb 5>:
  # i_13 = PHI <i_8(4), 0(9)>
  D.1244_7 = j_10 + 1;
  bar (D.1244_7);
  i_8 = i_13 + 1;
  if (i1_6(D) >= i_8)
    goto <bb 4>;
  else
    goto <bb 6>;

...
<bb 8>:
  # j_10 = PHI <j_9(7), 0(3)>
  if (i1_6(D) >= 0)
    goto <bb 9>;
  else
    goto <bb 6>;

<bb 9>:
  goto <bb 5>;


which means we cannot prove that with i_8 = {1, +, 1}_2 the loop
runs at least once if only i1_6 >= 0 is known (remember its the number
of latch executions that are counted).

Smaller testcase:

void bar();
void foo(int i1)
{
  int i;

  for (i=0; i<=i1; ++i)
    bar();
}

It "works" once you change the loop exit condition to i < i1.  Same effects
with unsigned variables (adjust the lower bound to sth like 2 to avoid ill
effects).

I changed the Summary to what is more appropriate.


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rakdver at gcc dot gnu dot
                   |                            |org
             Status|WAITING                     |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2009-02-08 14:45:08
               date|                            |
            Summary|loop number of iterations   |loop number of iterations
                   |analysis confused by what   |analysis not working
                   |PRE did (PRE is doing its   |
                   |job)                        |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26939



More information about the Gcc-bugs mailing list