[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Transforms / LoopUnrollAndJam / unprofitable.ll
blob64dbab87905be3bdc6ea7818c837a368b96f28fb
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 ]
15 entry:
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
21 for.outer.preheader:
22   br label %for.outer
24 for.outer:
25   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
26   br label %for.inner
28 for.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, i32* %B, i32 %j
32   %0 = load i32, i32* %arrayidx, align 4
33   %add = add i32 %0, %sum1
34 br label %for.inner2
36 for.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
41 for.latch:
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
49 for.loopexit:
50   br label %for.end
52 for.end:
53   ret void
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 ]
62 entry:
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
68 for.outer.preheader:
69   br label %for.outer
71 for.outer:
72   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
73   br label %for.inner
75 for.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, 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
85 for.latch:
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
93 for.loopexit:
94   br label %for.end
96 for.end:
97   ret void
101 ; CHECK-LABEL: unprof3
102 ; Complex inner loop
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 ]
106 entry:
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
112 for.outer.preheader:
113   br label %for.outer
115 for.outer:
116   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
117   br label %for.inner
119 for.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, 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
159 for.latch:
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
167 for.loopexit:
168   br label %for.end
170 for.end:
171   ret void
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 ]
180 entry:
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
186 for.outer.preheader:
187   br label %for.outer
189 for.outer:
190   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
191   br label %for.inner
193 for.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, 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
204 for.latch:
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
212 for.loopexit:
213   br label %for.end
215 for.end:
216   ret void