[LLVMdev] Construction of SCEVAddRecExpr

Nick Lewycky nicholas at mxc.ca
Tue Apr 1 00:20:44 PDT 2014


Beckert Frey wrote:
> Hello,
>
> I'm studying how the SCEV analyzis works and how to use it and I could
> not create an example where the SCEV analyzis identifies an expression
> as "SCEVAddRecExpr".
>
> Aren't the expressions below the kind of pattern that should be
> represented as a "AddRecExpr" ?
>
> SCEV: (1 + (2 * %3)
> or
> SCEV: (%1 + (2 * %3)
> or
> SCEV: (%1 + (%2 * %3)

You want a PHI node. It's not an add recurrence unless it's making a 
trip around the loop.

Take a look at test/Analysis/ScalarEvolution/trip-count.ll :

$ opt -analyze -scalar-evolution trip-count.ll
Printing analysis 'Scalar Evolution Analysis' for function 'test':
Classifying expressions for: @test
   %tmp = getelementptr [1000 x i32]* @A, i32 0, i32 %i.0
   -->  {@A,+,sizeof(i32)}<%bb3>         Exits: ((10000 * sizeof(i32)) + @A)
   %tmp2 = add i32 %i.0, 1
   -->  {1,+,1}<nw><%bb3>                Exits: 10001
   %i.0 = phi i32 [ 0, %entry ], [ %tmp2, %bb ]
   -->  {0,+,1}<nuw><%bb3>               Exits: 10000
Determining loop execution counts for: @test
Loop %bb3: backedge-taken count is 10000
Loop %bb3: max backedge-taken count is 10000


> In my experiments they are always recognized as just "AddExpr" (not
> *Rec*). Can someone help me on this? What I'm misunderstanding here?
>
> I'm using the attached code to perform my experiments and this example
> as test input:
>
> int main() {
> int vet1[100], i=0;
>
> for (i=0; i<10; i++) {
> vet1[3*i + 2] = vet1[i];
> }
>
> return 0;
> }

Remember that SCEV runs on IR not C. If you want to discuss what C code 
you're running SCEV over, we need to talk about how you've transformed 
this C into IR. For instance, if you built that with clang -O0 then ran 
SCEV over that it won't work at all because SCEV assumes some basic 
optimizations have already been performed (ie., it works on 
canonicalized IR and doesn't try to replicate the work of other 
optimizations. That would be outside its scope.)

Nick



More information about the llvm-dev mailing list