Index: llvm/include/llvm/Analysis/AssumptionCache.h =================================================================== --- llvm/include/llvm/Analysis/AssumptionCache.h +++ llvm/include/llvm/Analysis/AssumptionCache.h @@ -203,7 +203,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/lib/Analysis/AssumptionCache.cpp =================================================================== --- llvm/lib/Analysis/AssumptionCache.cpp +++ llvm/lib/Analysis/AssumptionCache.cpp @@ -24,6 +24,11 @@ using namespace llvm; using namespace llvm::PatternMatch; +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()) @@ -244,7 +255,6 @@ assert(AssumptionSet.count(cast(&II)) && "Assumption in scanned function not in cache"); } -#endif } AssumptionCacheTracker::AssumptionCacheTracker() : ImmutablePass(ID) { Index: llvm/test/Transforms/SimplifyCFG/critedge-assume.ll =================================================================== --- llvm/test/Transforms/SimplifyCFG/critedge-assume.ll +++ llvm/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