@@ -29,7 +29,7 @@ define void @iv_no_binary_op_in_descriptor(i1 %c, ptr %dst) {
2929; CHECK-NEXT: }
3030; CHECK-NEXT: Successor(s): middle.block
3131; CHECK-EMPTY:
32- ; CHECK-NEXT: middle.block:
32+ ; CHECK-NEXT: middle.block:
3333; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq ir<1000>, vp<[[VEC_TC]]>
3434; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
3535; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph
@@ -65,3 +65,57 @@ loop.latch:
6565exit:
6666 ret void
6767}
68+
69+ ; Check that VPWidenIntOrFPInductionRecipe is expanded into smaller recipes in
70+ ; the final VPlan.
71+ define void @iv_expand (ptr %p , i64 %n ) {
72+ ; CHECK-LABEL: LV: Checking a loop in 'iv_expand'
73+ ; CHECK: VPlan 'Initial VPlan for VF={8},UF>=1' {
74+ ; CHECK: <x1> vector loop: {
75+ ; CHECK-NEXT: vector.body:
76+ ; CHECK-NEXT: EMIT vp<%3> = CANONICAL-INDUCTION ir<0>, vp<%index.next>
77+ ; CHECK-NEXT: ir<%i> = WIDEN-INDUCTION ir<0>, ir<1>, vp<%0>
78+ ; CHECK-NEXT: vp<%4> = SCALAR-STEPS vp<%3>, ir<1>
79+ ; CHECK-NEXT: CLONE ir<%q> = getelementptr ir<%p>, vp<%4>
80+ ; CHECK-NEXT: vp<%5> = vector-pointer ir<%q>
81+ ; CHECK-NEXT: WIDEN ir<%x> = load vp<%5>
82+ ; CHECK-NEXT: WIDEN ir<%y> = add ir<%x>, ir<%i>
83+ ; CHECK-NEXT: vp<%6> = vector-pointer ir<%q>
84+ ; CHECK-NEXT: WIDEN store vp<%6>, ir<%y>
85+ ; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<%3>, vp<%1>
86+ ; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<%2>
87+ ; CHECK-NEXT: No successors
88+ ; CHECK-NEXT: }
89+ ; CHECK-NEXT: Successor(s): middle.block
90+ ; CHECK: VPlan 'Final VPlan for VF={8},UF={1}'
91+ ; CHECK: <x1> vector loop: {
92+ ; CHECK-NEXT: vector.body:
93+ ; CHECK-NEXT: SCALAR-PHI vp<%3> = phi ir<0>, vp<%index.next>
94+ ; CHECK-NEXT: WIDEN-PHI ir<%i> = phi vp<%induction>, vp<%vec.ind.next>
95+ ; CHECK-NEXT: vp<%4> = SCALAR-STEPS vp<%3>, ir<1>
96+ ; CHECK-NEXT: CLONE ir<%q> = getelementptr ir<%p>, vp<%4>
97+ ; CHECK-NEXT: vp<%5> = vector-pointer ir<%q>
98+ ; CHECK-NEXT: WIDEN ir<%x> = load vp<%5>
99+ ; CHECK-NEXT: WIDEN ir<%y> = add ir<%x>, ir<%i>
100+ ; CHECK-NEXT: vp<%6> = vector-pointer ir<%q>
101+ ; CHECK-NEXT: WIDEN store vp<%6>, ir<%y>
102+ ; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<%3>, ir<8>
103+ ; CHECK-NEXT: EMIT vp<%vec.ind.next> = add ir<%i>, vp<%2>
104+ ; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, ir<%n.vec>
105+ ; CHECK-NEXT: No successors
106+ ; CHECK-NEXT: }
107+ ; CHECK-NEXT: Successor(s): middle.block
108+ entry:
109+ br label %loop
110+ loop:
111+ %i = phi i64 [0 , %entry ], [%i.next , %loop ]
112+ %q = getelementptr i64 , ptr %p , i64 %i
113+ %x = load i64 , ptr %q
114+ %y = add i64 %x , %i
115+ store i64 %y , ptr %q
116+ %i.next = add i64 %i , 1
117+ %done = icmp eq i64 %i.next , %n
118+ br i1 %done , label %exit , label %loop
119+ exit:
120+ ret void
121+ }
0 commit comments