Index: lib/Analysis/ScalarEvolution.cpp =================================================================== --- lib/Analysis/ScalarEvolution.cpp +++ lib/Analysis/ScalarEvolution.cpp @@ -112,6 +112,7 @@ #include "llvm/IR/Use.h" #include "llvm/IR/User.h" #include "llvm/IR/Value.h" +#include "llvm/IR/Verifier.h" #include "llvm/Pass.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" @@ -161,6 +162,10 @@ VerifySCEVMap("verify-scev-maps", cl::Hidden, cl::desc("Verify no dangling value in ScalarEvolution's " "ExprValueMap (slow)")); +static cl::opt VerifyIR( + "scalar-evolution-verify-ir", cl::Hidden, + cl::desc("Verify IR correctness when making sensitive SCEV queries (slow)"), + cl::init(false)); static cl::opt MulOpsInlineThreshold( "scev-mulops-inline-threshold", cl::Hidden, @@ -9375,6 +9380,11 @@ // (interprocedural conditions notwithstanding). if (!L) return true; + if (VerifyIR) + assert(!verifyFunction(*L->getHeader()->getParent(), &dbgs()) && + "This cannot be done on broken IR!"); + + if (isKnownViaNonRecursiveReasoning(Pred, LHS, RHS)) return true; @@ -9480,6 +9490,10 @@ // (interprocedural conditions notwithstanding). if (!L) return false; + if (VerifyIR) + assert(!verifyFunction(*L->getHeader()->getParent(), &dbgs()) && + "This cannot be done on broken IR!"); + // Both LHS and RHS must be available at loop entry. assert(isAvailableAtLoopEntry(LHS, L) && "LHS is not available at Loop Entry"); Index: unittests/Analysis/ScalarEvolutionTest.cpp =================================================================== --- unittests/Analysis/ScalarEvolutionTest.cpp +++ unittests/Analysis/ScalarEvolutionTest.cpp @@ -701,7 +701,7 @@ PN->addIncoming(Dec, IncBB); BranchInst::Create(CondBB, IncBB); - Accum = GetElementPtrInst::Create(I8Ty, Accum, Dec, "gep", EndBB); + Accum = GetElementPtrInst::Create(I8Ty, Accum, PN, "gep", EndBB); PrevBB = CondBB; CondBB = NextBB;