xref: /llvm-project/llvm/unittests/Transforms/Vectorize/VPDomTreeTest.cpp (revision 16d19aaedf347f452c22c7254934753b19803d5d)
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