Index: llvm/trunk/lib/Transforms/Scalar/ADCE.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/ADCE.cpp +++ llvm/trunk/lib/Transforms/Scalar/ADCE.cpp @@ -116,7 +116,7 @@ // ADCE does not use DominatorTree per se, but it updates it to preserve the // analysis. - DominatorTree &DT; + DominatorTree *DT; PostDominatorTree &PDT; /// Mapping of blocks to associated information, an element in BlockInfoVec. @@ -191,7 +191,7 @@ void makeUnconditional(BasicBlock *BB, BasicBlock *Target); public: - AggressiveDeadCodeElimination(Function &F, DominatorTree &DT, + AggressiveDeadCodeElimination(Function &F, DominatorTree *DT, PostDominatorTree &PDT) : F(F), DT(DT), PDT(PDT) {} @@ -615,7 +615,7 @@ } } - DomTreeUpdater(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager) + DomTreeUpdater(DT, &PDT, DomTreeUpdater::UpdateStrategy::Eager) .applyUpdates(DeletedEdges); NumBranchesRemoved += 1; @@ -672,7 +672,9 @@ // //===----------------------------------------------------------------------===// PreservedAnalyses ADCEPass::run(Function &F, FunctionAnalysisManager &FAM) { - auto &DT = FAM.getResult(F); + // ADCE does not need DominatorTree, but require DominatorTree here + // to update analysis if it is already available. + auto *DT = FAM.getCachedResult(F); auto &PDT = FAM.getResult(F); if (!AggressiveDeadCodeElimination(F, DT, PDT).performDeadCodeElimination()) return PreservedAnalyses::all(); @@ -698,15 +700,16 @@ if (skipFunction(F)) return false; - auto &DT = getAnalysis().getDomTree(); + // ADCE does not need DominatorTree, but require DominatorTree here + // to update analysis if it is already available. + auto *DTWP = getAnalysisIfAvailable(); + auto *DT = DTWP ? &DTWP->getDomTree() : nullptr; auto &PDT = getAnalysis().getPostDomTree(); return AggressiveDeadCodeElimination(F, DT, PDT) .performDeadCodeElimination(); } void getAnalysisUsage(AnalysisUsage &AU) const override { - // We require DominatorTree here only to update and thus preserve it. - AU.addRequired(); AU.addRequired(); if (!RemoveControlFlowFlag) AU.setPreservesCFG(); @@ -724,7 +727,6 @@ INITIALIZE_PASS_BEGIN(ADCELegacyPass, "adce", "Aggressive Dead Code Elimination", false, false) -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass) INITIALIZE_PASS_END(ADCELegacyPass, "adce", "Aggressive Dead Code Elimination", false, false) Index: llvm/trunk/test/Transforms/LoopRotate/pr35210.ll =================================================================== --- llvm/trunk/test/Transforms/LoopRotate/pr35210.ll +++ llvm/trunk/test/Transforms/LoopRotate/pr35210.ll @@ -6,12 +6,12 @@ ; CHECK: Starting llvm::Function pass manager run. ; CHECK-NEXT: Running pass: ADCEPass on f -; CHECK-NEXT: Running analysis: DominatorTreeAnalysis on f ; CHECK-NEXT: Running analysis: PostDominatorTreeAnalysis on f ; CHECK-NEXT: Running pass: FunctionToLoopPassAdaptor{{.*}} on f ; CHECK-NEXT: Starting llvm::Function pass manager run. ; CHECK-NEXT: Running pass: LoopSimplifyPass on f ; CHECK-NEXT: Running analysis: LoopAnalysis on f +; CHECK-NEXT: Running analysis: DominatorTreeAnalysis on f ; CHECK-NEXT: Running analysis: AssumptionAnalysis on f ; CHECK-NEXT: Running pass: LCSSAPass on f ; CHECK-NEXT: Finished llvm::Function pass manager run.