diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-22 15:01:41 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-22 15:01:41 +0000 |
commit | 65b4ab9921364d27eb0c4704d8259b22b0cdc53e (patch) | |
tree | 6d5354819232d56e92c6c66c03e9d0acc15fdc8e /llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp | |
parent | 6083106b1216566f189ecb6e0ae0340b61c4254a (diff) | |
download | bcm5719-llvm-65b4ab9921364d27eb0c4704d8259b22b0cdc53e.tar.gz bcm5719-llvm-65b4ab9921364d27eb0c4704d8259b22b0cdc53e.zip |
BreakCriticalEdges: Update PostDominatorTree
llvm-svn: 354673
Diffstat (limited to 'llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp index 2944c372425..3b4b0b5de07 100644 --- a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp +++ b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -23,6 +23,7 @@ #include "llvm/Analysis/CFG.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/MemorySSAUpdater.h" +#include "llvm/Analysis/PostDominators.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Instructions.h" @@ -48,10 +49,14 @@ namespace { bool runOnFunction(Function &F) override { auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>(); auto *DT = DTWP ? &DTWP->getDomTree() : nullptr; + + auto *PDTWP = getAnalysisIfAvailable<PostDominatorTreeWrapperPass>(); + auto *PDT = PDTWP ? &PDTWP->getPostDomTree() : nullptr; + auto *LIWP = getAnalysisIfAvailable<LoopInfoWrapperPass>(); auto *LI = LIWP ? &LIWP->getLoopInfo() : nullptr; unsigned N = - SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI)); + SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI, nullptr, PDT)); NumBroken += N; return N > 0; } @@ -201,16 +206,17 @@ llvm::SplitCriticalEdge(Instruction *TI, unsigned SuccNum, // If we have nothing to update, just return. auto *DT = Options.DT; + auto *PDT = Options.PDT; auto *LI = Options.LI; auto *MSSAU = Options.MSSAU; if (MSSAU) MSSAU->wireOldPredecessorsToNewImmediatePredecessor( DestBB, NewBB, {TIBB}, Options.MergeIdenticalEdges); - if (!DT && !LI) + if (!DT && !PDT && !LI) return NewBB; - if (DT) { + if (DT || PDT) { // Update the DominatorTree. // ---> NewBB -----\ // / V @@ -226,7 +232,10 @@ llvm::SplitCriticalEdge(Instruction *TI, unsigned SuccNum, if (llvm::find(successors(TIBB), DestBB) == succ_end(TIBB)) Updates.push_back({DominatorTree::Delete, TIBB, DestBB}); - DT->applyUpdates(Updates); + if (DT) + DT->applyUpdates(Updates); + if (PDT) + PDT->applyUpdates(Updates); } // Update LoopInfo if it is around. |