Mercurial > hg > CbC > CbC_llvm
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 } |