@@ -48,16 +48,19 @@ TEST_F(VPlanHCFGTest, testBuildHCFGInnerLoop) {
48
48
EXPECT_EQ (0u , Entry->getNumPredecessors ());
49
49
EXPECT_EQ (1u , Entry->getNumSuccessors ());
50
50
51
- // Check that the region following the preheader is a single basic- block
52
- // region (loop) .
51
+ // Check that the region following the preheader consists of a block for the
52
+ // original header and a separate latch .
53
53
VPBasicBlock *VecBB = Plan->getVectorLoopRegion ()->getEntryBasicBlock ();
54
- EXPECT_EQ (8u , VecBB->size ());
54
+ EXPECT_EQ (7u , VecBB->size ());
55
55
EXPECT_EQ (0u , VecBB->getNumPredecessors ());
56
- EXPECT_EQ (0u , VecBB->getNumSuccessors ());
56
+ EXPECT_EQ (1u , VecBB->getNumSuccessors ());
57
57
EXPECT_EQ (VecBB->getParent ()->getEntryBasicBlock (), VecBB);
58
- EXPECT_EQ (VecBB->getParent ()->getExitingBasicBlock (), VecBB);
59
58
EXPECT_EQ (&*Plan, VecBB->getPlan ());
60
59
60
+ VPBlockBase *VecLatch = VecBB->getSingleSuccessor ();
61
+ EXPECT_EQ (VecLatch->getParent ()->getExitingBasicBlock (), VecLatch);
62
+ EXPECT_EQ (0u , VecLatch->getNumSuccessors ());
63
+
61
64
auto Iter = VecBB->begin ();
62
65
VPWidenPHIRecipe *Phi = dyn_cast<VPWidenPHIRecipe>(&*Iter++);
63
66
EXPECT_NE (nullptr , Phi);
@@ -127,29 +130,33 @@ compound=true
127
130
" EMIT store ir\<%res\>, ir\<%arr.idx\>\l" +
128
131
" EMIT ir\<%indvars.iv.next\> = add ir\<%indvars.iv\>, ir\<1\>\l" +
129
132
" EMIT ir\<%exitcond\> = icmp ir\<%indvars.iv.next\>, ir\<%N\>\l" +
130
- " EMIT branch-on-cond ir\<%exitcond\>\l" +
133
+ "Successor(s): vector.latch\l"
134
+ ]
135
+ N2 -> N4 [ label=""]
136
+ N4 [label =
137
+ "vector.latch:\l" +
131
138
"No successors\l"
132
139
]
133
140
}
134
- N2 -> N4 [ label="" ltail=cluster_N3]
135
- N4 [label =
141
+ N4 -> N5 [ label="" ltail=cluster_N3]
142
+ N5 [label =
136
143
"middle.block:\l" +
137
144
" EMIT vp\<%cmp.n\> = icmp eq ir\<%N\>, vp\<%0\>\l" +
138
145
" EMIT branch-on-cond vp\<%cmp.n\>\l" +
139
146
"Successor(s): ir-bb\<for.end\>, scalar.ph\l"
140
147
]
141
- N4 -> N5 [ label="T"]
142
- N4 -> N6 [ label="F"]
143
- N5 [label =
148
+ N5 -> N6 [ label="T"]
149
+ N5 -> N7 [ label="F"]
150
+ N6 [label =
144
151
"ir-bb\<for.end\>:\l" +
145
152
"No successors\l"
146
153
]
147
- N6 [label =
154
+ N7 [label =
148
155
"scalar.ph:\l" +
149
156
"Successor(s): ir-bb\<for.body\>\l"
150
157
]
151
- N6 -> N7 [ label=""]
152
- N7 [label =
158
+ N7 -> N8 [ label=""]
159
+ N8 [label =
153
160
"ir-bb\<for.body\>:\l" +
154
161
" IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]\l" +
155
162
" IR %arr.idx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv\l" +
@@ -204,14 +211,17 @@ TEST_F(VPlanHCFGTest, testVPInstructionToVPRecipesInner) {
204
211
EXPECT_EQ (0u , Entry->getNumPredecessors ());
205
212
EXPECT_EQ (1u , Entry->getNumSuccessors ());
206
213
207
- // Check that the region following the preheader is a single basic- block
208
- // region (loop) .
214
+ // Check that the region following the preheader consists of a block for the
215
+ // original header and a separate latch .
209
216
VPBasicBlock *VecBB = Plan->getVectorLoopRegion ()->getEntryBasicBlock ();
210
- EXPECT_EQ (8u , VecBB->size ());
217
+ EXPECT_EQ (7u , VecBB->size ());
211
218
EXPECT_EQ (0u , VecBB->getNumPredecessors ());
212
- EXPECT_EQ (0u , VecBB->getNumSuccessors ());
219
+ EXPECT_EQ (1u , VecBB->getNumSuccessors ());
213
220
EXPECT_EQ (VecBB->getParent ()->getEntryBasicBlock (), VecBB);
214
- EXPECT_EQ (VecBB->getParent ()->getExitingBasicBlock (), VecBB);
221
+
222
+ VPBlockBase *VecLatch = VecBB->getSingleSuccessor ();
223
+ EXPECT_EQ (VecLatch->getParent ()->getExitingBasicBlock (), VecLatch);
224
+ EXPECT_EQ (0u , VecLatch->getNumSuccessors ());
215
225
216
226
auto Iter = VecBB->begin ();
217
227
EXPECT_NE (nullptr , dyn_cast<VPWidenPHIRecipe>(&*Iter++));
@@ -221,7 +231,6 @@ TEST_F(VPlanHCFGTest, testVPInstructionToVPRecipesInner) {
221
231
EXPECT_NE (nullptr , dyn_cast<VPWidenMemoryRecipe>(&*Iter++));
222
232
EXPECT_NE (nullptr , dyn_cast<VPWidenRecipe>(&*Iter++));
223
233
EXPECT_NE (nullptr , dyn_cast<VPWidenRecipe>(&*Iter++));
224
- EXPECT_NE (nullptr , dyn_cast<VPInstruction>(&*Iter++));
225
234
EXPECT_EQ (VecBB->end (), Iter);
226
235
}
227
236
0 commit comments