@@ -147,14 +147,57 @@ exit:
147
147
}
148
148
149
149
; This test has two FORs (for.x and for.y) where incoming value from the previous
150
- ; iteration (for.x.prev) of one FOR (for.y) depends on another FOR (for.x). Due to
151
- ; this dependency all uses of the former FOR (for.y) should be sunk after
152
- ; incoming value from the previous iteration (for.x.prev) of te latter FOR (for.y).
153
- ; That means side-effecting user (store i64 %for.y.i64, ptr %gep) of the latter
154
- ; FOR (for.y) should be moved which is not currently supported.
150
+ ; iteration (for.x.prev) of one FOR (for.y) depends on another FOR (for.x).
151
+ ; Sinking would require moving a recipe with side effects (store). Instead,
152
+ ; for.x.prev can be hoisted.
155
153
define i32 @test_chained_first_order_recurrences_4 (ptr %base , i64 %x ) {
156
154
; CHECK-LABEL: 'test_chained_first_order_recurrences_4'
157
- ; CHECK: No VPlans built.
155
+ ; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
156
+ ; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
157
+ ; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
158
+ ; CHECK-NEXT: Live-in ir<4098> = original trip-count
159
+ ; CHECK-EMPTY:
160
+ ; CHECK-NEXT: vector.ph:
161
+ ; CHECK-NEXT: WIDEN ir<%for.x.next> = mul ir<%x>, ir<2>
162
+ ; CHECK-NEXT: Successor(s): vector loop
163
+ ; CHECK-EMPTY:
164
+ ; CHECK-NEXT: <x1> vector loop: {
165
+ ; CHECK-NEXT: vector.body:
166
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
167
+ ; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.x> = phi ir<0>, ir<%for.x.next>
168
+ ; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.y> = phi ir<0>, ir<%for.x.prev>
169
+ ; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
170
+ ; CHECK-NEXT: EMIT vp<[[SPLICE_X:%.]]> = first-order splice ir<%for.x>, ir<%for.x.next>
171
+ ; CHECK-NEXT: WIDEN-CAST ir<%for.x.prev> = trunc vp<[[SPLICE_X]]> to i32
172
+ ; CHECK-NEXT: EMIT vp<[[SPLICE_Y:%.+]]> = first-order splice ir<%for.y>, ir<%for.x.prev>
173
+ ; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%base>, vp<[[SCALAR_STEPS]]>
174
+ ; CHECK-NEXT: WIDEN-CAST ir<%for.y.i64> = sext vp<[[SPLICE_Y]]> to i64
175
+ ; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
176
+ ; CHECK-NEXT: WIDEN store vp<[[VEC_PTR]]>, ir<%for.y.i64>
177
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
178
+ ; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VTC]]>
179
+ ; CHECK-NEXT: No successors
180
+ ; CHECK-NEXT: }
181
+ ; CHECK-NEXT: Successor(s): middle.block
182
+ ; CHECK-EMPTY:
183
+ ; CHECK-NEXT: middle.block:
184
+ ; CHECK-NEXT: EMIT vp<[[EXT_X:%.+]]> = extract-from-end ir<%for.x.next>, ir<1>
185
+ ; CHECK-NEXT: EMIT vp<[[EXT_Y:%.+]]> = extract-from-end ir<%for.x.prev>, ir<1>
186
+ ; CHECK-NEXT: EMIT vp<[[MIDDLE_C:%.+]]> = icmp eq ir<4098>, vp<[[VTC]]>
187
+ ; CHECK-NEXT: EMIT branch-on-cond vp<[[MIDDLE_C]]>
188
+ ; CHECK-NEXT: Successor(s): ir-bb<ret>, scalar.ph
189
+ ; CHECK-EMPTY:
190
+ ; CHECK-NEXT: ir-bb<ret>:
191
+ ; CHECK-NEXT: No successors
192
+ ; CHECK-EMPTY:
193
+ ; CHECK-NEXT: scalar.ph:
194
+ ; CHECK-NEXT: EMIT vp<[[RESUME_X:%.+]]> = resume-phi vp<[[EXT_X]]>, ir<0>
195
+ ; CHECK-NEXT: EMIT vp<[[RESUME_Y:%.+]]> = resume-phi vp<[[EXT_Y]]>, ir<0>
196
+ ; CHECK-NEXT: No successors
197
+ ; CHECK-EMPTY:
198
+ ; CHECK-NEXT: Live-out i64 %for.x = vp<[[RESUME_X]]>
199
+ ; CHECK-NEXT: Live-out i32 %for.y = vp<[[RESUME_Y]]>
200
+ ; CHECK-NEXT: }
158
201
;
159
202
entry:
160
203
br label %loop
@@ -178,7 +221,54 @@ ret:
178
221
179
222
define i32 @test_chained_first_order_recurrences_5_hoist_to_load (ptr %base ) {
180
223
; CHECK-LABEL: 'test_chained_first_order_recurrences_5_hoist_to_load'
181
- ; CHECK: No VPlans built.
224
+ ; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
225
+ ; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
226
+ ; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
227
+ ; CHECK-NEXT: Live-in ir<4098> = original trip-count
228
+ ; CHECK-EMPTY:
229
+ ; CHECK-NEXT: vector.ph:
230
+ ; CHECK-NEXT: Successor(s): vector loop
231
+ ; CHECK-EMPTY:
232
+ ; CHECK-NEXT: <x1> vector loop: {
233
+ ; CHECK-NEXT: vector.body:
234
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
235
+ ; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.x> = phi ir<0>, ir<%for.x.next>
236
+ ; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for.y> = phi ir<0>, ir<%for.x.prev>
237
+ ; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
238
+ ; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%base>, vp<[[SCALAR_STEPS]]>
239
+ ; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
240
+ ; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VEC_PTR]]>
241
+ ; CHECK-NEXT: WIDEN ir<%for.x.next> = mul ir<%l>, ir<2>
242
+ ; CHECK-NEXT: EMIT vp<[[SPLICE_X:%.]]> = first-order splice ir<%for.x>, ir<%for.x.next>
243
+ ; CHECK-NEXT: WIDEN-CAST ir<%for.x.prev> = trunc vp<[[SPLICE_X]]> to i32
244
+ ; CHECK-NEXT: EMIT vp<[[SPLICE_Y:%.+]]> = first-order splice ir<%for.y>, ir<%for.x.prev>
245
+ ; CHECK-NEXT: WIDEN-CAST ir<%for.y.i64> = sext vp<[[SPLICE_Y]]> to i64
246
+ ; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep>
247
+ ; CHECK-NEXT: WIDEN store vp<[[VEC_PTR]]>, ir<%for.y.i64>
248
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
249
+ ; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VTC]]>
250
+ ; CHECK-NEXT: No successors
251
+ ; CHECK-NEXT: }
252
+ ; CHECK-NEXT: Successor(s): middle.block
253
+ ; CHECK-EMPTY:
254
+ ; CHECK-NEXT: middle.block:
255
+ ; CHECK-NEXT: EMIT vp<[[EXT_X:%.+]]> = extract-from-end ir<%for.x.next>, ir<1>
256
+ ; CHECK-NEXT: EMIT vp<[[EXT_Y:%.+]]> = extract-from-end ir<%for.x.prev>, ir<1>
257
+ ; CHECK-NEXT: EMIT vp<[[MIDDLE_C:%.+]]> = icmp eq ir<4098>, vp<[[VTC]]>
258
+ ; CHECK-NEXT: EMIT branch-on-cond vp<[[MIDDLE_C]]>
259
+ ; CHECK-NEXT: Successor(s): ir-bb<ret>, scalar.ph
260
+ ; CHECK-EMPTY:
261
+ ; CHECK-NEXT: ir-bb<ret>:
262
+ ; CHECK-NEXT: No successors
263
+ ; CHECK-EMPTY:
264
+ ; CHECK-NEXT: scalar.ph:
265
+ ; CHECK-NEXT: EMIT vp<[[RESUME_X:%.+]]> = resume-phi vp<[[EXT_X]]>, ir<0>
266
+ ; CHECK-NEXT: EMIT vp<[[RESUME_Y:%.+]]> = resume-phi vp<[[EXT_Y]]>, ir<0>
267
+ ; CHECK-NEXT: No successors
268
+ ; CHECK-EMPTY:
269
+ ; CHECK-NEXT: Live-out i64 %for.x = vp<[[RESUME_X]]>
270
+ ; CHECK-NEXT: Live-out i32 %for.y = vp<[[RESUME_Y]]>
271
+ ; CHECK-NEXT: }
182
272
;
183
273
entry:
184
274
br label %loop
0 commit comments