[LLVMdev] ScalarEvolution::getSVECAtScope
Thomas Jablin
tjablin at cs.princeton.edu
Sat Apr 30 17:14:16 PDT 2011
Hi,
Is it valid to query ScalarEvolution::getSCEVAtScope with a Value
which is an Instruction inside the provided Loop? If so, I believe
there is a bug in computeSCEVAtScope. Specifically:
04716 // If the scope is outside the addrec's loop, evaluate it by using the
04717 // loop exit value of the addrec.
04718 if (!AddRec->getLoop()->contains(L)) {
04719 // To evaluate this recurrence, we need to know how many
times the AddRec
04720 // loop iterates. Compute this now.
04721 const SCEV *BackedgeTakenCount =
getBackedgeTakenCount(AddRec->getLoop());
04722 if (BackedgeTakenCount == getCouldNotCompute()) return AddRec;
04723
04724 // Then, evaluate the AddRec.
04725 return AddRec->evaluateAtIteration(BackedgeTakenCount, *this);
04726 }
The guard checks that !AddRec->getLoop()->contains(L), but not
!L->contains(AddRec->getLoop()).
Consequently, if getSCEVAtScope is called with GetElementPtrInst and a
Loop that contains it indirectly, the SCEV will be evaluated with
respect to the end of the inner Loop. For example:
L1 for(i to N)
L2 for(j to N)
arrayidx = gep A, 0, j, i
getSCEVAtScope(arrayIdx, L1) will evaluate j as N.
If it is valid to call getSCEVAtScope with an outer loop, I believe
the guard should be:
04718 if (!AddRec->getLoop()->contains(L) &&
!L->contains(AddRec->getLoop())) {
If it is not valid, an assertion might be helpful.
Tom
More information about the llvm-dev
mailing list