xref: /llvm-project/llvm/test/Transforms/LoopUnrollAndJam/unprofitable.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
1; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -pass-remarks=loop-unroll < %s -S 2>&1 | FileCheck %s
2
3target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4target triple = "thumbv8m.main-arm-none-eabi"
5
6;; Common check for all tests. None should be unroll and jammed due to profitability
7; CHECK-NOT: remark: {{.*}} unroll and jammed
8
9
10; CHECK-LABEL: unprof1
11; Multiple inner loop blocks
12define void @unprof1(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {
13; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
14; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner2 ]
15entry:
16  %cmp = icmp ne i32 %J, 0
17  %cmp122 = icmp ne i32 %I, 0
18  %or.cond = and i1 %cmp, %cmp122
19  br i1 %or.cond, label %for.outer.preheader, label %for.end
20
21for.outer.preheader:
22  br label %for.outer
23
24for.outer:
25  %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
26  br label %for.inner
27
28for.inner:
29  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner2 ]
30  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner2 ]
31  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j
32  %0 = load i32, ptr %arrayidx, align 4
33  %add = add i32 %0, %sum1
34br label %for.inner2
35
36for.inner2:
37  %inc = add nuw i32 %j, 1
38  %exitcond = icmp eq i32 %inc, %J
39  br i1 %exitcond, label %for.latch, label %for.inner
40
41for.latch:
42  %add.lcssa = phi i32 [ %add, %for.inner2 ]
43  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i
44  store i32 %add.lcssa, ptr %arrayidx6, align 4
45  %addinc = add nuw i32 %i, 1
46  %exitcond25 = icmp eq i32 %addinc, %I
47  br i1 %exitcond25, label %for.loopexit, label %for.outer
48
49for.loopexit:
50  br label %for.end
51
52for.end:
53  ret void
54}
55
56
57; CHECK-LABEL: unprof2
58; Constant inner loop count
59define void @unprof2(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {
60; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
61; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
62entry:
63  %cmp = icmp ne i32 %J, 0
64  %cmp122 = icmp ne i32 %I, 0
65  %or.cond = and i1 %cmp, %cmp122
66  br i1 %or.cond, label %for.outer.preheader, label %for.end
67
68for.outer.preheader:
69  br label %for.outer
70
71for.outer:
72  %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
73  br label %for.inner
74
75for.inner:
76  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
77  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
78  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j
79  %0 = load i32, ptr %arrayidx, align 4
80  %add = add i32 %0, %sum1
81  %inc = add nuw i32 %j, 1
82  %exitcond = icmp eq i32 %inc, 10
83  br i1 %exitcond, label %for.latch, label %for.inner
84
85for.latch:
86  %add.lcssa = phi i32 [ %add, %for.inner ]
87  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i
88  store i32 %add.lcssa, ptr %arrayidx6, align 4
89  %addinc = add nuw i32 %i, 1
90  %exitcond25 = icmp eq i32 %addinc, %I
91  br i1 %exitcond25, label %for.loopexit, label %for.outer
92
93for.loopexit:
94  br label %for.end
95
96for.end:
97  ret void
98}
99
100
101; CHECK-LABEL: unprof3
102; Complex inner loop
103define void @unprof3(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {
104; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
105; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
106entry:
107  %cmp = icmp ne i32 %J, 0
108  %cmp122 = icmp ne i32 %I, 0
109  %or.cond = and i1 %cmp, %cmp122
110  br i1 %or.cond, label %for.outer.preheader, label %for.end
111
112for.outer.preheader:
113  br label %for.outer
114
115for.outer:
116  %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
117  br label %for.inner
118
119for.inner:
120  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
121  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
122  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j
123  %0 = load i32, ptr %arrayidx, align 4
124  %add = add i32 %0, %sum1
125  %add0 = add i32 %0, %sum1
126  %add1 = add i32 %0, %sum1
127  %add2 = add i32 %0, %sum1
128  %add3 = add i32 %0, %sum1
129  %add4 = add i32 %0, %sum1
130  %add5 = add i32 %0, %sum1
131  %add6 = add i32 %0, %sum1
132  %add7 = add i32 %0, %sum1
133  %add8 = add i32 %0, %sum1
134  %add9 = add i32 %0, %sum1
135  %add10 = add i32 %0, %sum1
136  %add11 = add i32 %0, %sum1
137  %add12 = add i32 %0, %sum1
138  %add13 = add i32 %0, %sum1
139  %add14 = add i32 %0, %sum1
140  %add15 = add i32 %0, %sum1
141  %add16 = add i32 %0, %sum1
142  %add17 = add i32 %0, %sum1
143  %add18 = add i32 %0, %sum1
144  %add19 = add i32 %0, %sum1
145  %add20 = add i32 %0, %sum1
146  %add21 = add i32 %0, %sum1
147  %add22 = add i32 %0, %sum1
148  %add23 = add i32 %0, %sum1
149  %add24 = add i32 %0, %sum1
150  %add25 = add i32 %0, %sum1
151  %add26 = add i32 %0, %sum1
152  %add27 = add i32 %0, %sum1
153  %add28 = add i32 %0, %sum1
154  %add29 = add i32 %0, %sum1
155  %inc = add nuw i32 %j, 1
156  %exitcond = icmp eq i32 %inc, %J
157  br i1 %exitcond, label %for.latch, label %for.inner
158
159for.latch:
160  %add.lcssa = phi i32 [ %add, %for.inner ]
161  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i
162  store i32 %add.lcssa, ptr %arrayidx6, align 4
163  %addinc = add nuw i32 %i, 1
164  %exitcond25 = icmp eq i32 %addinc, %I
165  br i1 %exitcond25, label %for.loopexit, label %for.outer
166
167for.loopexit:
168  br label %for.end
169
170for.end:
171  ret void
172}
173
174
175; CHECK-LABEL: unprof4
176; No loop invariant loads
177define void @unprof4(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {
178; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
179; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
180entry:
181  %cmp = icmp ne i32 %J, 0
182  %cmp122 = icmp ne i32 %I, 0
183  %or.cond = and i1 %cmp, %cmp122
184  br i1 %or.cond, label %for.outer.preheader, label %for.end
185
186for.outer.preheader:
187  br label %for.outer
188
189for.outer:
190  %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
191  br label %for.inner
192
193for.inner:
194  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
195  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
196  %j2 = add i32 %j, %i
197  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j2
198  %0 = load i32, ptr %arrayidx, align 4
199  %add = add i32 %0, %sum1
200  %inc = add nuw i32 %j, 1
201  %exitcond = icmp eq i32 %inc, %J
202  br i1 %exitcond, label %for.latch, label %for.inner
203
204for.latch:
205  %add.lcssa = phi i32 [ %add, %for.inner ]
206  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i
207  store i32 %add.lcssa, ptr %arrayidx6, align 4
208  %addinc = add nuw i32 %i, 1
209  %exitcond25 = icmp eq i32 %addinc, %I
210  br i1 %exitcond25, label %for.loopexit, label %for.outer
211
212for.loopexit:
213  br label %for.end
214
215for.end:
216  ret void
217}
218