Index: llvm/trunk/include/llvm/Analysis/PostDominators.h =================================================================== --- llvm/trunk/include/llvm/Analysis/PostDominators.h +++ llvm/trunk/include/llvm/Analysis/PostDominators.h @@ -30,6 +30,8 @@ public: using Base = PostDomTreeBase; + PostDominatorTree() = default; + explicit PostDominatorTree(Function &F) { recalculate(F); } /// Handle invalidation explicitly. bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &); Index: llvm/trunk/lib/Analysis/PostDominators.cpp =================================================================== --- llvm/trunk/lib/Analysis/PostDominators.cpp +++ llvm/trunk/lib/Analysis/PostDominators.cpp @@ -69,8 +69,7 @@ PostDominatorTree PostDominatorTreeAnalysis::run(Function &F, FunctionAnalysisManager &) { - PostDominatorTree PDT; - PDT.recalculate(F); + PostDominatorTree PDT(F); return PDT; } Index: llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp +++ llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp @@ -37,6 +37,7 @@ #include "llvm/Analysis/InlineCost.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/OptimizationRemarkEmitter.h" +#include "llvm/Analysis/PostDominators.h" #include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/IR/BasicBlock.h" @@ -253,7 +254,7 @@ /// Dominance, post-dominance and loop information. std::unique_ptr DT; - std::unique_ptr> PDT; + std::unique_ptr PDT; std::unique_ptr LI; std::function GetAC; @@ -1365,8 +1366,7 @@ DT.reset(new DominatorTree); DT->recalculate(F); - PDT.reset(new PostDomTreeBase()); - PDT->recalculate(F); + PDT.reset(new PostDominatorTree(F)); LI.reset(new LoopInfo); LI->analyze(*DT); Index: llvm/trunk/unittests/IR/DominatorTreeBatchUpdatesTest.cpp =================================================================== --- llvm/trunk/unittests/IR/DominatorTreeBatchUpdatesTest.cpp +++ llvm/trunk/unittests/IR/DominatorTreeBatchUpdatesTest.cpp @@ -22,13 +22,10 @@ const auto CFGInsert = CFGBuilder::ActionKind::Insert; const auto CFGDelete = CFGBuilder::ActionKind::Delete; -struct PostDomTree : PostDomTreeBase { - PostDomTree(Function &F) { recalculate(F); } -}; using DomUpdate = DominatorTree::UpdateType; static_assert( - std::is_same::value, + std::is_same::value, "Trees differing only in IsPostDom should have the same update types"); using DomSNCA = DomTreeBuilder::SemiNCAInfo; using PostDomSNCA = DomTreeBuilder::SemiNCAInfo; @@ -100,7 +97,7 @@ DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); BasicBlock *B = Builder.getOrAddBlock("B"); @@ -122,7 +119,7 @@ DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); BasicBlock *B = Builder.getOrAddBlock("B"); @@ -148,7 +145,7 @@ DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); BasicBlock *B = Builder.getOrAddBlock("B"); @@ -181,7 +178,7 @@ DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); auto Updates = ToDomUpdates(Builder, CFGUpdates); @@ -212,7 +209,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); while (B.applyUpdate()) @@ -245,7 +242,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); while (B.applyUpdate()) @@ -278,7 +275,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); while (B.applyUpdate()) @@ -311,7 +308,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); while (B.applyUpdate()) @@ -341,7 +338,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); while (B.applyUpdate()) Index: llvm/trunk/unittests/IR/DominatorTreeTest.cpp =================================================================== --- llvm/trunk/unittests/IR/DominatorTreeTest.cpp +++ llvm/trunk/unittests/IR/DominatorTreeTest.cpp @@ -22,19 +22,17 @@ using namespace llvm; -struct PostDomTree : PostDomTreeBase { - PostDomTree(Function &F) { recalculate(F); } -}; /// Build the dominator tree for the function and run the Test. static void runWithDomTree( Module &M, StringRef FuncName, - function_ref Test) { + function_ref + Test) { auto *F = M.getFunction(FuncName); ASSERT_NE(F, nullptr) << "Could not find " << FuncName; // Compute the dominator tree for the function. DominatorTree DT(*F); - PostDomTree PDT(*F); + PostDominatorTree PDT(*F); Test(*F, &DT, &PDT); } @@ -76,7 +74,7 @@ std::unique_ptr M = makeLLVMModule(Context, ModuleString); runWithDomTree( - *M, "f", [&](Function &F, DominatorTree *DT, PostDomTree *PDT) { + *M, "f", [&](Function &F, DominatorTree *DT, PostDominatorTree *PDT) { Function::iterator FI = F.begin(); BasicBlock *BB0 = &*FI++; @@ -296,7 +294,7 @@ std::unique_ptr M = makeLLVMModule(Context, ModuleString); runWithDomTree( - *M, "f", [&](Function &F, DominatorTree *DT, PostDomTree *PDT) { + *M, "f", [&](Function &F, DominatorTree *DT, PostDominatorTree *PDT) { Function::iterator FI = F.begin(); BasicBlock *BB0 = &*FI++; @@ -360,7 +358,7 @@ // unreachable Exit // // Both the blocks that end with ret and with unreachable become trivial -// PostDomTree roots, as they have no successors. +// PostDominatorTree roots, as they have no successors. // TEST(DominatorTree, DeletingEdgesIntroducesUnreachables) { StringRef ModuleString = @@ -380,7 +378,7 @@ std::unique_ptr M = makeLLVMModule(Context, ModuleString); runWithDomTree( - *M, "f", [&](Function &F, DominatorTree *DT, PostDomTree *PDT) { + *M, "f", [&](Function &F, DominatorTree *DT, PostDominatorTree *PDT) { Function::iterator FI = F.begin(); FI++; @@ -407,7 +405,7 @@ DominatorTree NDT(F); EXPECT_EQ(DT->compare(NDT), 0); - PostDomTree NPDT(F); + PostDominatorTree NPDT(F); EXPECT_EQ(PDT->compare(NPDT), 0); }); } @@ -474,7 +472,7 @@ std::unique_ptr M = makeLLVMModule(Context, ModuleString); runWithDomTree( - *M, "f", [&](Function &F, DominatorTree *DT, PostDomTree *PDT) { + *M, "f", [&](Function &F, DominatorTree *DT, PostDominatorTree *PDT) { Function::iterator FI = F.begin(); FI++; @@ -499,7 +497,7 @@ DominatorTree NDT(F); EXPECT_EQ(DT->compare(NDT), 0); - PostDomTree NPDT(F); + PostDominatorTree NPDT(F); EXPECT_EQ(PDT->compare(NPDT), 0); }); } @@ -563,7 +561,7 @@ std::unique_ptr M = makeLLVMModule(Context, ModuleString); runWithDomTree( - *M, "f", [&](Function &F, DominatorTree *DT, PostDomTree *PDT) { + *M, "f", [&](Function &F, DominatorTree *DT, PostDominatorTree *PDT) { Function::iterator FI = F.begin(); FI++; @@ -594,7 +592,7 @@ DominatorTree NDT(F); EXPECT_EQ(DT->compare(NDT), 0); - PostDomTree NPDT(F); + PostDominatorTree NPDT(F); EXPECT_EQ(PDT->compare(NPDT), 0); }); } @@ -637,7 +635,7 @@ std::unique_ptr M = makeLLVMModule(Context, ModuleString); runWithDomTree( - *M, "f", [&](Function &F, DominatorTree *DT, PostDomTree *PDT) { + *M, "f", [&](Function &F, DominatorTree *DT, PostDominatorTree *PDT) { Function::iterator FI = F.begin(); BasicBlock *A = &*FI++; @@ -691,7 +689,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -717,7 +715,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate = B.applyUpdate(); @@ -745,7 +743,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -766,7 +764,7 @@ std::vector Updates = {{Insert, {"3", "5"}}}; CFGBuilder B(Holder.F, Arcs, Updates); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate = B.applyUpdate(); @@ -794,7 +792,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -824,7 +822,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -851,7 +849,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -877,7 +875,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -907,7 +905,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate; @@ -945,7 +943,7 @@ CFGBuilder B(Holder.F, Arcs, Updates); DominatorTree DT(*Holder.F); EXPECT_TRUE(DT.verify()); - PostDomTree PDT(*Holder.F); + PostDominatorTree PDT(*Holder.F); EXPECT_TRUE(PDT.verify()); Optional LastUpdate;