Index: llvm/trunk/include/llvm/Analysis/AssumptionCache.h =================================================================== --- llvm/trunk/include/llvm/Analysis/AssumptionCache.h +++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h @@ -202,7 +202,10 @@ AssumptionCacheTracker(); ~AssumptionCacheTracker() override; - void releaseMemory() override { AssumptionCaches.shrink_and_clear(); } + void releaseMemory() override { + verifyAnalysis(); + AssumptionCaches.shrink_and_clear(); + } void verifyAnalysis() const override; bool doFinalization(Module &) override { Index: llvm/trunk/lib/Analysis/AssumptionCache.cpp =================================================================== --- llvm/trunk/lib/Analysis/AssumptionCache.cpp +++ llvm/trunk/lib/Analysis/AssumptionCache.cpp @@ -24,6 +24,11 @@ using namespace llvm; using namespace llvm::PatternMatch; +static cl::opt + VerifyAssumptionCache("verify-assumption-cache", cl::Hidden, + cl::desc("Enable verification of assumption cache"), + cl::init(false)); + SmallVector &AssumptionCache::getOrInsertAffectedValues(Value *V) { // Try using find_as first to avoid creating extra value handles just for the // purpose of doing the lookup. @@ -231,7 +236,13 @@ } void AssumptionCacheTracker::verifyAnalysis() const { -#ifndef NDEBUG + // FIXME: In the long term the verifier should not be controllable with a + // flag. We should either fix all passes to correctly update the assumption + // cache and enable the verifier unconditionally or somehow arrange for the + // assumption list to be updated automatically by passes. + if (!VerifyAssumptionCache) + return; + SmallPtrSet AssumptionSet; for (const auto &I : AssumptionCaches) { for (auto &VH : I.second->assumptions()) @@ -240,11 +251,10 @@ for (const BasicBlock &B : cast(*I.first)) for (const Instruction &II : B) - if (match(&II, m_Intrinsic())) - assert(AssumptionSet.count(cast(&II)) && - "Assumption in scanned function not in cache"); + if (match(&II, m_Intrinsic()) && + !AssumptionSet.count(cast(&II))) + report_fatal_error("Assumption in scanned function not in cache"); } -#endif } AssumptionCacheTracker::AssumptionCacheTracker() : ImmutablePass(ID) { Index: llvm/trunk/test/Transforms/SimplifyCFG/critedge-assume.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/critedge-assume.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/critedge-assume.ll @@ -1,4 +1,4 @@ -; RUN: opt -o %t %s -instcombine -simplifycfg -thinlto-bc +; RUN: opt -o %t %s -instcombine -simplifycfg -thinlto-bc -verify-assumption-cache ; RUN: llvm-dis -o - %t | FileCheck %s ; Test that the simplifycfg pass correctly updates the assumption cache