xref: /aosp_15_r20/external/llvm/test/Transforms/LoopIdiom/struct.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -basicaa -loop-idiom < %s -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget 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"
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin10.0.0"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker%struct.foo = type { i32, i32 }
7*9880d681SAndroid Build Coastguard Worker%struct.foo1 = type { i32, i32, i32 }
8*9880d681SAndroid Build Coastguard Worker%struct.foo2 = type { i32, i16, i16 }
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker;void bar1(foo_t *f, unsigned n) {
11*9880d681SAndroid Build Coastguard Worker;  for (unsigned i = 0; i < n; ++i) {
12*9880d681SAndroid Build Coastguard Worker;    f[i].a = 0;
13*9880d681SAndroid Build Coastguard Worker;    f[i].b = 0;
14*9880d681SAndroid Build Coastguard Worker;  }
15*9880d681SAndroid Build Coastguard Worker;}
16*9880d681SAndroid Build Coastguard Workerdefine void @bar1(%struct.foo* %f, i32 %n) nounwind ssp {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
19*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
22*9880d681SAndroid Build Coastguard Worker  br label %for.body
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
25*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
26*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
27*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a, align 4
28*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
29*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %b, align 4
30*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
31*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
32*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i32 %lftr.wideiv, %n
33*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
36*9880d681SAndroid Build Coastguard Worker  br label %for.end
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
39*9880d681SAndroid Build Coastguard Worker  ret void
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar1(
41*9880d681SAndroid Build Coastguard Worker; CHECK: call void @llvm.memset
42*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker;void bar2(foo_t *f, unsigned n) {
46*9880d681SAndroid Build Coastguard Worker;  for (unsigned i = 0; i < n; ++i) {
47*9880d681SAndroid Build Coastguard Worker;    f[i].b = 0;
48*9880d681SAndroid Build Coastguard Worker;    f[i].a = 0;
49*9880d681SAndroid Build Coastguard Worker;  }
50*9880d681SAndroid Build Coastguard Worker;}
51*9880d681SAndroid Build Coastguard Workerdefine void @bar2(%struct.foo* %f, i32 %n) nounwind ssp {
52*9880d681SAndroid Build Coastguard Workerentry:
53*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
54*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
57*9880d681SAndroid Build Coastguard Worker  br label %for.body
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
60*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
61*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
62*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %b, align 4
63*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
64*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a, align 4
65*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
66*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
67*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i32 %lftr.wideiv, %n
68*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
71*9880d681SAndroid Build Coastguard Worker  br label %for.end
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
74*9880d681SAndroid Build Coastguard Worker  ret void
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar2(
76*9880d681SAndroid Build Coastguard Worker; CHECK: call void @llvm.memset
77*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker;void bar3(foo_t *f, unsigned n) {
81*9880d681SAndroid Build Coastguard Worker;  for (unsigned i = n; i > 0; --i) {
82*9880d681SAndroid Build Coastguard Worker;    f[i].a = 0;
83*9880d681SAndroid Build Coastguard Worker;    f[i].b = 0;
84*9880d681SAndroid Build Coastguard Worker;  }
85*9880d681SAndroid Build Coastguard Worker;}
86*9880d681SAndroid Build Coastguard Workerdefine void @bar3(%struct.foo* nocapture %f, i32 %n) nounwind ssp {
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
89*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
92*9880d681SAndroid Build Coastguard Worker  %0 = zext i32 %n to i64
93*9880d681SAndroid Build Coastguard Worker  br label %for.body
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
96*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
97*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
98*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a, align 4
99*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
100*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %b, align 4
101*9880d681SAndroid Build Coastguard Worker  %1 = trunc i64 %indvars.iv to i32
102*9880d681SAndroid Build Coastguard Worker  %dec = add i32 %1, -1
103*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %dec, 0
104*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nsw i64 %indvars.iv, -1
105*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.end.loopexit, label %for.body
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
108*9880d681SAndroid Build Coastguard Worker  br label %for.end
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
111*9880d681SAndroid Build Coastguard Worker  ret void
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar3(
113*9880d681SAndroid Build Coastguard Worker; CHECK: call void @llvm.memset
114*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker;void bar4(foo_t *f, unsigned n) {
118*9880d681SAndroid Build Coastguard Worker;  for (unsigned i = 0; i < n; ++i) {
119*9880d681SAndroid Build Coastguard Worker;    f[i].a = 0;
120*9880d681SAndroid Build Coastguard Worker;    f[i].b = 1;
121*9880d681SAndroid Build Coastguard Worker;  }
122*9880d681SAndroid Build Coastguard Worker;}
123*9880d681SAndroid Build Coastguard Workerdefine void @bar4(%struct.foo* nocapture %f, i32 %n) nounwind ssp {
124*9880d681SAndroid Build Coastguard Workerentry:
125*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
126*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
129*9880d681SAndroid Build Coastguard Worker  br label %for.body
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
132*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
133*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 0
134*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a, align 4
135*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.foo, %struct.foo* %f, i64 %indvars.iv, i32 1
136*9880d681SAndroid Build Coastguard Worker  store i32 1, i32* %b, align 4
137*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
138*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
139*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i32 %lftr.wideiv, %n
140*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
143*9880d681SAndroid Build Coastguard Worker  br label %for.end
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
146*9880d681SAndroid Build Coastguard Worker  ret void
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar4(
148*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @llvm.memset
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker;void bar5(foo1_t *f, unsigned n) {
152*9880d681SAndroid Build Coastguard Worker;  for (unsigned i = 0; i < n; ++i) {
153*9880d681SAndroid Build Coastguard Worker;    f[i].a = 0;
154*9880d681SAndroid Build Coastguard Worker;    f[i].b = 0;
155*9880d681SAndroid Build Coastguard Worker;  }
156*9880d681SAndroid Build Coastguard Worker;}
157*9880d681SAndroid Build Coastguard Workerdefine void @bar5(%struct.foo1* nocapture %f, i32 %n) nounwind ssp {
158*9880d681SAndroid Build Coastguard Workerentry:
159*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
160*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
163*9880d681SAndroid Build Coastguard Worker  br label %for.body
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
166*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
167*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.foo1, %struct.foo1* %f, i64 %indvars.iv, i32 0
168*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a, align 4
169*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.foo1, %struct.foo1* %f, i64 %indvars.iv, i32 1
170*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %b, align 4
171*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
172*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
173*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i32 %lftr.wideiv, %n
174*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
177*9880d681SAndroid Build Coastguard Worker  br label %for.end
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
180*9880d681SAndroid Build Coastguard Worker  ret void
181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar5(
182*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @llvm.memset
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker;void bar6(foo2_t *f, unsigned n) {
186*9880d681SAndroid Build Coastguard Worker;  for (unsigned i = 0; i < n; ++i) {
187*9880d681SAndroid Build Coastguard Worker;    f[i].a = 0;
188*9880d681SAndroid Build Coastguard Worker;    f[i].b = 0;
189*9880d681SAndroid Build Coastguard Worker;    f[i].c = 0;
190*9880d681SAndroid Build Coastguard Worker;  }
191*9880d681SAndroid Build Coastguard Worker;}
192*9880d681SAndroid Build Coastguard Workerdefine void @bar6(%struct.foo2* nocapture %f, i32 %n) nounwind ssp {
193*9880d681SAndroid Build Coastguard Workerentry:
194*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
195*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
198*9880d681SAndroid Build Coastguard Worker  br label %for.body
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
201*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
202*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.foo2, %struct.foo2* %f, i64 %indvars.iv, i32 0
203*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a, align 4
204*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.foo2, %struct.foo2* %f, i64 %indvars.iv, i32 1
205*9880d681SAndroid Build Coastguard Worker  store i16 0, i16* %b, align 4
206*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.foo2, %struct.foo2* %f, i64 %indvars.iv, i32 2
207*9880d681SAndroid Build Coastguard Worker  store i16 0, i16* %c, align 2
208*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
209*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
210*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i32 %lftr.wideiv, %n
211*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
214*9880d681SAndroid Build Coastguard Worker  br label %for.end
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
217*9880d681SAndroid Build Coastguard Worker  ret void
218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar6(
219*9880d681SAndroid Build Coastguard Worker; CHECK: call void @llvm.memset
220*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
221*9880d681SAndroid Build Coastguard Worker}
222