comparison unittests/IR/DominatorTreeBatchUpdatesTest.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
comparison
equal deleted inserted replaced
133:c60214abe0e8 134:3a76565eade5
256 EXPECT_TRUE(DT.verify()); 256 EXPECT_TRUE(DT.verify());
257 PDT.applyUpdates(DomUpdates); 257 PDT.applyUpdates(DomUpdates);
258 EXPECT_TRUE(PDT.verify()); 258 EXPECT_TRUE(PDT.verify());
259 } 259 }
260 } 260 }
261
262 // These are some odd flowgraphs, usually generated from csmith cases,
263 // which are difficult on post dom trees.
264 TEST(DominatorTreeBatchUpdates, InfiniteLoop) {
265 std::vector<CFGBuilder::Arc> Arcs = {
266 {"1", "2"},
267 {"2", "3"},
268 {"3", "6"}, {"3", "5"},
269 {"4", "5"},
270 {"5", "2"},
271 {"6", "3"}, {"6", "4"}};
272
273 // SplitBlock on 3 -> 5
274 std::vector<CFGBuilder::Update> Updates = {
275 {CFGInsert, {"N", "5"}}, {CFGInsert, {"3", "N"}}, {CFGDelete, {"3", "5"}}};
276
277 CFGHolder Holder;
278 CFGBuilder B(Holder.F, Arcs, Updates);
279 DominatorTree DT(*Holder.F);
280 EXPECT_TRUE(DT.verify());
281 PostDomTree PDT(*Holder.F);
282 EXPECT_TRUE(PDT.verify());
283
284 while (B.applyUpdate())
285 ;
286
287 auto DomUpdates = ToDomUpdates(B, Updates);
288 DT.applyUpdates(DomUpdates);
289 EXPECT_TRUE(DT.verify());
290 PDT.applyUpdates(DomUpdates);
291 EXPECT_TRUE(PDT.verify());
292 }
293
294 TEST(DominatorTreeBatchUpdates, DeadBlocks) {
295 std::vector<CFGBuilder::Arc> Arcs = {
296 {"1", "2"},
297 {"2", "3"},
298 {"3", "4"}, {"3", "7"},
299 {"4", "4"},
300 {"5", "6"}, {"5", "7"},
301 {"6", "7"},
302 {"7", "2"}, {"7", "8"}};
303
304 // Remove dead 5 and 7,
305 // plus SplitBlock on 7 -> 8
306 std::vector<CFGBuilder::Update> Updates = {
307 {CFGDelete, {"6", "7"}}, {CFGDelete, {"5", "7"}}, {CFGDelete, {"5", "6"}},
308 {CFGInsert, {"N", "8"}}, {CFGInsert, {"7", "N"}}, {CFGDelete, {"7", "8"}}};
309
310 CFGHolder Holder;
311 CFGBuilder B(Holder.F, Arcs, Updates);
312 DominatorTree DT(*Holder.F);
313 EXPECT_TRUE(DT.verify());
314 PostDomTree PDT(*Holder.F);
315 EXPECT_TRUE(PDT.verify());
316
317 while (B.applyUpdate())
318 ;
319
320 auto DomUpdates = ToDomUpdates(B, Updates);
321 DT.applyUpdates(DomUpdates);
322 EXPECT_TRUE(DT.verify());
323 PDT.applyUpdates(DomUpdates);
324 EXPECT_TRUE(PDT.verify());
325 }
326
327 TEST(DominatorTreeBatchUpdates, InfiniteLoop2) {
328 std::vector<CFGBuilder::Arc> Arcs = {
329 {"1", "2"},
330 {"2", "6"}, {"2", "3"},
331 {"3", "4"},
332 {"4", "5"}, {"4", "6"},
333 {"5", "4"},
334 {"6", "2"}};
335
336 // SplitBlock on 4 -> 6
337 std::vector<CFGBuilder::Update> Updates = {
338 {CFGInsert, {"N", "6"}}, {CFGInsert, {"4", "N"}}, {CFGDelete, {"4", "6"}}};
339
340 CFGHolder Holder;
341 CFGBuilder B(Holder.F, Arcs, Updates);
342 DominatorTree DT(*Holder.F);
343 EXPECT_TRUE(DT.verify());
344 PostDomTree PDT(*Holder.F);
345 EXPECT_TRUE(PDT.verify());
346
347 while (B.applyUpdate())
348 ;
349
350 auto DomUpdates = ToDomUpdates(B, Updates);
351 DT.applyUpdates(DomUpdates);
352 EXPECT_TRUE(DT.verify());
353 PDT.applyUpdates(DomUpdates);
354 EXPECT_TRUE(PDT.verify());
355 }