[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / CorrelatedValuePropagation / shl.ll
blob0514ec95bdbf10d4bfe84c2ac46c13acc1a97f25
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -correlated-propagation -cvp-dont-add-nowrap-flags=false -S | FileCheck %s
4 define i8 @test0(i8 %a, i8 %b) {
5 ; CHECK-LABEL: @test0(
6 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[A:%.*]], [[B:%.*]]
7 ; CHECK-NEXT:    ret i8 [[SHL]]
9   %shl = shl i8 %a, %b
10   ret i8 %shl
13 define i8 @test1(i8 %a, i8 %b) {
14 ; CHECK-LABEL: @test1(
15 ; CHECK-NEXT:  entry:
16 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 8
17 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
18 ; CHECK:       bb:
19 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[A:%.*]], [[B]]
20 ; CHECK-NEXT:    ret i8 [[SHL]]
21 ; CHECK:       exit:
22 ; CHECK-NEXT:    ret i8 0
24 entry:
25   %cmp = icmp ult i8 %b, 8
26   br i1 %cmp, label %bb, label %exit
28 bb:
29   %shl = shl i8 %a, %b
30   ret i8 %shl
32 exit:
33   ret i8 0
36 define i8 @test2(i8 %a, i8 %b) {
37 ; CHECK-LABEL: @test2(
38 ; CHECK-NEXT:  entry:
39 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 9
40 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
41 ; CHECK:       bb:
42 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[A:%.*]], [[B]]
43 ; CHECK-NEXT:    ret i8 [[SHL]]
44 ; CHECK:       exit:
45 ; CHECK-NEXT:    ret i8 0
47 entry:
48   %cmp = icmp ult i8 %b, 9
49   br i1 %cmp, label %bb, label %exit
51 bb:
52   %shl = shl i8 %a, %b
53   ret i8 %shl
55 exit:
56   ret i8 0
59 define i8 @test3(i8 %a, i8 %b) {
60 ; CHECK-LABEL: @test3(
61 ; CHECK-NEXT:  entry:
62 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[B:%.*]], 6
63 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
64 ; CHECK:       bb:
65 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[A:%.*]], [[B]]
66 ; CHECK-NEXT:    ret i8 [[SHL]]
67 ; CHECK:       exit:
68 ; CHECK-NEXT:    ret i8 0
70 entry:
71   %cmp = icmp ugt i8 %b, 6
72   br i1 %cmp, label %bb, label %exit
74 bb:
75   %shl = shl i8 %a, %b
76   ret i8 %shl
78 exit:
79   ret i8 0
82 define i8 @test4(i8 %a, i8 %b) {
83 ; CHECK-LABEL: @test4(
84 ; CHECK-NEXT:  entry:
85 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[B:%.*]], 7
86 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
87 ; CHECK:       bb:
88 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i8 [[A:%.*]], [[B]]
89 ; CHECK-NEXT:    ret i8 [[SHL]]
90 ; CHECK:       exit:
91 ; CHECK-NEXT:    ret i8 0
93 entry:
94   %cmp = icmp ugt i8 %b, 7
95   br i1 %cmp, label %bb, label %exit
97 bb:
98   %shl = shl i8 %a, %b
99   ret i8 %shl
101 exit:
102   ret i8 0
105 define i8 @test5(i8 %b) {
106 ; CHECK-LABEL: @test5(
107 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i8 0, [[B:%.*]]
108 ; CHECK-NEXT:    ret i8 [[SHL]]
110   %shl = shl i8 0, %b
111   ret i8 %shl
114 define i8 @test6(i8 %b) {
115 ; CHECK-LABEL: @test6(
116 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw i8 1, [[B:%.*]]
117 ; CHECK-NEXT:    ret i8 [[SHL]]
119   %shl = shl i8 1, %b
120   ret i8 %shl
123 define i8 @test7(i8 %b) {
124 ; CHECK-LABEL: @test7(
125 ; CHECK-NEXT:  entry:
126 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 7
127 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
128 ; CHECK:       bb:
129 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i8 1, [[B]]
130 ; CHECK-NEXT:    ret i8 [[SHL]]
131 ; CHECK:       exit:
132 ; CHECK-NEXT:    ret i8 0
134 entry:
135   %cmp = icmp ult i8 %b, 7
136   br i1 %cmp, label %bb, label %exit
139   %shl = shl i8 1, %b
140   ret i8 %shl
142 exit:
143   ret i8 0
146 define i8 @test8(i8 %b) {
147 ; CHECK-LABEL: @test8(
148 ; CHECK-NEXT:    [[SHL:%.*]] = shl nsw i8 -1, [[B:%.*]]
149 ; CHECK-NEXT:    ret i8 [[SHL]]
151   %shl = shl i8 -1, %b
152   ret i8 %shl
155 define i8 @test9(i8 %b) {
156 ; CHECK-LABEL: @test9(
157 ; CHECK-NEXT:  entry:
158 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[B:%.*]], 0
159 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
160 ; CHECK:       bb:
161 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i8 -1, [[B]]
162 ; CHECK-NEXT:    ret i8 -1
163 ; CHECK:       exit:
164 ; CHECK-NEXT:    ret i8 0
166 entry:
167   %cmp = icmp eq i8 %b, 0
168   br i1 %cmp, label %bb, label %exit
171   %shl = shl i8 -1, %b
172   ret i8 %shl
174 exit:
175   ret i8 0
178 define i8 @test10(i8 %b) {
179 ; CHECK-LABEL: @test10(
180 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 42, [[B:%.*]]
181 ; CHECK-NEXT:    ret i8 [[SHL]]
183   %shl = shl i8 42, %b
184   ret i8 %shl
187 define i8 @test11(i8 %b) {
188 ; CHECK-LABEL: @test11(
189 ; CHECK-NEXT:  entry:
190 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 2
191 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
192 ; CHECK:       bb:
193 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i8 42, [[B]]
194 ; CHECK-NEXT:    ret i8 [[SHL]]
195 ; CHECK:       exit:
196 ; CHECK-NEXT:    ret i8 0
198 entry:
199   %cmp = icmp ult i8 %b, 2
200   br i1 %cmp, label %bb, label %exit
203   %shl = shl i8 42, %b
204   ret i8 %shl
206 exit:
207   ret i8 0
210 define i8 @test12(i8 %b) {
211 ; CHECK-LABEL: @test12(
212 ; CHECK-NEXT:  entry:
213 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 3
214 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
215 ; CHECK:       bb:
216 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw i8 42, [[B]]
217 ; CHECK-NEXT:    ret i8 [[SHL]]
218 ; CHECK:       exit:
219 ; CHECK-NEXT:    ret i8 0
221 entry:
222   %cmp = icmp ult i8 %b, 3
223   br i1 %cmp, label %bb, label %exit
226   %shl = shl i8 42, %b
227   ret i8 %shl
229 exit:
230   ret i8 0
233 define i8 @test13(i8 %b) {
234 ; CHECK-LABEL: @test13(
235 ; CHECK-NEXT:  entry:
236 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 4
237 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
238 ; CHECK:       bb:
239 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 42, [[B]]
240 ; CHECK-NEXT:    ret i8 [[SHL]]
241 ; CHECK:       exit:
242 ; CHECK-NEXT:    ret i8 0
244 entry:
245   %cmp = icmp ult i8 %b, 4
246   br i1 %cmp, label %bb, label %exit
249   %shl = shl i8 42, %b
250   ret i8 %shl
252 exit:
253   ret i8 0
256 define i8 @test14(i8 %b) {
257 ; CHECK-LABEL: @test14(
258 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -42, [[B:%.*]]
259 ; CHECK-NEXT:    ret i8 [[SHL]]
261   %shl = shl i8 -42, %b
262   ret i8 %shl
265 define i8 @test15(i8 %b) {
266 ; CHECK-LABEL: @test15(
267 ; CHECK-NEXT:  entry:
268 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 2
269 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
270 ; CHECK:       bb:
271 ; CHECK-NEXT:    [[SHL:%.*]] = shl nsw i8 -42, [[B]]
272 ; CHECK-NEXT:    ret i8 [[SHL]]
273 ; CHECK:       exit:
274 ; CHECK-NEXT:    ret i8 0
276 entry:
277   %cmp = icmp ult i8 %b, 2
278   br i1 %cmp, label %bb, label %exit
281   %shl = shl i8 -42, %b
282   ret i8 %shl
284 exit:
285   ret i8 0
288 define i8 @test16(i8 %b) {
289 ; CHECK-LABEL: @test16(
290 ; CHECK-NEXT:  entry:
291 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[B:%.*]], 3
292 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
293 ; CHECK:       bb:
294 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -42, [[B]]
295 ; CHECK-NEXT:    ret i8 [[SHL]]
296 ; CHECK:       exit:
297 ; CHECK-NEXT:    ret i8 0
299 entry:
300   %cmp = icmp ult i8 %b, 3
301   br i1 %cmp, label %bb, label %exit
304   %shl = shl i8 -42, %b
305   ret i8 %shl
307 exit:
308   ret i8 0
311 define i8 @test17(i8 %b) {
312 ; CHECK-LABEL: @test17(
313 ; CHECK-NEXT:  entry:
314 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[B:%.*]], 2
315 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
316 ; CHECK:       bb:
317 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i8 42, [[B]]
318 ; CHECK-NEXT:    ret i8 [[SHL]]
319 ; CHECK:       exit:
320 ; CHECK-NEXT:    ret i8 0
322 entry:
323   %cmp = icmp slt i8 %b, 2
324   br i1 %cmp, label %bb, label %exit
327   %shl = shl i8 42, %b
328   ret i8 %shl
330 exit:
331   ret i8 0
334 define i8 @test18(i8 %b) {
335 ; CHECK-LABEL: @test18(
336 ; CHECK-NEXT:  entry:
337 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[B:%.*]], 3
338 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
339 ; CHECK:       bb:
340 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw i8 42, [[B]]
341 ; CHECK-NEXT:    ret i8 [[SHL]]
342 ; CHECK:       exit:
343 ; CHECK-NEXT:    ret i8 0
345 entry:
346   %cmp = icmp slt i8 %b, 3
347   br i1 %cmp, label %bb, label %exit
350   %shl = shl i8 42, %b
351   ret i8 %shl
353 exit:
354   ret i8 0
357 define i8 @test19(i8 %b) {
358 ; CHECK-LABEL: @test19(
359 ; CHECK-NEXT:  entry:
360 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[B:%.*]], 4
361 ; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
362 ; CHECK:       bb:
363 ; CHECK-NEXT:    [[SHL:%.*]] = shl i8 42, [[B]]
364 ; CHECK-NEXT:    ret i8 [[SHL]]
365 ; CHECK:       exit:
366 ; CHECK-NEXT:    ret i8 0
368 entry:
369   %cmp = icmp slt i8 %b, 4
370   br i1 %cmp, label %bb, label %exit
373   %shl = shl i8 42, %b
374   ret i8 %shl
376 exit:
377   ret i8 0