1 //===- llvm/unittests/IR/DominatorTreeTest.cpp - Constants unit tests -----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/IR/Dominators.h"
11 #include "llvm/Analysis/PostDominators.h"
12 #include "llvm/AsmParser/Parser.h"
13 #include "llvm/IR/Constants.h"
14 #include "llvm/IR/Instructions.h"
15 #include "llvm/IR/LLVMContext.h"
16 #include "llvm/IR/Module.h"
17 #include "llvm/IR/LegacyPassManager.h"
18 #include "llvm/Support/SourceMgr.h"
19 #include "gtest/gtest.h"
24 void initializeDPassPass(PassRegistry
&);
27 struct DPass
: public FunctionPass
{
29 bool runOnFunction(Function
&F
) override
{
31 &getAnalysis
<DominatorTreeWrapperPass
>().getDomTree();
32 PostDominatorTree
*PDT
=
33 &getAnalysis
<PostDominatorTreeWrapperPass
>().getPostDomTree();
34 Function::iterator FI
= F
.begin();
36 BasicBlock
*BB0
= &*FI
++;
37 BasicBlock::iterator BBI
= BB0
->begin();
38 Instruction
*Y1
= &*BBI
++;
39 Instruction
*Y2
= &*BBI
++;
40 Instruction
*Y3
= &*BBI
++;
42 BasicBlock
*BB1
= &*FI
++;
44 Instruction
*Y4
= &*BBI
++;
46 BasicBlock
*BB2
= &*FI
++;
48 Instruction
*Y5
= &*BBI
++;
50 BasicBlock
*BB3
= &*FI
++;
52 Instruction
*Y6
= &*BBI
++;
53 Instruction
*Y7
= &*BBI
++;
55 BasicBlock
*BB4
= &*FI
++;
57 Instruction
*Y8
= &*BBI
++;
58 Instruction
*Y9
= &*BBI
++;
61 EXPECT_TRUE(DT
->isReachableFromEntry(BB0
));
62 EXPECT_TRUE(DT
->isReachableFromEntry(BB1
));
63 EXPECT_TRUE(DT
->isReachableFromEntry(BB2
));
64 EXPECT_FALSE(DT
->isReachableFromEntry(BB3
));
65 EXPECT_TRUE(DT
->isReachableFromEntry(BB4
));
68 EXPECT_TRUE(DT
->dominates(BB0
, BB0
));
69 EXPECT_TRUE(DT
->dominates(BB0
, BB1
));
70 EXPECT_TRUE(DT
->dominates(BB0
, BB2
));
71 EXPECT_TRUE(DT
->dominates(BB0
, BB3
));
72 EXPECT_TRUE(DT
->dominates(BB0
, BB4
));
74 EXPECT_FALSE(DT
->dominates(BB1
, BB0
));
75 EXPECT_TRUE(DT
->dominates(BB1
, BB1
));
76 EXPECT_FALSE(DT
->dominates(BB1
, BB2
));
77 EXPECT_TRUE(DT
->dominates(BB1
, BB3
));
78 EXPECT_FALSE(DT
->dominates(BB1
, BB4
));
80 EXPECT_FALSE(DT
->dominates(BB2
, BB0
));
81 EXPECT_FALSE(DT
->dominates(BB2
, BB1
));
82 EXPECT_TRUE(DT
->dominates(BB2
, BB2
));
83 EXPECT_TRUE(DT
->dominates(BB2
, BB3
));
84 EXPECT_FALSE(DT
->dominates(BB2
, BB4
));
86 EXPECT_FALSE(DT
->dominates(BB3
, BB0
));
87 EXPECT_FALSE(DT
->dominates(BB3
, BB1
));
88 EXPECT_FALSE(DT
->dominates(BB3
, BB2
));
89 EXPECT_TRUE(DT
->dominates(BB3
, BB3
));
90 EXPECT_FALSE(DT
->dominates(BB3
, BB4
));
92 // BB proper dominance
93 EXPECT_FALSE(DT
->properlyDominates(BB0
, BB0
));
94 EXPECT_TRUE(DT
->properlyDominates(BB0
, BB1
));
95 EXPECT_TRUE(DT
->properlyDominates(BB0
, BB2
));
96 EXPECT_TRUE(DT
->properlyDominates(BB0
, BB3
));
98 EXPECT_FALSE(DT
->properlyDominates(BB1
, BB0
));
99 EXPECT_FALSE(DT
->properlyDominates(BB1
, BB1
));
100 EXPECT_FALSE(DT
->properlyDominates(BB1
, BB2
));
101 EXPECT_TRUE(DT
->properlyDominates(BB1
, BB3
));
103 EXPECT_FALSE(DT
->properlyDominates(BB2
, BB0
));
104 EXPECT_FALSE(DT
->properlyDominates(BB2
, BB1
));
105 EXPECT_FALSE(DT
->properlyDominates(BB2
, BB2
));
106 EXPECT_TRUE(DT
->properlyDominates(BB2
, BB3
));
108 EXPECT_FALSE(DT
->properlyDominates(BB3
, BB0
));
109 EXPECT_FALSE(DT
->properlyDominates(BB3
, BB1
));
110 EXPECT_FALSE(DT
->properlyDominates(BB3
, BB2
));
111 EXPECT_FALSE(DT
->properlyDominates(BB3
, BB3
));
113 // Instruction dominance in the same reachable BB
114 EXPECT_FALSE(DT
->dominates(Y1
, Y1
));
115 EXPECT_TRUE(DT
->dominates(Y1
, Y2
));
116 EXPECT_FALSE(DT
->dominates(Y2
, Y1
));
117 EXPECT_FALSE(DT
->dominates(Y2
, Y2
));
119 // Instruction dominance in the same unreachable BB
120 EXPECT_TRUE(DT
->dominates(Y6
, Y6
));
121 EXPECT_TRUE(DT
->dominates(Y6
, Y7
));
122 EXPECT_TRUE(DT
->dominates(Y7
, Y6
));
123 EXPECT_TRUE(DT
->dominates(Y7
, Y7
));
126 EXPECT_TRUE(DT
->dominates(Y3
, Y4
));
127 EXPECT_FALSE(DT
->dominates(Y3
, Y5
));
130 EXPECT_TRUE(DT
->dominates(Y2
, Y9
));
131 EXPECT_FALSE(DT
->dominates(Y3
, Y9
));
132 EXPECT_FALSE(DT
->dominates(Y8
, Y9
));
134 // Anything dominates unreachable
135 EXPECT_TRUE(DT
->dominates(Y1
, Y6
));
136 EXPECT_TRUE(DT
->dominates(Y3
, Y6
));
138 // Unreachable doesn't dominate reachable
139 EXPECT_FALSE(DT
->dominates(Y6
, Y1
));
141 // Instruction, BB dominance
142 EXPECT_FALSE(DT
->dominates(Y1
, BB0
));
143 EXPECT_TRUE(DT
->dominates(Y1
, BB1
));
144 EXPECT_TRUE(DT
->dominates(Y1
, BB2
));
145 EXPECT_TRUE(DT
->dominates(Y1
, BB3
));
146 EXPECT_TRUE(DT
->dominates(Y1
, BB4
));
148 EXPECT_FALSE(DT
->dominates(Y3
, BB0
));
149 EXPECT_TRUE(DT
->dominates(Y3
, BB1
));
150 EXPECT_FALSE(DT
->dominates(Y3
, BB2
));
151 EXPECT_TRUE(DT
->dominates(Y3
, BB3
));
152 EXPECT_FALSE(DT
->dominates(Y3
, BB4
));
154 EXPECT_TRUE(DT
->dominates(Y6
, BB3
));
157 EXPECT_TRUE(PDT
->dominates(BB0
, BB0
));
158 EXPECT_FALSE(PDT
->dominates(BB1
, BB0
));
159 EXPECT_FALSE(PDT
->dominates(BB2
, BB0
));
160 EXPECT_FALSE(PDT
->dominates(BB3
, BB0
));
161 EXPECT_TRUE(PDT
->dominates(BB4
, BB1
));
163 // Dominance descendants.
164 SmallVector
<BasicBlock
*, 8> DominatedBBs
, PostDominatedBBs
;
166 DT
->getDescendants(BB0
, DominatedBBs
);
167 PDT
->getDescendants(BB0
, PostDominatedBBs
);
168 EXPECT_EQ(DominatedBBs
.size(), 4UL);
169 EXPECT_EQ(PostDominatedBBs
.size(), 1UL);
171 // BB3 is unreachable. It should have no dominators nor postdominators.
172 DominatedBBs
.clear();
173 PostDominatedBBs
.clear();
174 DT
->getDescendants(BB3
, DominatedBBs
);
175 DT
->getDescendants(BB3
, PostDominatedBBs
);
176 EXPECT_EQ(DominatedBBs
.size(), 0UL);
177 EXPECT_EQ(PostDominatedBBs
.size(), 0UL);
179 // Check DFS Numbers before
180 EXPECT_EQ(DT
->getNode(BB0
)->getDFSNumIn(), 0UL);
181 EXPECT_EQ(DT
->getNode(BB0
)->getDFSNumOut(), 7UL);
182 EXPECT_EQ(DT
->getNode(BB1
)->getDFSNumIn(), 1UL);
183 EXPECT_EQ(DT
->getNode(BB1
)->getDFSNumOut(), 2UL);
184 EXPECT_EQ(DT
->getNode(BB2
)->getDFSNumIn(), 5UL);
185 EXPECT_EQ(DT
->getNode(BB2
)->getDFSNumOut(), 6UL);
186 EXPECT_EQ(DT
->getNode(BB4
)->getDFSNumIn(), 3UL);
187 EXPECT_EQ(DT
->getNode(BB4
)->getDFSNumOut(), 4UL);
189 // Reattach block 3 to block 1 and recalculate
190 BB1
->getTerminator()->eraseFromParent();
191 BranchInst::Create(BB4
, BB3
, ConstantInt::getTrue(F
.getContext()), BB1
);
194 // Check DFS Numbers after
195 EXPECT_EQ(DT
->getNode(BB0
)->getDFSNumIn(), 0UL);
196 EXPECT_EQ(DT
->getNode(BB0
)->getDFSNumOut(), 9UL);
197 EXPECT_EQ(DT
->getNode(BB1
)->getDFSNumIn(), 1UL);
198 EXPECT_EQ(DT
->getNode(BB1
)->getDFSNumOut(), 4UL);
199 EXPECT_EQ(DT
->getNode(BB2
)->getDFSNumIn(), 7UL);
200 EXPECT_EQ(DT
->getNode(BB2
)->getDFSNumOut(), 8UL);
201 EXPECT_EQ(DT
->getNode(BB3
)->getDFSNumIn(), 2UL);
202 EXPECT_EQ(DT
->getNode(BB3
)->getDFSNumOut(), 3UL);
203 EXPECT_EQ(DT
->getNode(BB4
)->getDFSNumIn(), 5UL);
204 EXPECT_EQ(DT
->getNode(BB4
)->getDFSNumOut(), 6UL);
208 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
209 AU
.addRequired
<DominatorTreeWrapperPass
>();
210 AU
.addRequired
<PostDominatorTreeWrapperPass
>();
212 DPass() : FunctionPass(ID
) {
213 initializeDPassPass(*PassRegistry::getPassRegistry());
218 std::unique_ptr
<Module
> makeLLVMModule(LLVMContext
&Context
, DPass
*P
) {
219 const char *ModuleStrig
=
220 "declare i32 @g()\n" \
221 "define void @f(i32 %x) personality i32 ()* @g {\n" \
223 " %y1 = add i32 %x, 1\n" \
224 " %y2 = add i32 %x, 1\n" \
225 " %y3 = invoke i32 @g() to label %bb1 unwind label %bb2\n" \
227 " %y4 = add i32 %x, 1\n" \
230 " %y5 = landingpad i32\n" \
234 " %y6 = add i32 %x, 1\n" \
235 " %y7 = add i32 %x, 1\n" \
238 " %y8 = phi i32 [0, %bb2], [%y4, %bb1]\n"
239 " %y9 = phi i32 [0, %bb2], [%y4, %bb1]\n"
243 return parseAssemblyString(ModuleStrig
, Err
, Context
);
246 TEST(DominatorTree
, Unreachable
) {
247 DPass
*P
= new DPass();
249 std::unique_ptr
<Module
> M
= makeLLVMModule(Context
, P
);
250 legacy::PassManager Passes
;
257 INITIALIZE_PASS_BEGIN(DPass
, "dpass", "dpass", false, false)
258 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass
)
259 INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass
)
260 INITIALIZE_PASS_END(DPass
, "dpass", "dpass", false, false)