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