Lines Matching refs:loop
165 // Not a loop header.
196 static void CheckLoopBlocks(Loop* loop,
198 SCOPED_TRACE("Check loop " + std::to_string(loop->GetHeaderBlock()->id()));
199 for (uint32_t bb_id : loop->GetBlocks()) {
203 EXPECT_FALSE(loop->IsInsideLoop(loop->GetMergeBlock()));
351 // Not in a loop.
354 // Check that we can map basic block to the correct loop.
355 // The following block ids do not belong to a loop.
362 Loop* loop = ld[23];
363 CheckLoopBlocks(loop, &basic_block_in_loop);
365 EXPECT_TRUE(loop->HasNestedLoops());
366 EXPECT_FALSE(loop->IsNested());
367 EXPECT_EQ(loop->GetDepth(), 1u);
368 EXPECT_EQ(std::distance(loop->begin(), loop->end()), 1u);
369 EXPECT_EQ(loop->GetPreHeaderBlock(), spvtest::GetBasicBlock(f, 22));
370 EXPECT_EQ(loop->GetHeaderBlock(), spvtest::GetBasicBlock(f, 23));
371 EXPECT_EQ(loop->GetLatchBlock(), spvtest::GetBasicBlock(f, 25));
372 EXPECT_EQ(loop->GetMergeBlock(), spvtest::GetBasicBlock(f, 24));
373 EXPECT_FALSE(loop->IsInsideLoop(loop->GetMergeBlock()));
374 EXPECT_FALSE(loop->IsInsideLoop(loop->GetPreHeaderBlock()));
380 Loop* loop = ld[30];
381 CheckLoopBlocks(loop, &basic_block_in_loop);
383 EXPECT_TRUE(loop->HasNestedLoops());
384 EXPECT_TRUE(loop->IsNested());
385 EXPECT_EQ(loop->GetDepth(), 2u);
386 EXPECT_EQ(std::distance(loop->begin(), loop->end()), 2u);
387 EXPECT_EQ(loop->GetPreHeaderBlock(), spvtest::GetBasicBlock(f, 29));
388 EXPECT_EQ(loop->GetHeaderBlock(), spvtest::GetBasicBlock(f, 30));
389 EXPECT_EQ(loop->GetLatchBlock(), spvtest::GetBasicBlock(f, 32));
390 EXPECT_EQ(loop->GetMergeBlock(), spvtest::GetBasicBlock(f, 31));
391 EXPECT_FALSE(loop->IsInsideLoop(loop->GetMergeBlock()));
392 EXPECT_FALSE(loop->IsInsideLoop(loop->GetPreHeaderBlock()));
397 Loop* loop = ld[41];
398 CheckLoopBlocks(loop, &basic_block_in_loop);
400 EXPECT_FALSE(loop->HasNestedLoops());
401 EXPECT_TRUE(loop->IsNested());
402 EXPECT_EQ(loop->GetDepth(), 3u);
403 EXPECT_EQ(std::distance(loop->begin(), loop->end()), 0u);
404 EXPECT_EQ(loop->GetPreHeaderBlock(), spvtest::GetBasicBlock(f, 40));
405 EXPECT_EQ(loop->GetHeaderBlock(), spvtest::GetBasicBlock(f, 41));
406 EXPECT_EQ(loop->GetLatchBlock(), spvtest::GetBasicBlock(f, 43));
407 EXPECT_EQ(loop->GetMergeBlock(), spvtest::GetBasicBlock(f, 42));
408 EXPECT_FALSE(loop->IsInsideLoop(loop->GetMergeBlock()));
409 EXPECT_FALSE(loop->IsInsideLoop(loop->GetPreHeaderBlock()));
414 Loop* loop = ld[50];
415 CheckLoopBlocks(loop, &basic_block_in_loop);
417 EXPECT_FALSE(loop->HasNestedLoops());
418 EXPECT_TRUE(loop->IsNested());
419 EXPECT_EQ(loop->GetDepth(), 3u);
420 EXPECT_EQ(std::distance(loop->begin(), loop->end()), 0u);
421 EXPECT_EQ(loop->GetPreHeaderBlock(), spvtest::GetBasicBlock(f, 39));
422 EXPECT_EQ(loop->GetHeaderBlock(), spvtest::GetBasicBlock(f, 50));
423 EXPECT_EQ(loop->GetLatchBlock(), spvtest::GetBasicBlock(f, 52));
424 EXPECT_EQ(loop->GetMergeBlock(), spvtest::GetBasicBlock(f, 51));
425 EXPECT_FALSE(loop->IsInsideLoop(loop->GetMergeBlock()));
426 EXPECT_FALSE(loop->IsInsideLoop(loop->GetPreHeaderBlock()));
429 // Make sure LoopDescriptor gives us the inner most loop when we query for
432 if (Loop* loop = ld[&bb]) {
434 make_range(++TreeDFIterator<Loop>(loop), TreeDFIterator<Loop>())) {
573 Loop& loop = *ld[22];
574 EXPECT_TRUE(loop.HasNestedLoops());
575 EXPECT_FALSE(loop.IsNested());
576 EXPECT_EQ(loop.GetDepth(), 1u);
577 EXPECT_EQ(loop.GetParent(), nullptr);
581 Loop& loop = *ld[29];
582 EXPECT_TRUE(loop.HasNestedLoops());
583 EXPECT_TRUE(loop.IsNested());
584 EXPECT_EQ(loop.GetDepth(), 2u);
585 EXPECT_EQ(loop.GetParent(), ld[22]);
589 Loop& loop = *ld[36];
590 EXPECT_FALSE(loop.HasNestedLoops());
591 EXPECT_TRUE(loop.IsNested());
592 EXPECT_EQ(loop.GetDepth(), 3u);
593 EXPECT_EQ(loop.GetParent(), ld[29]);
597 Loop& loop = *ld[47];
598 EXPECT_FALSE(loop.HasNestedLoops());
599 EXPECT_TRUE(loop.IsNested());
600 EXPECT_EQ(loop.GetDepth(), 2u);
601 EXPECT_EQ(loop.GetParent(), ld[22]);
607 The preheader of loop %33 and %41 were removed as well.
716 Loop& loop = *ld[16];
717 EXPECT_TRUE(loop.HasNestedLoops());
718 EXPECT_FALSE(loop.IsNested());
719 EXPECT_EQ(loop.GetDepth(), 1u);
720 EXPECT_EQ(loop.GetParent(), nullptr);
724 Loop& loop = *ld[33];
725 EXPECT_EQ(loop.GetPreHeaderBlock(), nullptr);
726 EXPECT_NE(loop.GetOrCreatePreHeaderBlock(), nullptr);
727 // Make sure the loop descriptor was properly updated.
728 EXPECT_EQ(ld[loop.GetPreHeaderBlock()], ld[16]);
731 cfg->preds(loop.GetPreHeaderBlock()->id());
737 loop.GetPreHeaderBlock()->ForEachPhiInst([&pred_set](Instruction* phi) {
745 cfg->preds(loop.GetHeaderBlock()->id());
748 EXPECT_TRUE(pred_set.count(loop.GetPreHeaderBlock()->id()));
751 loop.GetHeaderBlock()->ForEachPhiInst([&pred_set](Instruction* phi) {
760 Loop& loop = *ld[41];
761 EXPECT_EQ(loop.GetPreHeaderBlock(), nullptr);
762 EXPECT_NE(loop.GetOrCreatePreHeaderBlock(), nullptr);
763 EXPECT_EQ(ld[loop.GetPreHeaderBlock()], nullptr);
764 EXPECT_EQ(cfg->preds(loop.GetPreHeaderBlock()->id()).size(), 1u);
765 EXPECT_EQ(cfg->preds(loop.GetPreHeaderBlock()->id())[0], 25u);
767 loop.GetPreHeaderBlock()->ForEachPhiInst([](Instruction* phi) {
773 cfg->preds(loop.GetHeaderBlock()->id());
776 EXPECT_TRUE(pred_set.count(loop.GetPreHeaderBlock()->id()));
779 loop.GetHeaderBlock()->ForEachPhiInst([&pred_set](Instruction* phi) {