Skip to content

Commit 65b4ab9

Browse files
committed
BreakCriticalEdges: Update PostDominatorTree
llvm-svn: 354673
1 parent 6083106 commit 65b4ab9

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class LoopInfo;
3535
class MDNode;
3636
class MemoryDependenceResults;
3737
class MemorySSAUpdater;
38+
class PostDominatorTree;
3839
class ReturnInst;
3940
class TargetLibraryInfo;
4041
class Value;
@@ -103,6 +104,7 @@ void ReplaceInstWithInst(Instruction *From, Instruction *To);
103104
/// during critical edge splitting.
104105
struct CriticalEdgeSplittingOptions {
105106
DominatorTree *DT;
107+
PostDominatorTree *PDT;
106108
LoopInfo *LI;
107109
MemorySSAUpdater *MSSAU;
108110
bool MergeIdenticalEdges = false;
@@ -111,8 +113,9 @@ struct CriticalEdgeSplittingOptions {
111113

112114
CriticalEdgeSplittingOptions(DominatorTree *DT = nullptr,
113115
LoopInfo *LI = nullptr,
114-
MemorySSAUpdater *MSSAU = nullptr)
115-
: DT(DT), LI(LI), MSSAU(MSSAU) {}
116+
MemorySSAUpdater *MSSAU = nullptr,
117+
PostDominatorTree *PDT = nullptr)
118+
: DT(DT), PDT(PDT), LI(LI), MSSAU(MSSAU) {}
116119

117120
CriticalEdgeSplittingOptions &setMergeIdenticalEdges() {
118121
MergeIdenticalEdges = true;

llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "llvm/Analysis/CFG.h"
2424
#include "llvm/Analysis/LoopInfo.h"
2525
#include "llvm/Analysis/MemorySSAUpdater.h"
26+
#include "llvm/Analysis/PostDominators.h"
2627
#include "llvm/IR/CFG.h"
2728
#include "llvm/IR/Dominators.h"
2829
#include "llvm/IR/Instructions.h"
@@ -48,10 +49,14 @@ namespace {
4849
bool runOnFunction(Function &F) override {
4950
auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
5051
auto *DT = DTWP ? &DTWP->getDomTree() : nullptr;
52+
53+
auto *PDTWP = getAnalysisIfAvailable<PostDominatorTreeWrapperPass>();
54+
auto *PDT = PDTWP ? &PDTWP->getPostDomTree() : nullptr;
55+
5156
auto *LIWP = getAnalysisIfAvailable<LoopInfoWrapperPass>();
5257
auto *LI = LIWP ? &LIWP->getLoopInfo() : nullptr;
5358
unsigned N =
54-
SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI));
59+
SplitAllCriticalEdges(F, CriticalEdgeSplittingOptions(DT, LI, nullptr, PDT));
5560
NumBroken += N;
5661
return N > 0;
5762
}
@@ -201,16 +206,17 @@ llvm::SplitCriticalEdge(Instruction *TI, unsigned SuccNum,
201206

202207
// If we have nothing to update, just return.
203208
auto *DT = Options.DT;
209+
auto *PDT = Options.PDT;
204210
auto *LI = Options.LI;
205211
auto *MSSAU = Options.MSSAU;
206212
if (MSSAU)
207213
MSSAU->wireOldPredecessorsToNewImmediatePredecessor(
208214
DestBB, NewBB, {TIBB}, Options.MergeIdenticalEdges);
209215

210-
if (!DT && !LI)
216+
if (!DT && !PDT && !LI)
211217
return NewBB;
212218

213-
if (DT) {
219+
if (DT || PDT) {
214220
// Update the DominatorTree.
215221
// ---> NewBB -----\
216222
// / V
@@ -226,7 +232,10 @@ llvm::SplitCriticalEdge(Instruction *TI, unsigned SuccNum,
226232
if (llvm::find(successors(TIBB), DestBB) == succ_end(TIBB))
227233
Updates.push_back({DominatorTree::Delete, TIBB, DestBB});
228234

229-
DT->applyUpdates(Updates);
235+
if (DT)
236+
DT->applyUpdates(Updates);
237+
if (PDT)
238+
PDT->applyUpdates(Updates);
230239
}
231240

232241
// Update LoopInfo if it is around.

llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
10+
#include "llvm/Analysis/PostDominators.h"
1011
#include "llvm/AsmParser/Parser.h"
1112
#include "llvm/IR/BasicBlock.h"
1213
#include "llvm/IR/Dominators.h"
@@ -49,3 +50,31 @@ TEST(BasicBlockUtils, SplitBlockPredecessors) {
4950
SplitBlockPredecessors(&F->getEntryBlock(), {}, "split.entry", &DT);
5051
EXPECT_TRUE(DT.verify());
5152
}
53+
54+
TEST(BasicBlockUtils, SplitCriticalEdge) {
55+
LLVMContext C;
56+
57+
std::unique_ptr<Module> M = parseIR(
58+
C,
59+
"define void @crit_edge(i1 %cond0, i1 %cond1) {\n"
60+
"entry:\n"
61+
" br i1 %cond0, label %bb0, label %bb1\n"
62+
"bb0:\n"
63+
" br label %bb1\n"
64+
"bb1:\n"
65+
" br label %bb2\n"
66+
"bb2:\n"
67+
" ret void\n"
68+
"}\n"
69+
"\n"
70+
);
71+
72+
auto *F = M->getFunction("crit_edge");
73+
DominatorTree DT(*F);
74+
PostDominatorTree PDT(*F);
75+
76+
CriticalEdgeSplittingOptions CESO(&DT, nullptr, nullptr, &PDT);
77+
EXPECT_EQ(1u, SplitAllCriticalEdges(*F, CESO));
78+
EXPECT_TRUE(DT.verify());
79+
EXPECT_TRUE(PDT.verify());
80+
}

0 commit comments

Comments
 (0)