Skip to content

Commit ae57165

Browse files
committed
Add vplan test for cond reduction with basic block.
1 parent a90cc38 commit ae57165

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,10 @@ bool VPlanTransforms::tryAddExplicitVectorLength(VPlan &Plan) {
13901390
GetNewMask(RedR->getCondOp()));
13911391
} else if (auto *VPInst = dyn_cast<VPInstruction>(CurRecipe)) {
13921392

1393+
// TODO: Transform
1394+
// select(HeaderMask, LHS, blend(RHS, LHS/BlendMask))
1395+
// into
1396+
// MergeUntilPivot(BlendMask, LHS, RHS, EVL)
13931397
VPValue *LHS, *RHS;
13941398
if (match(VPInst, m_Select(m_Specific(HeaderMask), m_VPValue(LHS),
13951399
m_VPValue(RHS)))) {

llvm/test/Transforms/LoopVectorize/RISCV/vplan-vp-intrinsics-reduction.ll

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,5 +206,209 @@ for.end:
206206
ret i32 %add
207207
}
208208

209+
define i32 @cond_add_pred(ptr %a, i64 %n, i32 %start) {
210+
; IF-EVL-OUTLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
211+
; IF-EVL-OUTLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
212+
; IF-EVL-OUTLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
213+
; IF-EVL-OUTLOOP-NEXT: Live-in vp<[[BTC:%[0-9]+]]> = backedge-taken count
214+
; IF-EVL-OUTLOOP-NEXT: Live-in ir<%n> = original trip-count
215+
; IF-EVL-OUTLOOP-EMPTY:
216+
; IF-EVL-OUTLOOP: vector.ph:
217+
; IF-EVL-OUTLOOP-NEXT: Successor(s): vector loop
218+
; IF-EVL-OUTLOOP-EMPTY:
219+
; IF-EVL-OUTLOOP-NEXT: <x1> vector loop: {
220+
; IF-EVL-OUTLOOP-NEXT: vector.body:
221+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
222+
; IF-EVL-OUTLOOP-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%[0-9]+]]>
223+
; IF-EVL-OUTLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
224+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[EVL_PHI]]>, ir<%n>
225+
; IF-EVL-OUTLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
226+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[WIV:%.+]]> = WIDEN-CANONICAL-INDUCTION vp<[[EVL_PHI]]>
227+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[HEADER_MASK:%.+]]> = icmp ule vp<[[WIV]]>, vp<[[BTC]]>
228+
; IF-EVL-OUTLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
229+
; IF-EVL-OUTLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
230+
; IF-EVL-OUTLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
231+
; IF-EVL-OUTLOOP-NEXT: WIDEN ir<[[COND:%.+]]> = icmp sgt ir<[[LD1]]>, ir<3>
232+
; IF-EVL-OUTLOOP-NEXT: WIDEN ir<[[ADD:%.+]]> = add ir<[[RDX_PHI]]>, ir<[[LD1]]>
233+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[NOT_COND:%.+]]> = not ir<[[COND]]>
234+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[BLEND_MASK:%.+]]> = logical-and vp<[[HEADER_MASK]]>, vp<[[NOT_COND]]>
235+
; IF-EVL-OUTLOOP-NEXT: BLEND ir<[[BLEND_ADD:%.+]]> = ir<[[ADD]]> ir<[[RDX_PHI]]>/vp<[[BLEND_MASK]]>
236+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[RDX_SELECT:%.+]]> = merge-until-pivot ir<true>, ir<[[BLEND_ADD]]>, ir<[[RDX_PHI]]>, vp<[[EVL]]>
237+
; IF-EVL-OUTLOOP-NEXT: SCALAR-CAST vp<[[CAST:%[0-9]+]]> = zext vp<[[EVL]]> to i64
238+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[IV_NEXT]]> = add vp<[[CAST]]>, vp<[[EVL_PHI]]>
239+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[IV_NEXT_EXIT:%[0-9]+]]> = add vp<[[IV]]>, vp<[[VFUF]]>
240+
; IF-EVL-OUTLOOP-NEXT: EMIT branch-on-count vp<[[IV_NEXT_EXIT]]>, vp<[[VTC]]>
241+
; IF-EVL-OUTLOOP-NEXT: No successors
242+
; IF-EVL-OUTLOOP-NEXT: }
243+
; IF-EVL-OUTLOOP-NEXT: Successor(s): middle.block
244+
; IF-EVL-OUTLOOP-EMPTY:
245+
; IF-EVL-OUTLOOP-NEXT: middle.block:
246+
; IF-EVL-OUTLOOP-NEXT: EMIT vp<[[RDX:%.+]]> = compute-reduction-result ir<[[RDX_PHI]]>, vp<[[RDX_SELECT]]>
247+
; IF-EVL-OUTLOOP-NEXT: EMIT branch-on-cond ir<true>
248+
; IF-EVL-OUTLOOP-NEXT: Successor(s): ir-bb<for.end>, scalar.ph
249+
; IF-EVL-OUTLOOP-EMPTY:
250+
; IF-EVL-OUTLOOP-NEXT: ir-bb<for.end>:
251+
; IF-EVL-OUTLOOP-NEXT: No successors
252+
; IF-EVL-OUTLOOP-EMPTY:
253+
; IF-EVL-OUTLOOP-NEXT: scalar.ph:
254+
; IF-EVL-OUTLOOP-NEXT: No successors
255+
; IF-EVL-OUTLOOP-EMPTY:
256+
; IF-EVL-OUTLOOP-NEXT: Live-out i32 %rdx.add.lcssa = vp<[[RDX]]>
257+
; IF-EVL-OUTLOOP-NEXT: }
258+
;
259+
260+
; IF-EVL-INLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF={1}' {
261+
; IF-EVL-INLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
262+
; IF-EVL-INLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
263+
; IF-EVL-INLOOP-NEXT: Live-in vp<[[BTC:%[0-9]+]]> = backedge-taken count
264+
; IF-EVL-INLOOP-NEXT: Live-in ir<%n> = original trip-count
265+
; IF-EVL-INLOOP-EMPTY:
266+
; IF-EVL-INLOOP: vector.ph:
267+
; IF-EVL-INLOOP-NEXT: Successor(s): vector loop
268+
; IF-EVL-INLOOP-EMPTY:
269+
; IF-EVL-INLOOP-NEXT: <x1> vector loop: {
270+
; IF-EVL-INLOOP-NEXT: vector.body:
271+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
272+
; IF-EVL-INLOOP-NEXT: EXPLICIT-VECTOR-LENGTH-BASED-IV-PHI vp<[[EVL_PHI:%[0-9]+]]> = phi ir<0>, vp<[[IV_NEXT:%[0-9]+]]>
273+
; IF-EVL-INLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
274+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[EVL:%.+]]> = EXPLICIT-VECTOR-LENGTH vp<[[EVL_PHI]]>, ir<%n>
275+
; IF-EVL-INLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[EVL_PHI]]>, ir<1>
276+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[WIV:%.+]]> = WIDEN-CANONICAL-INDUCTION vp<[[EVL_PHI]]>
277+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[HEADER_MASK:%.+]]> = icmp ule vp<[[WIV]]>, vp<[[BTC]]>
278+
; IF-EVL-INLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
279+
; IF-EVL-INLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
280+
; IF-EVL-INLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = vp.load vp<[[PTR1]]>, vp<[[EVL]]>
281+
; IF-EVL-INLOOP-NEXT: WIDEN ir<[[COND:%.+]]> = icmp sgt ir<[[LD1]]>, ir<3>
282+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[MASK:%.+]]> = logical-and vp<[[HEADER_MASK]]>, ir<[[COND]]>
283+
; IF-EVL-INLOOP-NEXT: REDUCE ir<[[ADD:%.+]]> = ir<[[RDX_PHI]]> + vp.reduce.add (ir<[[LD1]]>, vp<[[EVL]]>, vp<[[MASK]]>)
284+
; IF-EVL-INLOOP-NEXT: SCALAR-CAST vp<[[CAST:%[0-9]+]]> = zext vp<[[EVL]]> to i64
285+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[IV_NEXT]]> = add vp<[[CAST]]>, vp<[[EVL_PHI]]>
286+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[IV_NEXT_EXIT:%[0-9]+]]> = add vp<[[IV]]>, vp<[[VFUF]]>
287+
; IF-EVL-INLOOP-NEXT: EMIT branch-on-count vp<[[IV_NEXT_EXIT]]>, vp<[[VTC]]>
288+
; IF-EVL-INLOOP-NEXT: No successors
289+
; IF-EVL-INLOOP-NEXT: }
290+
; IF-EVL-INLOOP-NEXT: Successor(s): middle.block
291+
; IF-EVL-INLOOP-EMPTY:
292+
; IF-EVL-INLOOP-NEXT: middle.block:
293+
; IF-EVL-INLOOP-NEXT: EMIT vp<[[RDX:%.+]]> = compute-reduction-result ir<[[RDX_PHI]]>, ir<[[ADD]]>
294+
; IF-EVL-INLOOP-NEXT: EMIT branch-on-cond ir<true>
295+
; IF-EVL-INLOOP-NEXT: Successor(s): ir-bb<for.end>, scalar.ph
296+
; IF-EVL-INLOOP-EMPTY:
297+
; IF-EVL-INLOOP-NEXT: ir-bb<for.end>:
298+
; IF-EVL-INLOOP-NEXT: No successors
299+
; IF-EVL-INLOOP-EMPTY:
300+
; IF-EVL-INLOOP-NEXT: scalar.ph:
301+
; IF-EVL-INLOOP-NEXT: No successors
302+
; IF-EVL-INLOOP-EMPTY:
303+
; IF-EVL-INLOOP-NEXT: Live-out i32 %rdx.add.lcssa = vp<[[RDX]]>
304+
; IF-EVL-INLOOP-NEXT: }
305+
;
306+
307+
; NO-VP-OUTLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF>=1' {
308+
; NO-VP-OUTLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
309+
; NO-VP-OUTLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
310+
; NO-VP-OUTLOOP-NEXT: Live-in ir<%n> = original trip-count
311+
; NO-VP-OUTLOOP-EMPTY:
312+
; NO-VP-OUTLOOP: vector.ph:
313+
; NO-VP-OUTLOOP-NEXT: Successor(s): vector loop
314+
; NO-VP-OUTLOOP-EMPTY:
315+
; NO-VP-OUTLOOP-NEXT: <x1> vector loop: {
316+
; NO-VP-OUTLOOP-NEXT: vector.body:
317+
; NO-VP-OUTLOOP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
318+
; NO-VP-OUTLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
319+
; NO-VP-OUTLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
320+
; NO-VP-OUTLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
321+
; NO-VP-OUTLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
322+
; NO-VP-OUTLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
323+
; NO-VP-OUTLOOP-NEXT: WIDEN ir<[[COND:%.+]]> = icmp sgt ir<[[LD1]]>, ir<3>
324+
; NO-VP-OUTLOOP-NEXT: WIDEN ir<[[ADD:%.+]]> = add ir<[[RDX_PHI]]>, ir<[[LD1]]>
325+
; NO-VP-OUTLOOP-NEXT: EMIT vp<[[NOT_COND:%.+]]> = not ir<[[COND]]>
326+
; NO-VP-OUTLOOP-NEXT: BLEND ir<[[BLEND_ADD:%.+]]> = ir<[[ADD]]> ir<[[RDX_PHI]]>/vp<[[NOT_COND]]>
327+
; NO-VP-OUTLOOP-NEXT: EMIT vp<[[IV_NEXT_EXIT:%[0-9]+]]> = add nuw vp<[[IV]]>, vp<[[VFUF]]>
328+
; NO-VP-OUTLOOP-NEXT: EMIT branch-on-count vp<[[IV_NEXT_EXIT]]>, vp<[[VTC]]>
329+
; NO-VP-OUTLOOP-NEXT: No successors
330+
; NO-VP-OUTLOOP-NEXT: }
331+
; NO-VP-OUTLOOP-NEXT: Successor(s): middle.block
332+
; NO-VP-OUTLOOP-EMPTY:
333+
; NO-VP-OUTLOOP-NEXT: middle.block:
334+
; NO-VP-OUTLOOP-NEXT: EMIT vp<[[RDX:%.+]]> = compute-reduction-result ir<[[RDX_PHI]]>, ir<[[BLEND_ADD]]>
335+
; NO-VP-OUTLOOP-NEXT: EMIT vp<[[BOC:%.+]]> = icmp eq ir<%n>, vp<[[VTC]]>
336+
; NO-VP-OUTLOOP-NEXT: EMIT branch-on-cond vp<[[BOC]]>
337+
; NO-VP-OUTLOOP-NEXT: Successor(s): ir-bb<for.end>, scalar.ph
338+
; NO-VP-OUTLOOP-EMPTY:
339+
; NO-VP-OUTLOOP-NEXT: ir-bb<for.end>:
340+
; NO-VP-OUTLOOP-NEXT: No successors
341+
; NO-VP-OUTLOOP-EMPTY:
342+
; NO-VP-OUTLOOP-NEXT: scalar.ph:
343+
; NO-VP-OUTLOOP-NEXT: No successors
344+
; NO-VP-OUTLOOP-EMPTY:
345+
; NO-VP-OUTLOOP-NEXT: Live-out i32 %rdx.add.lcssa = vp<[[RDX]]>
346+
; NO-VP-OUTLOOP-NEXT: }
347+
;
348+
349+
; NO-VP-INLOOP: VPlan 'Initial VPlan for VF={vscale x 1,vscale x 2,vscale x 4},UF>=1' {
350+
; NO-VP-INLOOP-NEXT: Live-in vp<[[VFUF:%[0-9]+]]> = VF * UF
351+
; NO-VP-INLOOP-NEXT: Live-in vp<[[VTC:%[0-9]+]]> = vector-trip-count
352+
; NO-VP-INLOOP-NEXT: Live-in ir<%n> = original trip-count
353+
; NO-VP-INLOOP-EMPTY:
354+
; NO-VP-INLOOP: vector.ph:
355+
; NO-VP-INLOOP-NEXT: Successor(s): vector loop
356+
; NO-VP-INLOOP-EMPTY:
357+
; NO-VP-INLOOP-NEXT: <x1> vector loop: {
358+
; NO-VP-INLOOP-NEXT: vector.body:
359+
; NO-VP-INLOOP-NEXT: EMIT vp<[[IV:%[0-9]+]]> = CANONICAL-INDUCTION
360+
; NO-VP-INLOOP-NEXT: WIDEN-REDUCTION-PHI ir<[[RDX_PHI:%.+]]> = phi ir<%start>, ir<[[RDX_NEXT:%.+]]>
361+
; NO-VP-INLOOP-NEXT: vp<[[ST:%[0-9]+]]> = SCALAR-STEPS vp<[[IV]]>, ir<1>
362+
; NO-VP-INLOOP-NEXT: CLONE ir<[[GEP1:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
363+
; NO-VP-INLOOP-NEXT: vp<[[PTR1:%[0-9]+]]> = vector-pointer ir<[[GEP1]]>
364+
; NO-VP-INLOOP-NEXT: WIDEN ir<[[LD1:%.+]]> = load vp<[[PTR1]]>
365+
; NO-VP-INLOOP-NEXT: WIDEN ir<[[COND:%.+]]> = icmp sgt ir<[[LD1]]>, ir<3>
366+
; NO-VP-INLOOP-NEXT: REDUCE ir<[[ADD:%.+]]> = ir<[[RDX_PHI]]> + reduce.add (ir<[[LD1]]>, ir<[[COND]]>)
367+
; NO-VP-INLOOP-NEXT: EMIT vp<[[IV_NEXT_EXIT:%[0-9]+]]> = add nuw vp<[[IV]]>, vp<[[VFUF]]>
368+
; NO-VP-INLOOP-NEXT: EMIT branch-on-count vp<[[IV_NEXT_EXIT]]>, vp<[[VTC]]>
369+
; NO-VP-INLOOP-NEXT: No successors
370+
; NO-VP-INLOOP-NEXT: }
371+
; NO-VP-INLOOP-NEXT: Successor(s): middle.block
372+
; NO-VP-INLOOP-EMPTY:
373+
; NO-VP-INLOOP-NEXT: middle.block:
374+
; NO-VP-INLOOP-NEXT: EMIT vp<[[RDX:%.+]]> = compute-reduction-result ir<[[RDX_PHI]]>, ir<[[ADD]]>
375+
; NO-VP-INLOOP-NEXT: EMIT vp<[[BOC:%.+]]> = icmp eq ir<%n>, vp<[[VTC]]>
376+
; NO-VP-INLOOP-NEXT: EMIT branch-on-cond vp<[[BOC]]>
377+
; NO-VP-INLOOP-NEXT: Successor(s): ir-bb<for.end>, scalar.ph
378+
; NO-VP-INLOOP-EMPTY:
379+
; NO-VP-INLOOP-NEXT: ir-bb<for.end>:
380+
; NO-VP-INLOOP-NEXT: No successors
381+
; NO-VP-INLOOP-EMPTY:
382+
; NO-VP-INLOOP-NEXT: scalar.ph:
383+
; NO-VP-INLOOP-NEXT: No successors
384+
; NO-VP-INLOOP-EMPTY:
385+
; NO-VP-INLOOP-NEXT: Live-out i32 %rdx.add.lcssa = vp<[[RDX]]>
386+
; NO-VP-INLOOP-NEXT: }
387+
;
388+
entry:
389+
br label %for.body
390+
391+
for.body:
392+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
393+
%rdx = phi i32 [ %start, %entry ], [ %rdx.add, %for.inc ]
394+
%arrayidx = getelementptr inbounds i32, ptr %a, i64 %iv
395+
%0 = load i32, ptr %arrayidx, align 4
396+
%cmp = icmp sgt i32 %0, 3
397+
br i1 %cmp, label %if.then, label %for.inc
398+
399+
if.then:
400+
%add.pred = add nsw i32 %rdx, %0
401+
br label %for.inc
402+
403+
for.inc:
404+
%rdx.add = phi i32 [ %add.pred, %if.then ], [ %rdx, %for.body ]
405+
%iv.next = add nuw nsw i64 %iv, 1
406+
%exitcond.not = icmp eq i64 %iv.next, %n
407+
br i1 %exitcond.not, label %for.end, label %for.body, !llvm.loop !0
408+
409+
for.end:
410+
ret i32 %rdx.add
411+
}
412+
209413
!0 = distinct !{!0, !1}
210414
!1 = !{!"llvm.loop.vectorize.enable", i1 true}

0 commit comments

Comments
 (0)