1 ; RUN: opt -loop-unroll-and-jam -allow-unroll-and-jam -pass-remarks=loop-unroll < %s -S 2>&1 | FileCheck %s
3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4 target triple = "thumbv8m.main-arm-none-eabi"
6 ;; Common check for all tests. None should be unroll and jammed due to profitability
7 ; CHECK-NOT: remark: {{.*}} unroll and jammed
10 ; CHECK-LABEL: unprof1
11 ; Multiple inner loop blocks
12 define void @unprof1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ]
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
25 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
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, i32* %B, i32 %j
32 %0 = load i32, i32* %arrayidx, align 4
33 %add = add i32 %0, %sum1
37 %inc = add nuw i32 %j, 1
38 %exitcond = icmp eq i32 %inc, %J
39 br i1 %exitcond, label %for.latch, label %for.inner
42 %add.lcssa = phi i32 [ %add, %for.inner2 ]
43 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
44 store i32 %add.lcssa, i32* %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
57 ; CHECK-LABEL: unprof2
58 ; Constant inner loop count
59 define void @unprof2(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ]
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
72 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
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, i32* %B, i32 %j
79 %0 = load i32, i32* %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
86 %add.lcssa = phi i32 [ %add, %for.inner ]
87 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
88 store i32 %add.lcssa, i32* %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
101 ; CHECK-LABEL: unprof3
103 define void @unprof3(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ]
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
116 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
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, i32* %B, i32 %j
123 %0 = load i32, i32* %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
160 %add.lcssa = phi i32 [ %add, %for.inner ]
161 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
162 store i32 %add.lcssa, i32* %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
175 ; CHECK-LABEL: unprof4
176 ; No loop invariant loads
177 define void @unprof4(i32 %I, i32 %J, i32* noalias nocapture %A, i32* 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 ]
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
190 %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
194 %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
195 %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
197 %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j2
198 %0 = load i32, i32* %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
205 %add.lcssa = phi i32 [ %add, %for.inner ]
206 %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
207 store i32 %add.lcssa, i32* %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