blob: 387d7326601067be2e8797d37b89304f91f4e2b9 [file] [log] [blame]
NAKAMURA Takumiafda71e2013-01-23 08:30:10 +00001//===- llvm/unittests/IR/DominatorTreeTest.cpp - Constants unit tests -----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth130cec22012-12-04 10:23:08 +000010#include "llvm/Analysis/Dominators.h"
Diego Novilloee592422013-12-02 14:08:27 +000011#include "llvm/Analysis/PostDominators.h"
Chandler Carruth130cec22012-12-04 10:23:08 +000012#include "llvm/Assembly/Parser.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000013#include "llvm/IR/Instructions.h"
14#include "llvm/IR/LLVMContext.h"
15#include "llvm/IR/Module.h"
Rafael Espindolaa53c46a2012-03-30 16:46:21 +000016#include "llvm/PassManager.h"
Rafael Espindolaa53c46a2012-03-30 16:46:21 +000017#include "llvm/Support/SourceMgr.h"
18#include "gtest/gtest.h"
19
20using namespace llvm;
21
22namespace llvm {
23 void initializeDPassPass(PassRegistry&);
24
25 namespace {
26 struct DPass : public FunctionPass {
27 static char ID;
28 virtual bool runOnFunction(Function &F) {
29 DominatorTree *DT = &getAnalysis<DominatorTree>();
Diego Novilloee592422013-12-02 14:08:27 +000030 PostDominatorTree *PDT = &getAnalysis<PostDominatorTree>();
Rafael Espindolaa53c46a2012-03-30 16:46:21 +000031 Function::iterator FI = F.begin();
32
33 BasicBlock *BB0 = FI++;
34 BasicBlock::iterator BBI = BB0->begin();
35 Instruction *Y1 = BBI++;
36 Instruction *Y2 = BBI++;
37 Instruction *Y3 = BBI++;
38
39 BasicBlock *BB1 = FI++;
40 BBI = BB1->begin();
41 Instruction *Y4 = BBI++;
42
43 BasicBlock *BB2 = FI++;
44 BBI = BB2->begin();
45 Instruction *Y5 = BBI++;
46
47 BasicBlock *BB3 = FI++;
48 BBI = BB3->begin();
49 Instruction *Y6 = BBI++;
50 Instruction *Y7 = BBI++;
51
52 BasicBlock *BB4 = FI++;
53 BBI = BB4->begin();
54 Instruction *Y8 = BBI++;
55 Instruction *Y9 = BBI++;
56
57 // Reachability
58 EXPECT_TRUE(DT->isReachableFromEntry(BB0));
59 EXPECT_TRUE(DT->isReachableFromEntry(BB1));
60 EXPECT_TRUE(DT->isReachableFromEntry(BB2));
61 EXPECT_FALSE(DT->isReachableFromEntry(BB3));
62 EXPECT_TRUE(DT->isReachableFromEntry(BB4));
63
64 // BB dominance
65 EXPECT_TRUE(DT->dominates(BB0, BB0));
66 EXPECT_TRUE(DT->dominates(BB0, BB1));
67 EXPECT_TRUE(DT->dominates(BB0, BB2));
68 EXPECT_TRUE(DT->dominates(BB0, BB3));
69 EXPECT_TRUE(DT->dominates(BB0, BB4));
70
71 EXPECT_FALSE(DT->dominates(BB1, BB0));
72 EXPECT_TRUE(DT->dominates(BB1, BB1));
73 EXPECT_FALSE(DT->dominates(BB1, BB2));
74 EXPECT_TRUE(DT->dominates(BB1, BB3));
75 EXPECT_FALSE(DT->dominates(BB1, BB4));
76
77 EXPECT_FALSE(DT->dominates(BB2, BB0));
78 EXPECT_FALSE(DT->dominates(BB2, BB1));
79 EXPECT_TRUE(DT->dominates(BB2, BB2));
80 EXPECT_TRUE(DT->dominates(BB2, BB3));
81 EXPECT_FALSE(DT->dominates(BB2, BB4));
82
83 EXPECT_FALSE(DT->dominates(BB3, BB0));
84 EXPECT_FALSE(DT->dominates(BB3, BB1));
85 EXPECT_FALSE(DT->dominates(BB3, BB2));
86 EXPECT_TRUE(DT->dominates(BB3, BB3));
87 EXPECT_FALSE(DT->dominates(BB3, BB4));
88
89 // BB proper dominance
90 EXPECT_FALSE(DT->properlyDominates(BB0, BB0));
91 EXPECT_TRUE(DT->properlyDominates(BB0, BB1));
92 EXPECT_TRUE(DT->properlyDominates(BB0, BB2));
93 EXPECT_TRUE(DT->properlyDominates(BB0, BB3));
94
95 EXPECT_FALSE(DT->properlyDominates(BB1, BB0));
96 EXPECT_FALSE(DT->properlyDominates(BB1, BB1));
97 EXPECT_FALSE(DT->properlyDominates(BB1, BB2));
98 EXPECT_TRUE(DT->properlyDominates(BB1, BB3));
99
100 EXPECT_FALSE(DT->properlyDominates(BB2, BB0));
101 EXPECT_FALSE(DT->properlyDominates(BB2, BB1));
102 EXPECT_FALSE(DT->properlyDominates(BB2, BB2));
103 EXPECT_TRUE(DT->properlyDominates(BB2, BB3));
104
105 EXPECT_FALSE(DT->properlyDominates(BB3, BB0));
106 EXPECT_FALSE(DT->properlyDominates(BB3, BB1));
107 EXPECT_FALSE(DT->properlyDominates(BB3, BB2));
108 EXPECT_FALSE(DT->properlyDominates(BB3, BB3));
109
110 // Instruction dominance in the same reachable BB
111 EXPECT_FALSE(DT->dominates(Y1, Y1));
112 EXPECT_TRUE(DT->dominates(Y1, Y2));
113 EXPECT_FALSE(DT->dominates(Y2, Y1));
114 EXPECT_FALSE(DT->dominates(Y2, Y2));
115
116 // Instruction dominance in the same unreachable BB
117 EXPECT_TRUE(DT->dominates(Y6, Y6));
118 EXPECT_TRUE(DT->dominates(Y6, Y7));
119 EXPECT_TRUE(DT->dominates(Y7, Y6));
120 EXPECT_TRUE(DT->dominates(Y7, Y7));
121
122 // Invoke
123 EXPECT_TRUE(DT->dominates(Y3, Y4));
124 EXPECT_FALSE(DT->dominates(Y3, Y5));
125
126 // Phi
127 EXPECT_TRUE(DT->dominates(Y2, Y9));
128 EXPECT_FALSE(DT->dominates(Y3, Y9));
129 EXPECT_FALSE(DT->dominates(Y8, Y9));
130
131 // Anything dominates unreachable
132 EXPECT_TRUE(DT->dominates(Y1, Y6));
133 EXPECT_TRUE(DT->dominates(Y3, Y6));
134
135 // Unreachable doesn't dominate reachable
136 EXPECT_FALSE(DT->dominates(Y6, Y1));
137
138 // Instruction, BB dominance
139 EXPECT_FALSE(DT->dominates(Y1, BB0));
140 EXPECT_TRUE(DT->dominates(Y1, BB1));
141 EXPECT_TRUE(DT->dominates(Y1, BB2));
142 EXPECT_TRUE(DT->dominates(Y1, BB3));
143 EXPECT_TRUE(DT->dominates(Y1, BB4));
144
145 EXPECT_FALSE(DT->dominates(Y3, BB0));
146 EXPECT_TRUE(DT->dominates(Y3, BB1));
147 EXPECT_FALSE(DT->dominates(Y3, BB2));
148 EXPECT_TRUE(DT->dominates(Y3, BB3));
149 EXPECT_FALSE(DT->dominates(Y3, BB4));
150
151 EXPECT_TRUE(DT->dominates(Y6, BB3));
152
Diego Novilloee592422013-12-02 14:08:27 +0000153 // Post dominance.
154 EXPECT_TRUE(PDT->dominates(BB0, BB0));
155 EXPECT_FALSE(PDT->dominates(BB1, BB0));
156 EXPECT_FALSE(PDT->dominates(BB2, BB0));
157 EXPECT_FALSE(PDT->dominates(BB3, BB0));
158 EXPECT_TRUE(PDT->dominates(BB4, BB1));
159
160 // Dominance descendants.
161 SmallVector<BasicBlock *, 8> DominatedBBs, PostDominatedBBs;
162
163 DT->getDescendants(BB0, DominatedBBs);
164 PDT->getDescendants(BB0, PostDominatedBBs);
165 EXPECT_EQ(DominatedBBs.size(), 4UL);
166 EXPECT_EQ(PostDominatedBBs.size(), 1UL);
167
168 // BB3 is unreachable. It should have no dominators nor postdominators.
169 DominatedBBs.clear();
170 PostDominatedBBs.clear();
171 DT->getDescendants(BB3, DominatedBBs);
172 DT->getDescendants(BB3, PostDominatedBBs);
173 EXPECT_EQ(DominatedBBs.size(), 0UL);
174 EXPECT_EQ(PostDominatedBBs.size(), 0UL);
175
Rafael Espindolaa53c46a2012-03-30 16:46:21 +0000176 return false;
177 }
178 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
179 AU.addRequired<DominatorTree>();
Diego Novilloee592422013-12-02 14:08:27 +0000180 AU.addRequired<PostDominatorTree>();
Rafael Espindolaa53c46a2012-03-30 16:46:21 +0000181 }
182 DPass() : FunctionPass(ID) {
183 initializeDPassPass(*PassRegistry::getPassRegistry());
184 }
185 };
186 char DPass::ID = 0;
187
188
189 Module* makeLLVMModule(DPass *P) {
190 const char *ModuleStrig =
191 "declare i32 @g()\n" \
192 "define void @f(i32 %x) {\n" \
193 "bb0:\n" \
194 " %y1 = add i32 %x, 1\n" \
195 " %y2 = add i32 %x, 1\n" \
196 " %y3 = invoke i32 @g() to label %bb1 unwind label %bb2\n" \
197 "bb1:\n" \
198 " %y4 = add i32 %x, 1\n" \
199 " br label %bb4\n" \
200 "bb2:\n" \
201 " %y5 = landingpad i32 personality i32 ()* @g\n" \
202 " cleanup\n" \
203 " br label %bb4\n" \
204 "bb3:\n" \
205 " %y6 = add i32 %x, 1\n" \
206 " %y7 = add i32 %x, 1\n" \
207 " ret void\n" \
208 "bb4:\n" \
209 " %y8 = phi i32 [0, %bb2], [%y4, %bb1]\n"
210 " %y9 = phi i32 [0, %bb2], [%y4, %bb1]\n"
211 " ret void\n" \
212 "}\n";
213 LLVMContext &C = getGlobalContext();
214 SMDiagnostic Err;
215 return ParseAssemblyString(ModuleStrig, NULL, Err, C);
216 }
217
218 TEST(DominatorTree, Unreachable) {
219 DPass *P = new DPass();
NAKAMURA Takumi508baf72013-01-23 08:33:13 +0000220 OwningPtr<Module> M(makeLLVMModule(P));
Rafael Espindolaa53c46a2012-03-30 16:46:21 +0000221 PassManager Passes;
222 Passes.add(P);
223 Passes.run(*M);
224 }
225 }
226}
227
228INITIALIZE_PASS_BEGIN(DPass, "dpass", "dpass", false, false)
229INITIALIZE_PASS_DEPENDENCY(DominatorTree)
Diego Novilloee592422013-12-02 14:08:27 +0000230INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
Rafael Espindolaa53c46a2012-03-30 16:46:21 +0000231INITIALIZE_PASS_END(DPass, "dpass", "dpass", false, false)