[LLVMdev] getSmallConstantTripCount function doesn't work for obvious cases

Eli Friedman eli.friedman at gmail.com
Tue Jan 17 19:28:25 PST 2012


On Tue, Jan 17, 2012 at 6:30 PM, Bo Wu <wubousc at gmail.com> wrote:
> Hi,
>
> My pass heavily relies on llvm::Loop's getSmallConstantTripCount method.
> However, I found that it doesn't work for some simple cases.
>
> In the following example, I can get the constant trip count of the outermost
> loop if statement "a[l] = a[l] + 1" is there. After commenting out this
> line, the returned constant trip count for that loop is 0. In my pass, I
> traverse the nested loops starting from statement "a[i] = b[i] * b[i+1]; ",
> and use a for loop to traverse each parent loop.
>
> void f(int *a, int b[], double *c, int n)
> {
>   int i,j,k,l;
>   if(n>20)
>     a[j] = 4;
>   else {
>     for(l=0; l<200; ++l) {
>       a[l] = a[l] + 1; //if remove this line, the above loop's trip count
> can not be obtained.
>       if(b[1]>30) {
>         c[k] = c[k] * c[k+1];
>       }
>       else {
>         for(k=0; k<400;++k) {
>           for(i=0; i<400; ++i) {
>             a[i] = b[i] * b[i+1]; // nested loop traversal starts here.
>           }
>         }
>       }
>     }
>   }
> }
>
> As long as statement "a[l] = a[l] + 1;" is in the outermost loop body, the
> trip count can be obtained. Is there a way to get the constant trip count of
> a loop in similar cases, even if the induction variable is not used in the
> loop body?

It's usually better to give IR testcases, but I'll assume you ran the
equivalent of clang -O2 over it on some 64-bit platform.

It looks like a missed optimization is causing the tail of the loop to
end up in a strange form:

for.inc29:                                        ; preds =
%for.inc26, %if.then4
  %exitcond38 = icmp eq i32 %l.036, 200
  br i1 %exitcond38, label %if.end32, label %for.inc29.for.body_crit_edge

for.inc29.for.body_crit_edge:                     ; preds = %for.inc29
  %phitmp = add i32 %l.036, 1
  br label %for.body

getSmallConstantTripCount doesn't know how to deal with this, so it
fails.  Depending on what you're doing, I'd suggest using SCEV, which
is a bit more powerful and can partially analyze this loop.

-Eli




More information about the llvm-dev mailing list