@@ -147,14 +147,57 @@ exit:
147147}
148148
149149; 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.next can be hoisted.
155153define i32 @test_chained_first_order_recurrences_4 (ptr %base , i64 %x ) {
156154; 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: CLONE ir<%gep> = getelementptr ir<%base>, vp<[[SCALAR_STEPS]]>
171+ ; CHECK-NEXT: EMIT vp<[[SPLICE_X:%.]]> = first-order splice ir<%for.x>, ir<%for.x.next>
172+ ; CHECK-NEXT: WIDEN-CAST ir<%for.x.prev> = trunc vp<[[SPLICE_X]]> to i32
173+ ; CHECK-NEXT: EMIT vp<[[SPLICE_Y:%.+]]> = first-order splice ir<%for.y>, ir<%for.x.prev>
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:%.+]]>.1 = 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:%.+]]>.1 = resume-phi vp<[[EXT_Y]]>.1, 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]]>.1
200+ ; CHECK-NEXT: }
158201;
159202entry:
160203 br label %loop
@@ -178,7 +221,54 @@ ret:
178221
179222define i32 @test_chained_first_order_recurrences_5_hoist_to_load (ptr %base ) {
180223; 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:%.+]]>.1 = 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:%.+]]>.1 = resume-phi vp<[[EXT_Y]]>.1, 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]]>.1
271+ ; CHECK-NEXT: }
182272;
183273entry:
184274 br label %loop
0 commit comments