diff --git a/llvm/include/llvm/Analysis/IVDescriptors.h b/llvm/include/llvm/Analysis/IVDescriptors.h --- a/llvm/include/llvm/Analysis/IVDescriptors.h +++ b/llvm/include/llvm/Analysis/IVDescriptors.h @@ -322,7 +322,9 @@ /// Returns true if \p Phi is an induction in the loop \p L. If \p Phi is an /// induction, the induction descriptor \p D will contain the data describing - /// this induction. If by some other means the caller has a better SCEV + /// this induction. Since Induction Phis can only be present inside loop + /// headers, the function will assert if it is passed a Phi whose parent is + /// not the loop header. If by some other means the caller has a better SCEV /// expression for \p Phi than the one returned by the ScalarEvolution /// analysis, it can be passed through \p Expr. If the def-use chain /// associated with the phi includes casts (that we know we can ignore diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp --- a/llvm/lib/Analysis/IVDescriptors.cpp +++ b/llvm/lib/Analysis/IVDescriptors.cpp @@ -1484,6 +1484,12 @@ return false; } + // This function assumes that InductionPhi is called only on Phi nodes + // present inside loop headers. Check for the same, and throw an assert if + // the current Phi is not present inside the loop header. + assert(Phi->getParent() == AR->getLoop()->getHeader() + && "Invalid Phi node, not present in loop header"); + Value *StartValue = Phi->getIncomingValueForBlock(AR->getLoop()->getLoopPreheader());