> Yes, the number of iterations of the i loop simply is too difficult for
> our loop iteration calculator to comprehend:
> 
>   for (i=k; i<500; i+=k)
> 
> iterates for roundup((500-k)/k) time.  In particular if the step is
> non-constant our nr-of-iteration calculator gives up.
> 

I'm trying to give an even smaller case,

int a[512] ;
int *a_p ;

int f(int k)
{
        int i ;

        for(i=0; i<k; i++)
        {
                a_p = &a[i] ;
                *a_p = 7 ;
        }
}

For this case, we have a very simple loop step "i++", then we would have the
GIMPLE before expand like below,

<bb 5>:
  # i_13 = PHI <i_6(5), 0(4)>
  # ivtmp.10_9 = PHI <ivtmp.10_1(5), ivtmp.10_15(4)>
  a_p_lsm.6_4 = &a[i_13];
  ivtmp.10_1 = ivtmp.10_9 + 4;
  D.4085_16 = (void *) ivtmp.10_1;
  MEM[base: D.4085_16, offset: 0B] = 7;
  i_6 = i_13 + 1;
  if (i_6 != k_3(D))
    goto <bb 5>;
  else
    goto <bb 6>;

<bb 6>:
  # a_p_lsm.6_11 = PHI <a_p_lsm.6_4(5)>
  a_p = a_p_lsm.6_11;
  goto <bb 3>;

Why can't we still sunk &a[i_13] out of loop? For example, I expect to
generate the code like below,

<bb 5>:
  # i_13 = PHI <i_6(5), 0(4)>
  # ivtmp.10_9 = PHI <ivtmp.10_1(5), ivtmp.10_15(4)>
  i_14 = i_13;
  ivtmp.10_1 = ivtmp.10_9 + 4;
  D.4085_16 = (void *) ivtmp.10_1;
  MEM[base: D.4085_16, offset: 0B] = 7;
  i_6 = i_13 + 1;
  if (i_6 != k_3(D))
    goto <bb 5>;
  else
    goto <bb 6>;

<bb 6>:
  # a_p_lsm.6_11 = PHI <a_p_lsm.6_4(5)>
  a_p_lsm.6_4 = &a[i_14];
  a_p = a_p_lsm.6_11;
  goto <bb 3>;

This way the computation of &a[i] would be saved within the loop. 

Any idea?

Thanks,
-Jiangning



Reply via email to