diff --git a/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp b/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp --- a/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp +++ b/llvm/lib/Analysis/LazyBlockFrequencyInfo.cpp @@ -45,8 +45,8 @@ // We require DT so it's available when LI is available. The LI updating code // asserts that DT is also present so if we don't make sure that we have DT // here, that assert will trigger. - AU.addRequired(); - AU.addRequired(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); AU.setPreservesAll(); } @@ -61,8 +61,8 @@ void LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AnalysisUsage &AU) { LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU); - AU.addRequired(); - AU.addRequired(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); } void llvm::initializeLazyBFIPassPass(PassRegistry &Registry) { diff --git a/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp b/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp --- a/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp +++ b/llvm/lib/Analysis/LazyBranchProbabilityInfo.cpp @@ -46,9 +46,9 @@ // We require DT so it's available when LI is available. The LI updating code // asserts that DT is also present so if we don't make sure that we have DT // here, that assert will trigger. - AU.addRequired(); - AU.addRequired(); - AU.addRequired(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); AU.setPreservesAll(); } @@ -63,9 +63,9 @@ } void LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AnalysisUsage &AU) { - AU.addRequired(); - AU.addRequired(); - AU.addRequired(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); } void llvm::initializeLazyBPIPassPass(PassRegistry &Registry) { diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -2281,12 +2281,12 @@ } void LoopAccessLegacyAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequired(); - AU.addRequired(); - AU.addRequired(); - AU.addRequired(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); - AU.setPreservesAll(); + AU.setPreservesAll(); } char LoopAccessLegacyAnalysis::ID = 0; diff --git a/llvm/test/Other/pr49950.ll b/llvm/test/Other/pr49950.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Other/pr49950.ll @@ -0,0 +1,78 @@ +; RUN: opt < %s -o /dev/null -enable-new-pm=0 -block-freq -opt-remark-emitter -memoryssa -inject-tli-mappings -pgo-memop-opt -verify-loop-info -debug-pass=Details 2>&1 | FileCheck %s + +; REQUIRES: asserts + +; This is a heavily reduced reproducer for the problem found in +; https://bugs.llvm.org/show_bug.cgi?id=49950 when doing fuzzy +; testing (including non-standard pipelines). +; +; The problem manifested as having a pass structure like this +; when it failed (as given by using -debug-pass=Details): +; +; Target Library Information +; Target Transform Information +; Profile summary info +; Assumption Cache Tracker +; ModulePass Manager +; FunctionPass Manager +; Dominator Tree Construction +; Natural Loop Information +; Post-Dominator Tree Construction +; Branch Probability Analysis +; Block Frequency Analysis +; -- Branch Probability Analysis +; Lazy Branch Probability Analysis +; Lazy Block Frequency Analysis +; Optimization Remark Emitter +; Basic Alias Analysis (stateless AA impl) +; Function Alias Analysis Results +; Memory SSA +; -- Dominator Tree Construction +; -- Function Alias Analysis Results +; -- Basic Alias Analysis (stateless AA impl) +; -- Memory SSA +; Inject TLI Mappings +; -- Inject TLI Mappings +; PGOMemOPSize +; -- Block Frequency Analysis +; -- Post-Dominator Tree Construction +; -- Optimization Remark Emitter +; -- Lazy Branch Probability Analysis +; -- Natural Loop Information +; -- Lazy Block Frequency Analysis +; -- PGOMemOPSize +; Module Verifier +; -- Module Verifier +; -- Target Library Information +; -- Profile summary info +; -- Assumption Cache Tracker +; Bitcode Writer +; -- Bitcode Writer +; +; One might notice that "Dominator Tree Construction" is dropped after +; "Memory SSA", while for example "Natural Loop Information" stick around +; a bit longer. This despite "Dominator Tree Construction" being transitively +; required by "Natural Loop Information". +; The end result was that we got crashes when doing verification of loop +; info after "Inject TLI Mappings" (since the dominator tree had been +; removed too early). + +; Verify that both domintator tree and loop info are kept until after +; PGOMemOPSize: +; +; CHECK: Dominator Tree Construction +; CHECK-NOT: -- Dominator Tree Construction +; CHECK: Memory SSA +; CHECK-NOT: -- Dominator Tree Construction +; CHECK: Inject TLI Mappings +; CHECK-NOT: -- Dominator Tree Construction +; CHECK: PGOMemOPSize +; CHECK-DAG: -- Dominator Tree Construction +; CHECK-DAG: -- Natural Loop Information +; CHECK-DAG: -- PGOMemOPSize +; CHECK: Bitcode Writer + +define void @foo() { +entry: + ret void +} \ No newline at end of file