@@ -51,13 +51,15 @@ TEST_F(VPlanHCFGTest, testBuildHCFGInnerLoop) {
5151 // Check that the region following the preheader consists of a block for the
5252 // original header and a separate latch.
5353 VPBasicBlock *VecBB = Plan->getVectorLoopRegion ()->getEntryBasicBlock ();
54- EXPECT_EQ (7u , VecBB->size ());
54+ EXPECT_EQ (10u , VecBB->size ());
5555 EXPECT_EQ (0u , VecBB->getNumPredecessors ());
5656 EXPECT_EQ (0u , VecBB->getNumSuccessors ());
5757 EXPECT_EQ (VecBB->getParent ()->getEntryBasicBlock (), VecBB);
5858 EXPECT_EQ (&*Plan, VecBB->getPlan ());
5959
6060 auto Iter = VecBB->begin ();
61+ auto *CanIV = dyn_cast<VPCanonicalIVPHIRecipe>(&*Iter++);
62+ EXPECT_NE (nullptr , CanIV);
6163 VPWidenPHIRecipe *Phi = dyn_cast<VPWidenPHIRecipe>(&*Iter++);
6264 EXPECT_NE (nullptr , Phi);
6365
@@ -100,7 +102,7 @@ TEST_F(VPlanHCFGTest, testBuildHCFGInnerLoop) {
100102 raw_string_ostream OS (FullDump);
101103 Plan->printDOT (OS);
102104 const char *ExpectedStr = R"( digraph VPlan {
103- graph [labelloc=t, fontsize=30; label="Vectorization Plan\n for UF\>=1\nLive-in vp\<%0\> = vector-trip-count\nLive-in ir\<%N\> = original trip-count\n"]
105+ graph [labelloc=t, fontsize=30; label="Vectorization Plan\n for UF\>=1\nLive-in vp\<%0\> = VF * UF\nLive-in vp\<%1\> = vector-trip-count\nLive-in ir\<%N\> = original trip-count\n"]
104106node [shape=rect, fontname=Courier, fontsize=30]
105107edge [fontname=Courier, fontsize=30]
106108compound=true
@@ -119,20 +121,23 @@ compound=true
119121 label="\<x1\> vector loop"
120122 N2 [label =
121123 "vector.body:\l" +
124+ " EMIT vp\<%2\> = CANONICAL-INDUCTION ir\<0\>, vp\<%index.next\>\l" +
122125 " WIDEN-PHI ir\<%indvars.iv\> = phi ir\<0\>, ir\<%indvars.iv.next\>\l" +
123126 " EMIT ir\<%arr.idx\> = getelementptr ir\<%A\>, ir\<%indvars.iv\>\l" +
124127 " EMIT ir\<%l1\> = load ir\<%arr.idx\>\l" +
125128 " EMIT ir\<%res\> = add ir\<%l1\>, ir\<10\>\l" +
126129 " EMIT store ir\<%res\>, ir\<%arr.idx\>\l" +
127130 " EMIT ir\<%indvars.iv.next\> = add ir\<%indvars.iv\>, ir\<1\>\l" +
128131 " EMIT ir\<%exitcond\> = icmp ir\<%indvars.iv.next\>, ir\<%N\>\l" +
132+ " EMIT vp\<%index.next\> = add nuw vp\<%2\>, vp\<%0\>\l" +
133+ " EMIT branch-on-count vp\<%index.next\>, vp\<%1\>\l" +
129134 "No successors\l"
130135 ]
131136 }
132137 N2 -> N4 [ label="" ltail=cluster_N3]
133138 N4 [label =
134139 "middle.block:\l" +
135- " EMIT vp\<%cmp.n\> = icmp eq ir\<%N\>, vp\<%0 \>\l" +
140+ " EMIT vp\<%cmp.n\> = icmp eq ir\<%N\>, vp\<%1 \>\l" +
136141 " EMIT branch-on-cond vp\<%cmp.n\>\l" +
137142 "Successor(s): ir-bb\<for.end\>, scalar.ph\l"
138143 ]
@@ -207,12 +212,13 @@ TEST_F(VPlanHCFGTest, testVPInstructionToVPRecipesInner) {
207212 // Check that the region following the preheader consists of a block for the
208213 // original header and a separate latch.
209214 VPBasicBlock *VecBB = Plan->getVectorLoopRegion ()->getEntryBasicBlock ();
210- EXPECT_EQ (8u , VecBB->size ());
215+ EXPECT_EQ (11u , VecBB->size ());
211216 EXPECT_EQ (0u , VecBB->getNumPredecessors ());
212217 EXPECT_EQ (0u , VecBB->getNumSuccessors ());
213218 EXPECT_EQ (VecBB->getParent ()->getEntryBasicBlock (), VecBB);
214219
215220 auto Iter = VecBB->begin ();
221+ EXPECT_NE (nullptr , dyn_cast<VPCanonicalIVPHIRecipe>(&*Iter++));
216222 EXPECT_NE (nullptr , dyn_cast<VPWidenPHIRecipe>(&*Iter++));
217223 EXPECT_NE (nullptr , dyn_cast<VPWidenGEPRecipe>(&*Iter++));
218224 EXPECT_NE (nullptr , dyn_cast<VPWidenMemoryRecipe>(&*Iter++));
@@ -221,6 +227,8 @@ TEST_F(VPlanHCFGTest, testVPInstructionToVPRecipesInner) {
221227 EXPECT_NE (nullptr , dyn_cast<VPWidenRecipe>(&*Iter++));
222228 EXPECT_NE (nullptr , dyn_cast<VPWidenRecipe>(&*Iter++));
223229 EXPECT_NE (nullptr , dyn_cast<VPInstruction>(&*Iter++));
230+ EXPECT_NE (nullptr , dyn_cast<VPInstruction>(&*Iter++));
231+ EXPECT_NE (nullptr , dyn_cast<VPInstruction>(&*Iter++));
224232 EXPECT_EQ (VecBB->end (), Iter);
225233}
226234
@@ -261,7 +269,7 @@ TEST_F(VPlanHCFGTest, testBuildHCFGInnerLoopMultiExit) {
261269 raw_string_ostream OS (FullDump);
262270 Plan->printDOT (OS);
263271 const char *ExpectedStr = R"( digraph VPlan {
264- graph [labelloc=t, fontsize=30; label="Vectorization Plan\n for UF\>=1\nLive-in vp\<%0\> = vector-trip-count\nLive-in ir\<%N\> = original trip-count\n"]
272+ graph [labelloc=t, fontsize=30; label="Vectorization Plan\n for UF\>=1\nLive-in vp\<%0\> = VF * UF\nLive-in vp\<%1\> = vector-trip-count\nLive-in ir\<%N\> = original trip-count\n"]
265273node [shape=rect, fontname=Courier, fontsize=30]
266274edge [fontname=Courier, fontsize=30]
267275compound=true
@@ -280,6 +288,7 @@ compound=true
280288 label="\<x1\> vector loop"
281289 N2 [label =
282290 "vector.body:\l" +
291+ " EMIT vp\<%2\> = CANONICAL-INDUCTION ir\<0\>, vp\<%index.next\>\l" +
283292 " WIDEN-PHI ir\<%iv\> = phi ir\<0\>, ir\<%iv.next\>\l" +
284293 " EMIT ir\<%arr.idx\> = getelementptr ir\<%A\>, ir\<%iv\>\l" +
285294 " EMIT ir\<%l1\> = load ir\<%arr.idx\>\l" +
@@ -293,13 +302,15 @@ compound=true
293302 " EMIT store ir\<%res\>, ir\<%arr.idx\>\l" +
294303 " EMIT ir\<%iv.next\> = add ir\<%iv\>, ir\<1\>\l" +
295304 " EMIT ir\<%exitcond\> = icmp ir\<%iv.next\>, ir\<%N\>\l" +
305+ " EMIT vp\<%index.next\> = add nuw vp\<%2\>, vp\<%0\>\l" +
306+ " EMIT branch-on-count vp\<%index.next\>, vp\<%1\>\l" +
296307 "No successors\l"
297308 ]
298309 }
299310 N4 -> N5 [ label="" ltail=cluster_N3]
300311 N5 [label =
301312 "middle.block:\l" +
302- " EMIT vp\<%cmp.n\> = icmp eq ir\<%N\>, vp\<%0 \>\l" +
313+ " EMIT vp\<%cmp.n\> = icmp eq ir\<%N\>, vp\<%1 \>\l" +
303314 " EMIT branch-on-cond vp\<%cmp.n\>\l" +
304315 "Successor(s): ir-bb\<exit.2\>, scalar.ph\l"
305316 ]
0 commit comments