10e13ccc6SFlorian Hahn //===- llvm/unittests/Transforms/Vectorize/VPDomTreeTests.cpp - -----------===// 20e13ccc6SFlorian Hahn // 30e13ccc6SFlorian Hahn // 40e13ccc6SFlorian Hahn // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50e13ccc6SFlorian Hahn // See https://llvm.org/LICENSE.txt for license information. 60e13ccc6SFlorian Hahn // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70e13ccc6SFlorian Hahn // 80e13ccc6SFlorian Hahn //===----------------------------------------------------------------------===// 90e13ccc6SFlorian Hahn 100e13ccc6SFlorian Hahn #include "../lib/Transforms/Vectorize/VPlan.h" 110e13ccc6SFlorian Hahn #include "../lib/Transforms/Vectorize/VPlanDominatorTree.h" 128caeb2e0SFlorian Hahn #include "VPlanTestBase.h" 130e13ccc6SFlorian Hahn #include "gtest/gtest.h" 140e13ccc6SFlorian Hahn 150e13ccc6SFlorian Hahn namespace llvm { 160e13ccc6SFlorian Hahn namespace { 170e13ccc6SFlorian Hahn 188caeb2e0SFlorian Hahn using VPDominatorTreeTest = VPlanTestBase; 198caeb2e0SFlorian Hahn 208caeb2e0SFlorian Hahn TEST_F(VPDominatorTreeTest, DominanceNoRegionsTest) { 212c9d21a2SFlorian Hahn // VPBB0 222c9d21a2SFlorian Hahn // | 230e13ccc6SFlorian Hahn // R1 { 240e13ccc6SFlorian Hahn // VPBB1 250e13ccc6SFlorian Hahn // / \ 260e13ccc6SFlorian Hahn // VPBB2 VPBB3 270e13ccc6SFlorian Hahn // \ / 280e13ccc6SFlorian Hahn // VPBB4 290e13ccc6SFlorian Hahn // } 308caeb2e0SFlorian Hahn VPlan &Plan = getPlan(); 318caeb2e0SFlorian Hahn VPBasicBlock *VPBB0 = Plan.getEntry(); 32*16d19aaeSFlorian Hahn VPBasicBlock *VPBB1 = Plan.createVPBasicBlock("VPBB1"); 33*16d19aaeSFlorian Hahn VPBasicBlock *VPBB2 = Plan.createVPBasicBlock("VPBB2"); 34*16d19aaeSFlorian Hahn VPBasicBlock *VPBB3 = Plan.createVPBasicBlock("VPBB3"); 35*16d19aaeSFlorian Hahn VPBasicBlock *VPBB4 = Plan.createVPBasicBlock("VPBB4"); 36*16d19aaeSFlorian Hahn VPRegionBlock *R1 = Plan.createVPRegionBlock(VPBB1, VPBB4); 370e13ccc6SFlorian Hahn VPBB2->setParent(R1); 380e13ccc6SFlorian Hahn VPBB3->setParent(R1); 390e13ccc6SFlorian Hahn 402c9d21a2SFlorian Hahn VPBlockUtils::connectBlocks(VPBB0, R1); 410e13ccc6SFlorian Hahn VPBlockUtils::connectBlocks(VPBB1, VPBB2); 420e13ccc6SFlorian Hahn VPBlockUtils::connectBlocks(VPBB1, VPBB3); 430e13ccc6SFlorian Hahn VPBlockUtils::connectBlocks(VPBB2, VPBB4); 440e13ccc6SFlorian Hahn VPBlockUtils::connectBlocks(VPBB3, VPBB4); 450e13ccc6SFlorian Hahn 468caeb2e0SFlorian Hahn VPBlockUtils::connectBlocks(R1, Plan.getScalarHeader()); 47b021464dSFlorian Hahn 480e13ccc6SFlorian Hahn VPDominatorTree VPDT; 49bf9e0da1SFlorian Hahn VPDT.recalculate(Plan); 500e13ccc6SFlorian Hahn 510e13ccc6SFlorian Hahn EXPECT_TRUE(VPDT.dominates(VPBB1, VPBB4)); 520e13ccc6SFlorian Hahn EXPECT_FALSE(VPDT.dominates(VPBB4, VPBB1)); 530e13ccc6SFlorian Hahn 540e13ccc6SFlorian Hahn EXPECT_TRUE(VPDT.dominates(VPBB1, VPBB2)); 550e13ccc6SFlorian Hahn EXPECT_FALSE(VPDT.dominates(VPBB2, VPBB1)); 560e13ccc6SFlorian Hahn 570e13ccc6SFlorian Hahn EXPECT_TRUE(VPDT.dominates(VPBB1, VPBB3)); 580e13ccc6SFlorian Hahn EXPECT_FALSE(VPDT.dominates(VPBB3, VPBB1)); 590e13ccc6SFlorian Hahn 600e13ccc6SFlorian Hahn EXPECT_EQ(VPDT.findNearestCommonDominator(VPBB2, VPBB3), VPBB1); 610e13ccc6SFlorian Hahn EXPECT_EQ(VPDT.findNearestCommonDominator(VPBB2, VPBB4), VPBB1); 620e13ccc6SFlorian Hahn EXPECT_EQ(VPDT.findNearestCommonDominator(VPBB4, VPBB4), VPBB4); 630e13ccc6SFlorian Hahn } 64bf9e0da1SFlorian Hahn 65bf9e0da1SFlorian Hahn static void 66bf9e0da1SFlorian Hahn checkDomChildren(VPDominatorTree &VPDT, VPBlockBase *Src, 67bf9e0da1SFlorian Hahn std::initializer_list<VPBlockBase *> ExpectedChildren) { 68bf9e0da1SFlorian Hahn SmallVector<VPDomTreeNode *> Children(VPDT.getNode(Src)->children()); 69bf9e0da1SFlorian Hahn SmallVector<VPDomTreeNode *> ExpectedNodes; 70bf9e0da1SFlorian Hahn for (VPBlockBase *C : ExpectedChildren) 71bf9e0da1SFlorian Hahn ExpectedNodes.push_back(VPDT.getNode(C)); 72bf9e0da1SFlorian Hahn 73bf9e0da1SFlorian Hahn EXPECT_EQ(Children, ExpectedNodes); 74bf9e0da1SFlorian Hahn } 75bf9e0da1SFlorian Hahn 768caeb2e0SFlorian Hahn TEST_F(VPDominatorTreeTest, DominanceRegionsTest) { 77bf9e0da1SFlorian Hahn { 78bf9e0da1SFlorian Hahn // 2 consecutive regions. 792c9d21a2SFlorian Hahn // VPBB0 802c9d21a2SFlorian Hahn // | 81bf9e0da1SFlorian Hahn // R1 { 82bf9e0da1SFlorian Hahn // \ 83bf9e0da1SFlorian Hahn // R1BB1 _ 84bf9e0da1SFlorian Hahn // / \ / \ 85bf9e0da1SFlorian Hahn // R1BB2 R1BB3 | 86bf9e0da1SFlorian Hahn // \ / \_/ 87bf9e0da1SFlorian Hahn // R1BB4 88bf9e0da1SFlorian Hahn // } 89bf9e0da1SFlorian Hahn // | 90bf9e0da1SFlorian Hahn // R2 { 91bf9e0da1SFlorian Hahn // \ 92bf9e0da1SFlorian Hahn // R2BB1 93bf9e0da1SFlorian Hahn // | 94bf9e0da1SFlorian Hahn // R2BB2 95bf9e0da1SFlorian Hahn // } 96bf9e0da1SFlorian Hahn // 978caeb2e0SFlorian Hahn VPlan &Plan = getPlan(); 988caeb2e0SFlorian Hahn VPBasicBlock *VPBB0 = Plan.getEntry(); 99*16d19aaeSFlorian Hahn VPBasicBlock *R1BB1 = Plan.createVPBasicBlock(""); 100*16d19aaeSFlorian Hahn VPBasicBlock *R1BB2 = Plan.createVPBasicBlock(""); 101*16d19aaeSFlorian Hahn VPBasicBlock *R1BB3 = Plan.createVPBasicBlock(""); 102*16d19aaeSFlorian Hahn VPBasicBlock *R1BB4 = Plan.createVPBasicBlock(""); 103*16d19aaeSFlorian Hahn VPRegionBlock *R1 = Plan.createVPRegionBlock(R1BB1, R1BB4, "R1"); 104bf9e0da1SFlorian Hahn R1BB2->setParent(R1); 105bf9e0da1SFlorian Hahn R1BB3->setParent(R1); 1062c9d21a2SFlorian Hahn VPBlockUtils::connectBlocks(VPBB0, R1); 107bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB1, R1BB2); 108bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB1, R1BB3); 109bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB2, R1BB4); 110bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB3, R1BB4); 111bf9e0da1SFlorian Hahn // Cycle. 112bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB3, R1BB3); 113bf9e0da1SFlorian Hahn 114*16d19aaeSFlorian Hahn VPBasicBlock *R2BB1 = Plan.createVPBasicBlock(""); 115*16d19aaeSFlorian Hahn VPBasicBlock *R2BB2 = Plan.createVPBasicBlock(""); 116*16d19aaeSFlorian Hahn VPRegionBlock *R2 = Plan.createVPRegionBlock(R2BB1, R2BB2, "R2"); 117bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R2BB1, R2BB2); 118bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1, R2); 119bf9e0da1SFlorian Hahn 1208caeb2e0SFlorian Hahn VPBlockUtils::connectBlocks(R2, Plan.getScalarHeader()); 121bf9e0da1SFlorian Hahn VPDominatorTree VPDT; 122bf9e0da1SFlorian Hahn VPDT.recalculate(Plan); 123bf9e0da1SFlorian Hahn 124bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1, {R1BB1}); 125bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB1, {R1BB2, R1BB4, R1BB3}); 126bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB2, {}); 127bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB3, {}); 128bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB4, {R2}); 129bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R2, {R2BB1}); 130bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R2BB1, {R2BB2}); 131bf9e0da1SFlorian Hahn 132bf9e0da1SFlorian Hahn EXPECT_TRUE(VPDT.dominates(R1, R2)); 133bf9e0da1SFlorian Hahn EXPECT_FALSE(VPDT.dominates(R2, R1)); 134bf9e0da1SFlorian Hahn 135bf9e0da1SFlorian Hahn EXPECT_TRUE(VPDT.dominates(R1BB1, R1BB4)); 136bf9e0da1SFlorian Hahn EXPECT_FALSE(VPDT.dominates(R1BB4, R1BB1)); 137bf9e0da1SFlorian Hahn 138bf9e0da1SFlorian Hahn EXPECT_TRUE(VPDT.dominates(R2BB1, R2BB2)); 139bf9e0da1SFlorian Hahn EXPECT_FALSE(VPDT.dominates(R2BB2, R2BB1)); 140bf9e0da1SFlorian Hahn 141bf9e0da1SFlorian Hahn EXPECT_TRUE(VPDT.dominates(R1BB1, R2BB1)); 142bf9e0da1SFlorian Hahn EXPECT_FALSE(VPDT.dominates(R2BB1, R1BB1)); 143bf9e0da1SFlorian Hahn 144bf9e0da1SFlorian Hahn EXPECT_TRUE(VPDT.dominates(R1BB4, R2BB1)); 145bf9e0da1SFlorian Hahn EXPECT_FALSE(VPDT.dominates(R1BB3, R2BB1)); 146bf9e0da1SFlorian Hahn 147bf9e0da1SFlorian Hahn EXPECT_TRUE(VPDT.dominates(R1, R2BB1)); 148bf9e0da1SFlorian Hahn EXPECT_FALSE(VPDT.dominates(R2BB1, R1)); 149bf9e0da1SFlorian Hahn } 150bf9e0da1SFlorian Hahn 151bf9e0da1SFlorian Hahn { 152bf9e0da1SFlorian Hahn // 2 nested regions. 153bf9e0da1SFlorian Hahn // VPBB1 154bf9e0da1SFlorian Hahn // | 155bf9e0da1SFlorian Hahn // R1 { 156bf9e0da1SFlorian Hahn // R1BB1 157bf9e0da1SFlorian Hahn // / \ 158bf9e0da1SFlorian Hahn // R2 { | 159bf9e0da1SFlorian Hahn // \ | 160bf9e0da1SFlorian Hahn // R2BB1 | 161bf9e0da1SFlorian Hahn // | \ R1BB2 162bf9e0da1SFlorian Hahn // R2BB2-/ | 163bf9e0da1SFlorian Hahn // \ | 164bf9e0da1SFlorian Hahn // R2BB3 | 165bf9e0da1SFlorian Hahn // } / 166bf9e0da1SFlorian Hahn // \ / 167bf9e0da1SFlorian Hahn // R1BB3 168bf9e0da1SFlorian Hahn // } 169bf9e0da1SFlorian Hahn // | 170bf9e0da1SFlorian Hahn // VPBB2 171bf9e0da1SFlorian Hahn // 1728caeb2e0SFlorian Hahn VPlan &Plan = getPlan(); 173*16d19aaeSFlorian Hahn VPBasicBlock *R1BB1 = Plan.createVPBasicBlock("R1BB1"); 174*16d19aaeSFlorian Hahn VPBasicBlock *R1BB2 = Plan.createVPBasicBlock("R1BB2"); 175*16d19aaeSFlorian Hahn VPBasicBlock *R1BB3 = Plan.createVPBasicBlock("R1BB3"); 176*16d19aaeSFlorian Hahn VPRegionBlock *R1 = Plan.createVPRegionBlock(R1BB1, R1BB3, "R1"); 177bf9e0da1SFlorian Hahn 178*16d19aaeSFlorian Hahn VPBasicBlock *R2BB1 = Plan.createVPBasicBlock("R2BB1"); 179*16d19aaeSFlorian Hahn VPBasicBlock *R2BB2 = Plan.createVPBasicBlock("R2BB2"); 180*16d19aaeSFlorian Hahn VPBasicBlock *R2BB3 = Plan.createVPBasicBlock("R2BB#"); 181*16d19aaeSFlorian Hahn VPRegionBlock *R2 = Plan.createVPRegionBlock(R2BB1, R2BB3, "R2"); 182bf9e0da1SFlorian Hahn R2BB2->setParent(R2); 183bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R2BB1, R2BB2); 184bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R2BB2, R2BB1); 185bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R2BB2, R2BB3); 186bf9e0da1SFlorian Hahn 187bf9e0da1SFlorian Hahn R2->setParent(R1); 188bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB1, R2); 189bf9e0da1SFlorian Hahn R1BB2->setParent(R1); 190bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB1, R1BB2); 191bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1BB2, R1BB3); 192bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R2, R1BB3); 193bf9e0da1SFlorian Hahn 1948caeb2e0SFlorian Hahn VPBasicBlock *VPBB1 = Plan.getEntry(); 195bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(VPBB1, R1); 196*16d19aaeSFlorian Hahn VPBasicBlock *VPBB2 = Plan.createVPBasicBlock("VPBB2"); 197bf9e0da1SFlorian Hahn VPBlockUtils::connectBlocks(R1, VPBB2); 198bf9e0da1SFlorian Hahn 1998caeb2e0SFlorian Hahn VPBlockUtils::connectBlocks(VPBB2, Plan.getScalarHeader()); 200bf9e0da1SFlorian Hahn VPDominatorTree VPDT; 201bf9e0da1SFlorian Hahn VPDT.recalculate(Plan); 202bf9e0da1SFlorian Hahn 203bf9e0da1SFlorian Hahn checkDomChildren(VPDT, VPBB1, {R1}); 204bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1, {R1BB1}); 205bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB1, {R2, R1BB3, R1BB2}); 206bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB2, {}); 207bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R2, {R2BB1}); 208bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R2BB1, {R2BB2}); 209bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R2BB2, {R2BB3}); 210bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R2BB3, {}); 211bf9e0da1SFlorian Hahn checkDomChildren(VPDT, R1BB3, {VPBB2}); 2128caeb2e0SFlorian Hahn checkDomChildren(VPDT, VPBB2, {Plan.getScalarHeader()}); 213bf9e0da1SFlorian Hahn } 214bf9e0da1SFlorian Hahn } 215bf9e0da1SFlorian Hahn 2160e13ccc6SFlorian Hahn } // namespace 2170e13ccc6SFlorian Hahn } // namespace llvm 218