comparison unittests/IR/DominatorTreeBatchUpdatesTest.cpp @ 147:c2174574ed3a

LLVM 10
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 16:55:33 +0900
parents 3a76565eade5
children
comparison
equal deleted inserted replaced
134:3a76565eade5 147:c2174574ed3a
1 //===- llvm/unittests/IR/DominatorTreeBatchUpdatesTest.cpp ----------------===// 1 //===- llvm/unittests/IR/DominatorTreeBatchUpdatesTest.cpp ----------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // 4 // See https://llvm.org/LICENSE.txt for license information.
5 // This file is distributed under the University of Illinois Open Source 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 // License. See LICENSE.TXT for details.
7 // 6 //
8 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
9 8
10 #include <random> 9 #include <random>
11 #include "CFGBuilder.h" 10 #include "CFGBuilder.h"
20 19
21 namespace { 20 namespace {
22 const auto CFGInsert = CFGBuilder::ActionKind::Insert; 21 const auto CFGInsert = CFGBuilder::ActionKind::Insert;
23 const auto CFGDelete = CFGBuilder::ActionKind::Delete; 22 const auto CFGDelete = CFGBuilder::ActionKind::Delete;
24 23
25 struct PostDomTree : PostDomTreeBase<BasicBlock> {
26 PostDomTree(Function &F) { recalculate(F); }
27 };
28 24
29 using DomUpdate = DominatorTree::UpdateType; 25 using DomUpdate = DominatorTree::UpdateType;
30 static_assert( 26 static_assert(
31 std::is_same<DomUpdate, PostDomTree::UpdateType>::value, 27 std::is_same<DomUpdate, PostDominatorTree::UpdateType>::value,
32 "Trees differing only in IsPostDom should have the same update types"); 28 "Trees differing only in IsPostDom should have the same update types");
33 using DomSNCA = DomTreeBuilder::SemiNCAInfo<DomTreeBuilder::BBDomTree>; 29 using DomSNCA = DomTreeBuilder::SemiNCAInfo<DomTreeBuilder::BBDomTree>;
34 using PostDomSNCA = DomTreeBuilder::SemiNCAInfo<DomTreeBuilder::BBPostDomTree>; 30 using PostDomSNCA = DomTreeBuilder::SemiNCAInfo<DomTreeBuilder::BBPostDomTree>;
35 const auto Insert = DominatorTree::Insert; 31 const auto Insert = DominatorTree::Insert;
36 const auto Delete = DominatorTree::Delete; 32 const auto Delete = DominatorTree::Delete;
59 55
60 std::vector<DomUpdate> Updates = { 56 std::vector<DomUpdate> Updates = {
61 {Insert, B, C}, {Insert, C, D}, {Delete, B, C}, {Insert, B, C}, 57 {Insert, B, C}, {Insert, C, D}, {Delete, B, C}, {Insert, B, C},
62 {Insert, B, D}, {Delete, C, D}, {Delete, A, B}}; 58 {Insert, B, D}, {Delete, C, D}, {Delete, A, B}};
63 SmallVector<DomUpdate, 4> Legalized; 59 SmallVector<DomUpdate, 4> Legalized;
64 DomSNCA::LegalizeUpdates(Updates, Legalized); 60 cfg::LegalizeUpdates<BasicBlock *>(Updates, Legalized, false);
65 DEBUG(dbgs() << "Legalized updates:\t"); 61 LLVM_DEBUG(dbgs() << "Legalized updates:\t");
66 DEBUG(for (auto &U : Legalized) dbgs() << U << ", "); 62 LLVM_DEBUG(for (auto &U : Legalized) { U.dump(); dbgs() << ", "; });
67 DEBUG(dbgs() << "\n"); 63 LLVM_DEBUG(dbgs() << "\n");
68 EXPECT_EQ(Legalized.size(), 3UL); 64 EXPECT_EQ(Legalized.size(), 3UL);
69 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, B, C}), Legalized.end()); 65 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, B, C}), Legalized.end());
70 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, B, D}), Legalized.end()); 66 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, B, D}), Legalized.end());
71 EXPECT_NE(llvm::find(Legalized, DomUpdate{Delete, A, B}), Legalized.end()); 67 EXPECT_NE(llvm::find(Legalized, DomUpdate{Delete, A, B}), Legalized.end());
72 } 68 }
82 78
83 std::vector<DomUpdate> Updates = { 79 std::vector<DomUpdate> Updates = {
84 {Insert, B, C}, {Insert, C, D}, {Delete, B, C}, {Insert, B, C}, 80 {Insert, B, C}, {Insert, C, D}, {Delete, B, C}, {Insert, B, C},
85 {Insert, B, D}, {Delete, C, D}, {Delete, A, B}}; 81 {Insert, B, D}, {Delete, C, D}, {Delete, A, B}};
86 SmallVector<DomUpdate, 4> Legalized; 82 SmallVector<DomUpdate, 4> Legalized;
87 PostDomSNCA::LegalizeUpdates(Updates, Legalized); 83 cfg::LegalizeUpdates<BasicBlock *>(Updates, Legalized, true);
88 DEBUG(dbgs() << "Legalized postdom updates:\t"); 84 LLVM_DEBUG(dbgs() << "Legalized postdom updates:\t");
89 DEBUG(for (auto &U : Legalized) dbgs() << U << ", "); 85 LLVM_DEBUG(for (auto &U : Legalized) { U.dump(); dbgs() << ", "; });
90 DEBUG(dbgs() << "\n"); 86 LLVM_DEBUG(dbgs() << "\n");
91 EXPECT_EQ(Legalized.size(), 3UL); 87 EXPECT_EQ(Legalized.size(), 3UL);
92 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, C, B}), Legalized.end()); 88 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, C, B}), Legalized.end());
93 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, D, B}), Legalized.end()); 89 EXPECT_NE(llvm::find(Legalized, DomUpdate{Insert, D, B}), Legalized.end());
94 EXPECT_NE(llvm::find(Legalized, DomUpdate{Delete, B, A}), Legalized.end()); 90 EXPECT_NE(llvm::find(Legalized, DomUpdate{Delete, B, A}), Legalized.end());
95 } 91 }
98 CFGHolder Holder; 94 CFGHolder Holder;
99 CFGBuilder Builder(Holder.F, {{"A", "B"}}, {{CFGInsert, {"B", "C"}}}); 95 CFGBuilder Builder(Holder.F, {{"A", "B"}}, {{CFGInsert, {"B", "C"}}});
100 96
101 DominatorTree DT(*Holder.F); 97 DominatorTree DT(*Holder.F);
102 EXPECT_TRUE(DT.verify()); 98 EXPECT_TRUE(DT.verify());
103 PostDomTree PDT(*Holder.F); 99 PostDominatorTree PDT(*Holder.F);
104 EXPECT_TRUE(DT.verify()); 100 EXPECT_TRUE(PDT.verify());
105 101
106 BasicBlock *B = Builder.getOrAddBlock("B"); 102 BasicBlock *B = Builder.getOrAddBlock("B");
107 BasicBlock *C = Builder.getOrAddBlock("C"); 103 BasicBlock *C = Builder.getOrAddBlock("C");
108 std::vector<DomUpdate> Updates = {{Insert, B, C}}; 104 std::vector<DomUpdate> Updates = {{Insert, B, C}};
109 105
120 CFGBuilder Builder(Holder.F, {{"A", "B"}, {"B", "C"}}, 116 CFGBuilder Builder(Holder.F, {{"A", "B"}, {"B", "C"}},
121 {{CFGDelete, {"B", "C"}}}); 117 {{CFGDelete, {"B", "C"}}});
122 118
123 DominatorTree DT(*Holder.F); 119 DominatorTree DT(*Holder.F);
124 EXPECT_TRUE(DT.verify()); 120 EXPECT_TRUE(DT.verify());
125 PostDomTree PDT(*Holder.F); 121 PostDominatorTree PDT(*Holder.F);
126 EXPECT_TRUE(DT.verify()); 122 EXPECT_TRUE(PDT.verify());
127 123
128 BasicBlock *B = Builder.getOrAddBlock("B"); 124 BasicBlock *B = Builder.getOrAddBlock("B");
129 BasicBlock *C = Builder.getOrAddBlock("C"); 125 BasicBlock *C = Builder.getOrAddBlock("C");
130 std::vector<DomUpdate> Updates = {{Delete, B, C}}; 126 std::vector<DomUpdate> Updates = {{Delete, B, C}};
131 127
146 CFGHolder Holder; 142 CFGHolder Holder;
147 CFGBuilder Builder(Holder.F, {{"A", "B"}}, CFGUpdates); 143 CFGBuilder Builder(Holder.F, {{"A", "B"}}, CFGUpdates);
148 144
149 DominatorTree DT(*Holder.F); 145 DominatorTree DT(*Holder.F);
150 EXPECT_TRUE(DT.verify()); 146 EXPECT_TRUE(DT.verify());
151 PostDomTree PDT(*Holder.F); 147 PostDominatorTree PDT(*Holder.F);
152 EXPECT_TRUE(PDT.verify()); 148 EXPECT_TRUE(PDT.verify());
153 149
154 BasicBlock *B = Builder.getOrAddBlock("B"); 150 BasicBlock *B = Builder.getOrAddBlock("B");
155 BasicBlock *C = Builder.getOrAddBlock("C"); 151 BasicBlock *C = Builder.getOrAddBlock("C");
156 BasicBlock *D = Builder.getOrAddBlock("D"); 152 BasicBlock *D = Builder.getOrAddBlock("D");
179 Holder.F, {{"A", "B"}, {"B", "C"}, {"B", "D"}, {"D", "E"}, {"C", "B"}}, 175 Holder.F, {{"A", "B"}, {"B", "C"}, {"B", "D"}, {"D", "E"}, {"C", "B"}},
180 CFGUpdates); 176 CFGUpdates);
181 177
182 DominatorTree DT(*Holder.F); 178 DominatorTree DT(*Holder.F);
183 EXPECT_TRUE(DT.verify()); 179 EXPECT_TRUE(DT.verify());
184 PostDomTree PDT(*Holder.F); 180 PostDominatorTree PDT(*Holder.F);
185 EXPECT_TRUE(PDT.verify()); 181 EXPECT_TRUE(PDT.verify());
186 182
187 auto Updates = ToDomUpdates(Builder, CFGUpdates); 183 auto Updates = ToDomUpdates(Builder, CFGUpdates);
188 184
189 while (Builder.applyUpdate()) 185 while (Builder.applyUpdate())
210 206
211 CFGHolder Holder; 207 CFGHolder Holder;
212 CFGBuilder B(Holder.F, Arcs, Updates); 208 CFGBuilder B(Holder.F, Arcs, Updates);
213 DominatorTree DT(*Holder.F); 209 DominatorTree DT(*Holder.F);
214 EXPECT_TRUE(DT.verify()); 210 EXPECT_TRUE(DT.verify());
215 PostDomTree PDT(*Holder.F); 211 PostDominatorTree PDT(*Holder.F);
216 EXPECT_TRUE(PDT.verify()); 212 EXPECT_TRUE(PDT.verify());
217 213
218 while (B.applyUpdate()) 214 while (B.applyUpdate())
219 ; 215 ;
220 216
243 std::shuffle(Updates.begin(), Updates.end(), Generator); 239 std::shuffle(Updates.begin(), Updates.end(), Generator);
244 CFGHolder Holder; 240 CFGHolder Holder;
245 CFGBuilder B(Holder.F, Arcs, Updates); 241 CFGBuilder B(Holder.F, Arcs, Updates);
246 DominatorTree DT(*Holder.F); 242 DominatorTree DT(*Holder.F);
247 EXPECT_TRUE(DT.verify()); 243 EXPECT_TRUE(DT.verify());
248 PostDomTree PDT(*Holder.F); 244 PostDominatorTree PDT(*Holder.F);
249 EXPECT_TRUE(PDT.verify()); 245 EXPECT_TRUE(PDT.verify());
250 246
251 while (B.applyUpdate()) 247 while (B.applyUpdate())
252 ; 248 ;
253 249
276 272
277 CFGHolder Holder; 273 CFGHolder Holder;
278 CFGBuilder B(Holder.F, Arcs, Updates); 274 CFGBuilder B(Holder.F, Arcs, Updates);
279 DominatorTree DT(*Holder.F); 275 DominatorTree DT(*Holder.F);
280 EXPECT_TRUE(DT.verify()); 276 EXPECT_TRUE(DT.verify());
281 PostDomTree PDT(*Holder.F); 277 PostDominatorTree PDT(*Holder.F);
282 EXPECT_TRUE(PDT.verify()); 278 EXPECT_TRUE(PDT.verify());
283 279
284 while (B.applyUpdate()) 280 while (B.applyUpdate())
285 ; 281 ;
286 282
309 305
310 CFGHolder Holder; 306 CFGHolder Holder;
311 CFGBuilder B(Holder.F, Arcs, Updates); 307 CFGBuilder B(Holder.F, Arcs, Updates);
312 DominatorTree DT(*Holder.F); 308 DominatorTree DT(*Holder.F);
313 EXPECT_TRUE(DT.verify()); 309 EXPECT_TRUE(DT.verify());
314 PostDomTree PDT(*Holder.F); 310 PostDominatorTree PDT(*Holder.F);
315 EXPECT_TRUE(PDT.verify()); 311 EXPECT_TRUE(PDT.verify());
316 312
317 while (B.applyUpdate()) 313 while (B.applyUpdate())
318 ; 314 ;
319 315
339 335
340 CFGHolder Holder; 336 CFGHolder Holder;
341 CFGBuilder B(Holder.F, Arcs, Updates); 337 CFGBuilder B(Holder.F, Arcs, Updates);
342 DominatorTree DT(*Holder.F); 338 DominatorTree DT(*Holder.F);
343 EXPECT_TRUE(DT.verify()); 339 EXPECT_TRUE(DT.verify());
344 PostDomTree PDT(*Holder.F); 340 PostDominatorTree PDT(*Holder.F);
345 EXPECT_TRUE(PDT.verify()); 341 EXPECT_TRUE(PDT.verify());
346 342
347 while (B.applyUpdate()) 343 while (B.applyUpdate())
348 ; 344 ;
349 345