1*260679b0SDávid Bolvanský; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2f31811f2SFangrui Song; RUN: opt -basic-aa -loop-idiom < %s -S | FileCheck %s
3cee313d2SEric Christophertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4cee313d2SEric Christopher
5cee313d2SEric Christopher; CHECK: @.memset_pattern = private unnamed_addr constant [4 x i32] [i32 2, i32 2, i32 2, i32 2], align 16
6cee313d2SEric Christopher; CHECK: @.memset_pattern.1 = private unnamed_addr constant [4 x i32] [i32 2, i32 2, i32 2, i32 2], align 16
7cee313d2SEric Christopher; CHECK: @.memset_pattern.2 = private unnamed_addr constant [4 x i32] [i32 2, i32 2, i32 2, i32 2], align 16
8cee313d2SEric Christopher
9cee313d2SEric Christophertarget triple = "x86_64-apple-darwin10.0.0"
10cee313d2SEric Christopher
11cee313d2SEric Christopher%struct.foo = type { i32, i32 }
12cee313d2SEric Christopher%struct.foo1 = type { i32, i32, i32 }
13cee313d2SEric Christopher
14cee313d2SEric Christopher;void bar1(foo_t *f, unsigned n) {
15cee313d2SEric Christopher;  for (unsigned i = 0; i < n; ++i) {
16cee313d2SEric Christopher;    f[i].a = 2;
17cee313d2SEric Christopher;    f[i].b = 2;
18cee313d2SEric Christopher;  }
19cee313d2SEric Christopher;}
20cee313d2SEric Christopherdefine void @bar1(%struct.foo* %f, i32 %n) nounwind ssp {
21*260679b0SDávid Bolvanský; CHECK-LABEL: @bar1(
22*260679b0SDávid Bolvanský; CHECK-NEXT:  entry:
23*260679b0SDávid Bolvanský; CHECK-NEXT:    [[F1:%.*]] = bitcast %struct.foo* [[F:%.*]] to i8*
24*260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[N:%.*]], 0
25*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
26*260679b0SDávid Bolvanský; CHECK:       for.body.preheader:
27*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP0:%.*]] = zext i32 [[N]] to i64
28*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i64 [[TMP0]], 3
29*260679b0SDávid Bolvanský; CHECK-NEXT:    call void @memset_pattern16(i8* [[F1]], i8* bitcast ([4 x i32]* @.memset_pattern to i8*), i64 [[TMP1]])
30*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
31*260679b0SDávid Bolvanský; CHECK:       for.body:
32*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
33*260679b0SDávid Bolvanský; CHECK-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_FOO:%.*]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 0
34*260679b0SDávid Bolvanský; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_FOO]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 1
35*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
36*260679b0SDávid Bolvanský; CHECK-NEXT:    [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
37*260679b0SDávid Bolvanský; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[N]]
38*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END_LOOPEXIT:%.*]]
39*260679b0SDávid Bolvanský; CHECK:       for.end.loopexit:
40*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_END]]
41*260679b0SDávid Bolvanský; CHECK:       for.end:
42*260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
43*260679b0SDávid Bolvanský;
44cee313d2SEric Christopherentry:
45cee313d2SEric Christopher  %cmp1 = icmp eq i32 %n, 0
46cee313d2SEric Christopher  br i1 %cmp1, label %for.end, label %for.body.preheader
47cee313d2SEric Christopher
48cee313d2SEric Christopherfor.body.preheader:                               ; preds = %entry
49cee313d2SEric Christopher  br label %for.body
50cee313d2SEric Christopher
51cee313d2SEric Christopherfor.body:                                         ; preds = %for.body.preheader, %for.body
52cee313d2SEric Christopher  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
53cee313d2SEric Christopher  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
54cee313d2SEric Christopher  store i32 2, i32* %a, align 4
55cee313d2SEric Christopher  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
56cee313d2SEric Christopher  store i32 2, i32* %b, align 4
57cee313d2SEric Christopher  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
58cee313d2SEric Christopher  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
59cee313d2SEric Christopher  %exitcond = icmp ne i32 %lftr.wideiv, %n
60cee313d2SEric Christopher  br i1 %exitcond, label %for.body, label %for.end.loopexit
61cee313d2SEric Christopher
62cee313d2SEric Christopherfor.end.loopexit:                                 ; preds = %for.body
63cee313d2SEric Christopher  br label %for.end
64cee313d2SEric Christopher
65cee313d2SEric Christopherfor.end:                                          ; preds = %for.end.loopexit, %entry
66cee313d2SEric Christopher  ret void
67cee313d2SEric Christopher}
68cee313d2SEric Christopher
69cee313d2SEric Christopher;void bar2(foo_t *f, unsigned n) {
70cee313d2SEric Christopher;  for (unsigned i = 0; i < n; ++i) {
71cee313d2SEric Christopher;    f[i].b = 2;
72cee313d2SEric Christopher;    f[i].a = 2;
73cee313d2SEric Christopher;  }
74cee313d2SEric Christopher;}
75cee313d2SEric Christopherdefine void @bar2(%struct.foo* %f, i32 %n) nounwind ssp {
76*260679b0SDávid Bolvanský; CHECK-LABEL: @bar2(
77*260679b0SDávid Bolvanský; CHECK-NEXT:  entry:
78*260679b0SDávid Bolvanský; CHECK-NEXT:    [[F1:%.*]] = bitcast %struct.foo* [[F:%.*]] to i8*
79*260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[N:%.*]], 0
80*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
81*260679b0SDávid Bolvanský; CHECK:       for.body.preheader:
82*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP0:%.*]] = zext i32 [[N]] to i64
83*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i64 [[TMP0]], 3
84*260679b0SDávid Bolvanský; CHECK-NEXT:    call void @memset_pattern16(i8* [[F1]], i8* bitcast ([4 x i32]* @.memset_pattern.1 to i8*), i64 [[TMP1]])
85*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
86*260679b0SDávid Bolvanský; CHECK:       for.body:
87*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
88*260679b0SDávid Bolvanský; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_FOO:%.*]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 1
89*260679b0SDávid Bolvanský; CHECK-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_FOO]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 0
90*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
91*260679b0SDávid Bolvanský; CHECK-NEXT:    [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
92*260679b0SDávid Bolvanský; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[N]]
93*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END_LOOPEXIT:%.*]]
94*260679b0SDávid Bolvanský; CHECK:       for.end.loopexit:
95*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_END]]
96*260679b0SDávid Bolvanský; CHECK:       for.end:
97*260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
98*260679b0SDávid Bolvanský;
99cee313d2SEric Christopherentry:
100cee313d2SEric Christopher  %cmp1 = icmp eq i32 %n, 0
101cee313d2SEric Christopher  br i1 %cmp1, label %for.end, label %for.body.preheader
102cee313d2SEric Christopher
103cee313d2SEric Christopherfor.body.preheader:                               ; preds = %entry
104cee313d2SEric Christopher  br label %for.body
105cee313d2SEric Christopher
106cee313d2SEric Christopherfor.body:                                         ; preds = %for.body.preheader, %for.body
107cee313d2SEric Christopher  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
108cee313d2SEric Christopher  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
109cee313d2SEric Christopher  store i32 2, i32* %b, align 4
110cee313d2SEric Christopher  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
111cee313d2SEric Christopher  store i32 2, i32* %a, align 4
112cee313d2SEric Christopher  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
113cee313d2SEric Christopher  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
114cee313d2SEric Christopher  %exitcond = icmp ne i32 %lftr.wideiv, %n
115cee313d2SEric Christopher  br i1 %exitcond, label %for.body, label %for.end.loopexit
116cee313d2SEric Christopher
117cee313d2SEric Christopherfor.end.loopexit:                                 ; preds = %for.body
118cee313d2SEric Christopher  br label %for.end
119cee313d2SEric Christopher
120cee313d2SEric Christopherfor.end:                                          ; preds = %for.end.loopexit, %entry
121cee313d2SEric Christopher  ret void
122cee313d2SEric Christopher}
123cee313d2SEric Christopher
124cee313d2SEric Christopher;void bar3(foo_t *f, unsigned n) {
125cee313d2SEric Christopher;  for (unsigned i = n; i > 0; --i) {
126cee313d2SEric Christopher;    f[i].a = 2;
127cee313d2SEric Christopher;    f[i].b = 2;
128cee313d2SEric Christopher;  }
129cee313d2SEric Christopher;}
130cee313d2SEric Christopherdefine void @bar3(%struct.foo* nocapture %f, i32 %n) nounwind ssp {
131*260679b0SDávid Bolvanský; CHECK-LABEL: @bar3(
132*260679b0SDávid Bolvanský; CHECK-NEXT:  entry:
133*260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[N:%.*]], 0
134*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
135*260679b0SDávid Bolvanský; CHECK:       for.body.preheader:
136*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP0:%.*]] = zext i32 [[N]] to i64
137*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[N]], -1
138*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
139*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP0]], [[TMP2]]
140*260679b0SDávid Bolvanský; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr [[STRUCT_FOO:%.*]], %struct.foo* [[F:%.*]], i64 [[TMP3]]
141*260679b0SDávid Bolvanský; CHECK-NEXT:    [[SCEVGEP1:%.*]] = bitcast %struct.foo* [[SCEVGEP]] to i8*
142*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP4:%.*]] = shl nuw nsw i64 [[TMP0]], 3
143*260679b0SDávid Bolvanský; CHECK-NEXT:    call void @memset_pattern16(i8* [[SCEVGEP1]], i8* bitcast ([4 x i32]* @.memset_pattern.2 to i8*), i64 [[TMP4]])
144*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
145*260679b0SDávid Bolvanský; CHECK:       for.body:
146*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[TMP0]], [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
147*260679b0SDávid Bolvanský; CHECK-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_FOO]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 0
148*260679b0SDávid Bolvanský; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_FOO]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 1
149*260679b0SDávid Bolvanský; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[INDVARS_IV]] to i32
150*260679b0SDávid Bolvanský; CHECK-NEXT:    [[DEC:%.*]] = add i32 [[TMP5]], -1
151*260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[DEC]], 0
152*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
153*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_END_LOOPEXIT:%.*]], label [[FOR_BODY]]
154*260679b0SDávid Bolvanský; CHECK:       for.end.loopexit:
155*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_END]]
156*260679b0SDávid Bolvanský; CHECK:       for.end:
157*260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
158*260679b0SDávid Bolvanský;
159cee313d2SEric Christopherentry:
160cee313d2SEric Christopher  %cmp1 = icmp eq i32 %n, 0
161cee313d2SEric Christopher  br i1 %cmp1, label %for.end, label %for.body.preheader
162cee313d2SEric Christopher
163cee313d2SEric Christopherfor.body.preheader:                               ; preds = %entry
164cee313d2SEric Christopher  %0 = zext i32 %n to i64
165cee313d2SEric Christopher  br label %for.body
166cee313d2SEric Christopher
167cee313d2SEric Christopherfor.body:                                         ; preds = %for.body.preheader, %for.body
168cee313d2SEric Christopher  %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
169cee313d2SEric Christopher  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
170cee313d2SEric Christopher  store i32 2, i32* %a, align 4
171cee313d2SEric Christopher  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
172cee313d2SEric Christopher  store i32 2, i32* %b, align 4
173cee313d2SEric Christopher  %1 = trunc i64 %indvars.iv to i32
174cee313d2SEric Christopher  %dec = add i32 %1, -1
175cee313d2SEric Christopher  %cmp = icmp eq i32 %dec, 0
176cee313d2SEric Christopher  %indvars.iv.next = add nsw i64 %indvars.iv, -1
177cee313d2SEric Christopher  br i1 %cmp, label %for.end.loopexit, label %for.body
178cee313d2SEric Christopher
179cee313d2SEric Christopherfor.end.loopexit:                                 ; preds = %for.body
180cee313d2SEric Christopher  br label %for.end
181cee313d2SEric Christopher
182cee313d2SEric Christopherfor.end:                                          ; preds = %for.end.loopexit, %entry
183cee313d2SEric Christopher  ret void
184cee313d2SEric Christopher}
185cee313d2SEric Christopher
186cee313d2SEric Christopher;void bar4(foo_t *f, unsigned n) {
187cee313d2SEric Christopher;  for (unsigned i = 0; i < n; ++i) {
188cee313d2SEric Christopher;    f[i].a = 0;
189cee313d2SEric Christopher;    f[i].b = 1;
190cee313d2SEric Christopher;  }
191cee313d2SEric Christopher;}
192cee313d2SEric Christopherdefine void @bar4(%struct.foo* nocapture %f, i32 %n) nounwind ssp {
193*260679b0SDávid Bolvanský; CHECK-LABEL: @bar4(
194*260679b0SDávid Bolvanský; CHECK-NEXT:  entry:
195*260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[N:%.*]], 0
196*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
197*260679b0SDávid Bolvanský; CHECK:       for.body.preheader:
198*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
199*260679b0SDávid Bolvanský; CHECK:       for.body:
200*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
201*260679b0SDávid Bolvanský; CHECK-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_FOO:%.*]], %struct.foo* [[F:%.*]], i64 [[INDVARS_IV]], i32 0
202*260679b0SDávid Bolvanský; CHECK-NEXT:    store i32 0, i32* [[A]], align 4
203*260679b0SDávid Bolvanský; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_FOO]], %struct.foo* [[F]], i64 [[INDVARS_IV]], i32 1
204*260679b0SDávid Bolvanský; CHECK-NEXT:    store i32 1, i32* [[B]], align 4
205*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
206*260679b0SDávid Bolvanský; CHECK-NEXT:    [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
207*260679b0SDávid Bolvanský; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[N]]
208*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END_LOOPEXIT:%.*]]
209*260679b0SDávid Bolvanský; CHECK:       for.end.loopexit:
210*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_END]]
211*260679b0SDávid Bolvanský; CHECK:       for.end:
212*260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
213*260679b0SDávid Bolvanský;
214cee313d2SEric Christopherentry:
215cee313d2SEric Christopher  %cmp1 = icmp eq i32 %n, 0
216cee313d2SEric Christopher  br i1 %cmp1, label %for.end, label %for.body.preheader
217cee313d2SEric Christopher
218cee313d2SEric Christopherfor.body.preheader:                               ; preds = %entry
219cee313d2SEric Christopher  br label %for.body
220cee313d2SEric Christopher
221cee313d2SEric Christopherfor.body:                                         ; preds = %for.body.preheader, %for.body
222cee313d2SEric Christopher  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
223cee313d2SEric Christopher  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
224cee313d2SEric Christopher  store i32 0, i32* %a, align 4
225cee313d2SEric Christopher  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
226cee313d2SEric Christopher  store i32 1, i32* %b, align 4
227cee313d2SEric Christopher  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
228cee313d2SEric Christopher  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
229cee313d2SEric Christopher  %exitcond = icmp ne i32 %lftr.wideiv, %n
230cee313d2SEric Christopher  br i1 %exitcond, label %for.body, label %for.end.loopexit
231cee313d2SEric Christopher
232cee313d2SEric Christopherfor.end.loopexit:                                 ; preds = %for.body
233cee313d2SEric Christopher  br label %for.end
234cee313d2SEric Christopher
235cee313d2SEric Christopherfor.end:                                          ; preds = %for.end.loopexit, %entry
236cee313d2SEric Christopher  ret void
237cee313d2SEric Christopher}
238cee313d2SEric Christopher
239cee313d2SEric Christopher;void bar5(foo1_t *f, unsigned n) {
240cee313d2SEric Christopher;  for (unsigned i = 0; i < n; ++i) {
241cee313d2SEric Christopher;    f[i].a = 1;
242cee313d2SEric Christopher;    f[i].b = 1;
243cee313d2SEric Christopher;  }
244cee313d2SEric Christopher;}
245cee313d2SEric Christopherdefine void @bar5(%struct.foo1* nocapture %f, i32 %n) nounwind ssp {
246*260679b0SDávid Bolvanský; CHECK-LABEL: @bar5(
247*260679b0SDávid Bolvanský; CHECK-NEXT:  entry:
248*260679b0SDávid Bolvanský; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[N:%.*]], 0
249*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_END:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
250*260679b0SDávid Bolvanský; CHECK:       for.body.preheader:
251*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
252*260679b0SDávid Bolvanský; CHECK:       for.body:
253*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
254*260679b0SDávid Bolvanský; CHECK-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_FOO1:%.*]], %struct.foo1* [[F:%.*]], i64 [[INDVARS_IV]], i32 0
255*260679b0SDávid Bolvanský; CHECK-NEXT:    store i32 1, i32* [[A]], align 4
256*260679b0SDávid Bolvanský; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_FOO1]], %struct.foo1* [[F]], i64 [[INDVARS_IV]], i32 1
257*260679b0SDávid Bolvanský; CHECK-NEXT:    store i32 1, i32* [[B]], align 4
258*260679b0SDávid Bolvanský; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
259*260679b0SDávid Bolvanský; CHECK-NEXT:    [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
260*260679b0SDávid Bolvanský; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], [[N]]
261*260679b0SDávid Bolvanský; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END_LOOPEXIT:%.*]]
262*260679b0SDávid Bolvanský; CHECK:       for.end.loopexit:
263*260679b0SDávid Bolvanský; CHECK-NEXT:    br label [[FOR_END]]
264*260679b0SDávid Bolvanský; CHECK:       for.end:
265*260679b0SDávid Bolvanský; CHECK-NEXT:    ret void
266*260679b0SDávid Bolvanský;
267cee313d2SEric Christopherentry:
268cee313d2SEric Christopher  %cmp1 = icmp eq i32 %n, 0
269cee313d2SEric Christopher  br i1 %cmp1, label %for.end, label %for.body.preheader
270cee313d2SEric Christopher
271cee313d2SEric Christopherfor.body.preheader:                               ; preds = %entry
272cee313d2SEric Christopher  br label %for.body
273cee313d2SEric Christopher
274cee313d2SEric Christopherfor.body:                                         ; preds = %for.body.preheader, %for.body
275cee313d2SEric Christopher  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
276cee313d2SEric Christopher  %a = getelementptr inbounds %struct.foo1, %struct.foo1* %f, i64 %indvars.iv, i32 0
277cee313d2SEric Christopher  store i32 1, i32* %a, align 4
278cee313d2SEric Christopher  %b = getelementptr inbounds %struct.foo1, %struct.foo1* %f, i64 %indvars.iv, i32 1
279cee313d2SEric Christopher  store i32 1, i32* %b, align 4
280cee313d2SEric Christopher  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
281cee313d2SEric Christopher  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
282cee313d2SEric Christopher  %exitcond = icmp ne i32 %lftr.wideiv, %n
283cee313d2SEric Christopher  br i1 %exitcond, label %for.body, label %for.end.loopexit
284cee313d2SEric Christopher
285cee313d2SEric Christopherfor.end.loopexit:                                 ; preds = %for.body
286cee313d2SEric Christopher  br label %for.end
287cee313d2SEric Christopher
288cee313d2SEric Christopherfor.end:                                          ; preds = %for.end.loopexit, %entry
289cee313d2SEric Christopher  ret void
290cee313d2SEric Christopher}
291