xref: /llvm-project/llvm/test/Transforms/LoopVectorize/fixed-order-recurrences-memory-instructions.ll (revision b0da998494abd3da0fb4287e75dde9d5c0799daa)
1fd5bccb8SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2fd5bccb8SFlorian Hahn; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s
3fd5bccb8SFlorian Hahn
4*b0da9984SFlorian Hahndefine i32 @sink_load_that_uses_for_past_other_loads(ptr noalias %A, ptr noalias %B) {
5*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_load_that_uses_for_past_other_loads(
6fd5bccb8SFlorian Hahn; CHECK-NEXT:  entry:
7fd5bccb8SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
8fd5bccb8SFlorian Hahn; CHECK:       loop:
9fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
10fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
11fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[RED:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[RED_NEXT:%.*]], [[LOOP]] ]
12fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[FOR]]
13fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4
14fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]]
15fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = load i32, ptr [[GEP_B]], align 4
16fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[FOR]], [[L_A]]
17fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[RED_NEXT]] = add i32 [[RED]], [[ADD]]
18fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
19fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
20fd5bccb8SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
21fd5bccb8SFlorian Hahn; CHECK:       exit:
22fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[RED_NEXT_LCSSA:%.*]] = phi i32 [ [[RED_NEXT]], [[LOOP]] ]
23fd5bccb8SFlorian Hahn; CHECK-NEXT:    ret i32 [[RED_NEXT_LCSSA]]
24fd5bccb8SFlorian Hahn;
25fd5bccb8SFlorian Hahnentry:
26fd5bccb8SFlorian Hahn  br label %loop
27fd5bccb8SFlorian Hahn
28fd5bccb8SFlorian Hahnloop:
29fd5bccb8SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
30fd5bccb8SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
31fd5bccb8SFlorian Hahn  %red = phi i32 [ 0, %entry ], [ %red.next, %loop ]
32fd5bccb8SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %for
33fd5bccb8SFlorian Hahn  %l.a = load i32, ptr %gep.a
34fd5bccb8SFlorian Hahn  %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv
35fd5bccb8SFlorian Hahn  %for.next = load i32, ptr %gep.b
36fd5bccb8SFlorian Hahn  %add = add i32 %for, %l.a
37fd5bccb8SFlorian Hahn  %red.next = add i32 %red, %add
38fd5bccb8SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
39fd5bccb8SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
40fd5bccb8SFlorian Hahn  br i1 %ec, label %exit, label %loop
41fd5bccb8SFlorian Hahn
42fd5bccb8SFlorian Hahnexit:
43fd5bccb8SFlorian Hahn  ret i32 %red.next
44fd5bccb8SFlorian Hahn}
45fd5bccb8SFlorian Hahn
46fd5bccb8SFlorian Hahndefine void @cannot_sink_load_past_mayalias_store(ptr noalias %A, ptr noalias %B) {
47fd5bccb8SFlorian Hahn; CHECK-LABEL: @cannot_sink_load_past_mayalias_store(
48fd5bccb8SFlorian Hahn; CHECK-NEXT:  entry:
49fd5bccb8SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
50fd5bccb8SFlorian Hahn; CHECK:       loop:
51fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
52fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
53fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[FOR]]
54fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4
55fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[GEP_A_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV]]
56fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[FOR]], [[L_A]]
57fd5bccb8SFlorian Hahn; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP_A_2]], align 4
58fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = load i32, ptr [[GEP_A_2]], align 4
59fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
60fd5bccb8SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
61fd5bccb8SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
62fd5bccb8SFlorian Hahn; CHECK:       exit:
63fd5bccb8SFlorian Hahn; CHECK-NEXT:    ret void
64fd5bccb8SFlorian Hahn;
65fd5bccb8SFlorian Hahnentry:
66fd5bccb8SFlorian Hahn  br label %loop
67fd5bccb8SFlorian Hahn
68fd5bccb8SFlorian Hahnloop:
69fd5bccb8SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
70fd5bccb8SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
71fd5bccb8SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %for
72fd5bccb8SFlorian Hahn  %l.a = load i32, ptr %gep.a
73fd5bccb8SFlorian Hahn  %gep.a.2 = getelementptr inbounds i32, ptr %A, i32 %iv
74fd5bccb8SFlorian Hahn  %add = add i32 %for, %l.a
75fd5bccb8SFlorian Hahn  store i32 %add, ptr %gep.a.2
76fd5bccb8SFlorian Hahn  %for.next = load i32, ptr %gep.a.2
77fd5bccb8SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
78fd5bccb8SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
79fd5bccb8SFlorian Hahn  br i1 %ec, label %exit, label %loop
80fd5bccb8SFlorian Hahn
81fd5bccb8SFlorian Hahnexit:
82fd5bccb8SFlorian Hahn  ret void
83fd5bccb8SFlorian Hahn}
84*b0da9984SFlorian Hahn
85*b0da9984SFlorian Hahndefine void @sink_store_that_uses_for_past_instructions(ptr noalias %A, ptr noalias %B) {
86*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_that_uses_for_past_instructions(
87*b0da9984SFlorian Hahn; CHECK-NEXT:  entry:
88*b0da9984SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
89*b0da9984SFlorian Hahn; CHECK:       loop:
90*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
91*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
92*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]]
93*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 [[FOR]], ptr [[GEP_A]], align 4
94*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = add i32 [[IV]], 2
95*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
96*b0da9984SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
97*b0da9984SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
98*b0da9984SFlorian Hahn; CHECK:       exit:
99*b0da9984SFlorian Hahn; CHECK-NEXT:    ret void
100*b0da9984SFlorian Hahn;
101*b0da9984SFlorian Hahnentry:
102*b0da9984SFlorian Hahn  br label %loop
103*b0da9984SFlorian Hahn
104*b0da9984SFlorian Hahnloop:
105*b0da9984SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
106*b0da9984SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
107*b0da9984SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv
108*b0da9984SFlorian Hahn  store i32 %for, ptr %gep.a
109*b0da9984SFlorian Hahn  %for.next = add i32 %iv, 2
110*b0da9984SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
111*b0da9984SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
112*b0da9984SFlorian Hahn  br i1 %ec, label %exit, label %loop
113*b0da9984SFlorian Hahn
114*b0da9984SFlorian Hahnexit:
115*b0da9984SFlorian Hahn  ret void
116*b0da9984SFlorian Hahn}
117*b0da9984SFlorian Hahn
118*b0da9984SFlorian Hahndefine void @sink_store_past_non_aliasing_load(ptr noalias %A, ptr noalias %B) {
119*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_non_aliasing_load(
120*b0da9984SFlorian Hahn; CHECK-NEXT:  entry:
121*b0da9984SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
122*b0da9984SFlorian Hahn; CHECK:       loop:
123*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
124*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
125*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]]
126*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 [[FOR]], ptr [[GEP_A]], align 4
127*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]]
128*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = load i32, ptr [[GEP_B]], align 4
129*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
130*b0da9984SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
131*b0da9984SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
132*b0da9984SFlorian Hahn; CHECK:       exit:
133*b0da9984SFlorian Hahn; CHECK-NEXT:    ret void
134*b0da9984SFlorian Hahn;
135*b0da9984SFlorian Hahnentry:
136*b0da9984SFlorian Hahn  br label %loop
137*b0da9984SFlorian Hahn
138*b0da9984SFlorian Hahnloop:
139*b0da9984SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
140*b0da9984SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
141*b0da9984SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv
142*b0da9984SFlorian Hahn  store i32 %for, ptr %gep.a
143*b0da9984SFlorian Hahn  %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv
144*b0da9984SFlorian Hahn  %for.next = load i32, ptr %gep.b
145*b0da9984SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
146*b0da9984SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
147*b0da9984SFlorian Hahn  br i1 %ec, label %exit, label %loop
148*b0da9984SFlorian Hahn
149*b0da9984SFlorian Hahnexit:
150*b0da9984SFlorian Hahn  ret void
151*b0da9984SFlorian Hahn}
152*b0da9984SFlorian Hahn
153*b0da9984SFlorian Hahndefine void @sink_store_past_aliasing_load(ptr %A, ptr %B) {
154*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_aliasing_load(
155*b0da9984SFlorian Hahn; CHECK-NEXT:  entry:
156*b0da9984SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
157*b0da9984SFlorian Hahn; CHECK:       loop:
158*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
159*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
160*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]]
161*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 [[FOR]], ptr [[GEP_A]], align 4
162*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]]
163*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = load i32, ptr [[GEP_B]], align 4
164*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
165*b0da9984SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
166*b0da9984SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
167*b0da9984SFlorian Hahn; CHECK:       exit:
168*b0da9984SFlorian Hahn; CHECK-NEXT:    ret void
169*b0da9984SFlorian Hahn;
170*b0da9984SFlorian Hahnentry:
171*b0da9984SFlorian Hahn  br label %loop
172*b0da9984SFlorian Hahn
173*b0da9984SFlorian Hahnloop:
174*b0da9984SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
175*b0da9984SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
176*b0da9984SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv
177*b0da9984SFlorian Hahn  store i32 %for, ptr %gep.a
178*b0da9984SFlorian Hahn  %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv
179*b0da9984SFlorian Hahn  %for.next = load i32, ptr %gep.b
180*b0da9984SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
181*b0da9984SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
182*b0da9984SFlorian Hahn  br i1 %ec, label %exit, label %loop
183*b0da9984SFlorian Hahn
184*b0da9984SFlorian Hahnexit:
185*b0da9984SFlorian Hahn  ret void
186*b0da9984SFlorian Hahn}
187*b0da9984SFlorian Hahn
188*b0da9984SFlorian Hahndefine void @sink_store_past_non_aliasing_store(ptr noalias %A, ptr noalias %B) {
189*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_non_aliasing_store(
190*b0da9984SFlorian Hahn; CHECK-NEXT:  entry:
191*b0da9984SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
192*b0da9984SFlorian Hahn; CHECK:       loop:
193*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
194*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
195*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]]
196*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 [[FOR]], ptr [[GEP_A]], align 4
197*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]]
198*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 123, ptr [[GEP_B]], align 4
199*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = add i32 [[IV]], 2
200*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
201*b0da9984SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
202*b0da9984SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
203*b0da9984SFlorian Hahn; CHECK:       exit:
204*b0da9984SFlorian Hahn; CHECK-NEXT:    ret void
205*b0da9984SFlorian Hahn;
206*b0da9984SFlorian Hahnentry:
207*b0da9984SFlorian Hahn  br label %loop
208*b0da9984SFlorian Hahn
209*b0da9984SFlorian Hahnloop:
210*b0da9984SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
211*b0da9984SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
212*b0da9984SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv
213*b0da9984SFlorian Hahn  store i32 %for, ptr %gep.a
214*b0da9984SFlorian Hahn  %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv
215*b0da9984SFlorian Hahn  store i32 123, ptr %gep.b
216*b0da9984SFlorian Hahn  %for.next = add i32 %iv, 2
217*b0da9984SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
218*b0da9984SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
219*b0da9984SFlorian Hahn  br i1 %ec, label %exit, label %loop
220*b0da9984SFlorian Hahn
221*b0da9984SFlorian Hahnexit:
222*b0da9984SFlorian Hahn  ret void
223*b0da9984SFlorian Hahn}
224*b0da9984SFlorian Hahn
225*b0da9984SFlorian Hahndefine void @sink_store_past_aliasing_store(ptr %A, ptr %B) {
226*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_aliasing_store(
227*b0da9984SFlorian Hahn; CHECK-NEXT:  entry:
228*b0da9984SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
229*b0da9984SFlorian Hahn; CHECK:       loop:
230*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
231*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ]
232*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]]
233*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 [[FOR]], ptr [[GEP_A]], align 4
234*b0da9984SFlorian Hahn; CHECK-NEXT:    [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]]
235*b0da9984SFlorian Hahn; CHECK-NEXT:    store i32 123, ptr [[GEP_B]], align 4
236*b0da9984SFlorian Hahn; CHECK-NEXT:    [[FOR_NEXT]] = add i32 [[IV]], 2
237*b0da9984SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
238*b0da9984SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000
239*b0da9984SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]
240*b0da9984SFlorian Hahn; CHECK:       exit:
241*b0da9984SFlorian Hahn; CHECK-NEXT:    ret void
242*b0da9984SFlorian Hahn;
243*b0da9984SFlorian Hahnentry:
244*b0da9984SFlorian Hahn  br label %loop
245*b0da9984SFlorian Hahn
246*b0da9984SFlorian Hahnloop:
247*b0da9984SFlorian Hahn  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
248*b0da9984SFlorian Hahn  %for = phi i32 [ 0, %entry ], [ %for.next, %loop ]
249*b0da9984SFlorian Hahn  %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv
250*b0da9984SFlorian Hahn  store i32 %for, ptr %gep.a
251*b0da9984SFlorian Hahn  %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv
252*b0da9984SFlorian Hahn  store i32 123, ptr %gep.b
253*b0da9984SFlorian Hahn  %for.next = add i32 %iv, 2
254*b0da9984SFlorian Hahn  %iv.next = add nuw nsw i32 %iv, 1
255*b0da9984SFlorian Hahn  %ec = icmp eq i32 %iv.next, 1000
256*b0da9984SFlorian Hahn  br i1 %ec, label %exit, label %loop
257*b0da9984SFlorian Hahn
258*b0da9984SFlorian Hahnexit:
259*b0da9984SFlorian Hahn  ret void
260*b0da9984SFlorian Hahn}
261