xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/shl.ll (revision 71f56e49ceca75dbf82cbb9537c2545c2d2e51c9)
1fb3e2befSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2fb3e2befSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3fb3e2befSFlorian Hahn
4fb3e2befSFlorian Hahndeclare void @llvm.assume(i1)
5fb3e2befSFlorian Hahn
6fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_1(i8 %start, i8 %high) {
7fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_1(
8fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
9fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
10fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
11fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
12fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
13fb3e2befSFlorian Hahn;
14fb3e2befSFlorian Hahnentry:
15fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
16fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
17fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
18fb3e2befSFlorian Hahn
19fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
20fb3e2befSFlorian Hahn  ret i1 %t.1
21fb3e2befSFlorian Hahn}
22fb3e2befSFlorian Hahn
23fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_2(i8 %start, i8 %high) {
24fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_2(
25fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
26fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
27fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
28fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
29fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
30fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
31fb3e2befSFlorian Hahn;
32fb3e2befSFlorian Hahnentry:
33fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
34fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
35fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
36fb3e2befSFlorian Hahn
37fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
38fb3e2befSFlorian Hahn  %t = icmp ult i8 %start.shl.2, %high
39fb3e2befSFlorian Hahn  ret i1 %t
40fb3e2befSFlorian Hahn}
41fb3e2befSFlorian Hahn
42fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_3(i8 %start, i8 %high) {
43fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_3(
44fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
45fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
46fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
47fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
48fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
49fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
50fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
51fb3e2befSFlorian Hahn;
52fb3e2befSFlorian Hahnentry:
53fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
54fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
55fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
56fb3e2befSFlorian Hahn
57fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
58fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
59fb3e2befSFlorian Hahn  %t = icmp ule i8 %start.add.1, %start.shl.2
60fb3e2befSFlorian Hahn  ret i1 %t
61fb3e2befSFlorian Hahn}
62fb3e2befSFlorian Hahn
63fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_4(i8 %start, i8 %high) {
64fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_4(
65fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
66fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
67fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
68fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
69fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
70fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
71fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_SHL_2]]
72fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
73fb3e2befSFlorian Hahn;
74fb3e2befSFlorian Hahnentry:
75fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
76fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
77fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
78fb3e2befSFlorian Hahn
79fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
80fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
81fb3e2befSFlorian Hahn  %f = icmp ult i8 %start.add.1, %start.shl.2
82fb3e2befSFlorian Hahn  ret i1 %f
83fb3e2befSFlorian Hahn}
84fb3e2befSFlorian Hahn
85fb3e2befSFlorian Hahn
86fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_5(i8 %start, i8 %high) {
87fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_5(
88fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
89fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
90fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
91fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
92fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
93fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
94fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
95fb3e2befSFlorian Hahn;
96fb3e2befSFlorian Hahnentry:
97fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
98fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
99fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
100fb3e2befSFlorian Hahn
101fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
102fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
103fb3e2befSFlorian Hahn  %t.4 = icmp ule i8 %start.add.2, %start.shl.4
104fb3e2befSFlorian Hahn  ret i1 %t.4
105fb3e2befSFlorian Hahn}
106fb3e2befSFlorian Hahn
107fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_6(i8 %start, i8 %high) {
108fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_6(
109fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
110fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
111fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
112fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
113fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
114fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
115fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]]
116fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_2]]
117fb3e2befSFlorian Hahn;
118fb3e2befSFlorian Hahnentry:
119fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
120fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
121fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
122fb3e2befSFlorian Hahn
123fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
124fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
125fb3e2befSFlorian Hahn  %f.2 = icmp ult i8 %start.add.2, %start.shl.4
126fb3e2befSFlorian Hahn  ret i1 %f.2
127fb3e2befSFlorian Hahn}
128fb3e2befSFlorian Hahn
129fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_7(i8 %start, i8 %high) {
130fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_7(
131fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
132fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
133fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
134fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
135fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
136fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
137fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
138fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
139fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_SHL_4]]
140fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_3]]
141fb3e2befSFlorian Hahn;
142fb3e2befSFlorian Hahnentry:
143fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
144fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
145fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
146fb3e2befSFlorian Hahn
147fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
148fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
149fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
150fb3e2befSFlorian Hahn  %start.add.2.1 = add nuw i8 %start.add.2, 1
151fb3e2befSFlorian Hahn  %f.3 = icmp ule i8 %start.add.2.1, %start.shl.4
152fb3e2befSFlorian Hahn  ret i1 %f.3
153fb3e2befSFlorian Hahn}
154fb3e2befSFlorian Hahn
155fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_8(i8 %start, i8 %high) {
156fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_8(
157fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
158fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
159fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
160fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
161fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
162fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
163fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
164fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
165fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3
166fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
167fb3e2befSFlorian Hahn;
168fb3e2befSFlorian Hahnentry:
169fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
170fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
171fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
172fb3e2befSFlorian Hahn
173fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
174fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
175fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
176fb3e2befSFlorian Hahn  %start.add.2.1 = add nuw i8 %start.add.2, 1
177fb3e2befSFlorian Hahn  %start.shl.3 = shl nuw i8 %start, 3
178fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.1, %start.shl.3
179fb3e2befSFlorian Hahn  ret i1 %t.5
180fb3e2befSFlorian Hahn}
181fb3e2befSFlorian Hahn
182fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_9(i8 %start, i8 %high) {
183fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_9(
184fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
185fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4
186fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
187fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
188fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
189fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
190fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
191fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
192fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3
193fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_3]]
194fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_5]]
195fb3e2befSFlorian Hahn;
196fb3e2befSFlorian Hahnentry:
197fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %start, 4
198fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
199fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
200fb3e2befSFlorian Hahn
201fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
202fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
203fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
204fb3e2befSFlorian Hahn  %start.add.2.1 = add nuw i8 %start.add.2, 1
205fb3e2befSFlorian Hahn  %start.shl.3 = shl nuw i8 %start, 3
206fb3e2befSFlorian Hahn  %f.5 = icmp ult i8 %start.add.2, %start.shl.3
207fb3e2befSFlorian Hahn  ret i1 %f.5
208fb3e2befSFlorian Hahn}
209fb3e2befSFlorian Hahn
210fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_10(i8 %start, i8 %high) {
211fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_10(
212fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
213fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl nuw i8 [[START:%.*]], 5
214fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]]
215fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
216fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3
2177c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
218fb3e2befSFlorian Hahn;
219fb3e2befSFlorian Hahnentry:
220fb3e2befSFlorian Hahn  %start.shl.5 = shl nuw i8 %start, 5
221fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.shl.5
222fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
223fb3e2befSFlorian Hahn
224fb3e2befSFlorian Hahn  %start.shl.3 = shl nuw i8 %start, 3
225fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.shl.3, %start.shl.5
226fb3e2befSFlorian Hahn  ret i1 %t.1
227fb3e2befSFlorian Hahn}
228fb3e2befSFlorian Hahn
229fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_11(i8 %start, i8 %high) {
230fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_11(
231fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
232fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl nuw i8 [[START:%.*]], 5
233fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]]
234fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
235fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3
2367c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
237fb3e2befSFlorian Hahn;
238fb3e2befSFlorian Hahnentry:
239fb3e2befSFlorian Hahn  %start.shl.5 = shl nuw i8 %start, 5
240fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.shl.5
241fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
242fb3e2befSFlorian Hahn
243fb3e2befSFlorian Hahn  %start.shl.3 = shl nuw i8 %start, 3
244fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.shl.5, %start.shl.3
245fb3e2befSFlorian Hahn  ret i1 %c.1
246fb3e2befSFlorian Hahn}
247fb3e2befSFlorian Hahn
248fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_12(i8 %start) {
249fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_12(
250fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
251fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nuw i8 [[START:%.*]], 3
252fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START]], [[START_SHL_3]]
253fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
254fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl nuw i8 [[START]], 5
2557c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
256fb3e2befSFlorian Hahn;
257fb3e2befSFlorian Hahnentry:
258fb3e2befSFlorian Hahn  %start.shl.3 = shl nuw i8 %start, 3
259fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start, %start.shl.3
260fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
261fb3e2befSFlorian Hahn
262fb3e2befSFlorian Hahn  %start.shl.5 = shl nuw i8 %start, 5
263fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.shl.3, %start.shl.5
264fb3e2befSFlorian Hahn  ret i1 %t.1
265fb3e2befSFlorian Hahn}
266fb3e2befSFlorian Hahn
267fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_13(i8 %start) {
268fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_13(
269fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
270fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl i8 [[START:%.*]], 3
271fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START]], [[START_SHL_3]]
272fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
273fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl i8 [[START]], 5
274fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]]
275fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_1]]
276fb3e2befSFlorian Hahn;
277fb3e2befSFlorian Hahnentry:
278fb3e2befSFlorian Hahn  %start.shl.3 = shl i8 %start, 3
279fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start, %start.shl.3
280fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
281fb3e2befSFlorian Hahn
282fb3e2befSFlorian Hahn  %start.shl.5 = shl i8 %start, 5
283fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.shl.5, %start.shl.3
284fb3e2befSFlorian Hahn  ret i1 %f.1
285fb3e2befSFlorian Hahn}
286fb3e2befSFlorian Hahn
287fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_1(i8 %start, i8 %high) {
288fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_1(
289fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
290fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
291fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4
292fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
293fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
294fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
295fb3e2befSFlorian Hahn;
296fb3e2befSFlorian Hahnentry:
297fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
298fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %add, 4
299fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
300fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
301fb3e2befSFlorian Hahn
302fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
303fb3e2befSFlorian Hahn  ret i1 %t.1
304fb3e2befSFlorian Hahn}
305fb3e2befSFlorian Hahn
306fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_2(i8 %start, i8 %high) {
307fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_2(
308fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
309fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
310fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4
311fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
312fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
313fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
314fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
315fb3e2befSFlorian Hahn;
316fb3e2befSFlorian Hahnentry:
317fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
318fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %add, 4
319fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
320fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
321fb3e2befSFlorian Hahn
322fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
323fb3e2befSFlorian Hahn  %t.2 = icmp ult i8 %start.shl.2, %high
324fb3e2befSFlorian Hahn  ret i1 %t.2
325fb3e2befSFlorian Hahn}
326fb3e2befSFlorian Hahn
327fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_3(i8 %start, i8 %high) {
328fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_3(
329fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
330fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
331fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4
332fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
333fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
334fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
335fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
336fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
337fb3e2befSFlorian Hahn;
338fb3e2befSFlorian Hahnentry:
339fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
340fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %add, 4
341fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
342fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
343fb3e2befSFlorian Hahn
344fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
345fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
346fb3e2befSFlorian Hahn  %t.3 = icmp ule i8 %start.add.2, %start.shl.4
347fb3e2befSFlorian Hahn  ret i1 %t.3
348fb3e2befSFlorian Hahn}
349fb3e2befSFlorian Hahn
350fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_4(i8 %start, i8 %high) {
351fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_4(
352fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
353fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
354fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4
355fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
356fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
357fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2
358fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
359fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
360fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
361fb3e2befSFlorian Hahn;
362fb3e2befSFlorian Hahnentry:
363fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
364fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %add, 4
365fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
366fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
367fb3e2befSFlorian Hahn
368fb3e2befSFlorian Hahn  %start.shl.2 = shl nuw i8 %start, 2
369fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
370fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
371fb3e2befSFlorian Hahn  %t.4 = icmp ult i8 %start.add.2, %start.shl.4
372fb3e2befSFlorian Hahn  ret i1 %t.4
373fb3e2befSFlorian Hahn}
374fb3e2befSFlorian Hahn
375fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_5(i8 %start, i8 %high) {
376fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_5(
377fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
378fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
379fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4
380fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
381fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
382fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
383fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
384fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_12:%.*]] = add nuw i8 [[START_ADD_2]], 12
385fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
386fb3e2befSFlorian Hahn;
387fb3e2befSFlorian Hahnentry:
388fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
389fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %add, 4
390fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
391fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
392fb3e2befSFlorian Hahn
393fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
394fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
395fb3e2befSFlorian Hahn  %start.add.2.12 = add nuw i8 %start.add.2, 12
396fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.2.12, %start.shl.4
397fb3e2befSFlorian Hahn  ret i1 %t.5
398fb3e2befSFlorian Hahn}
399fb3e2befSFlorian Hahn
400fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_6(i8 %start, i8 %high) {
401fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_6(
402fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
403fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
404fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4
405fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
406fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
407fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
408fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
409fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_13:%.*]] = add nuw i8 [[START_ADD_2]], 13
410fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
411fb3e2befSFlorian Hahn;
412fb3e2befSFlorian Hahnentry:
413fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
414fb3e2befSFlorian Hahn  %start.shl.4 = shl nuw i8 %add, 4
415fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
416fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
417fb3e2befSFlorian Hahn
418fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
419fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
420fb3e2befSFlorian Hahn  %start.add.2.13 = add nuw i8 %start.add.2, 13
421fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.add.2.13, %start.shl.4
422fb3e2befSFlorian Hahn  ret i1 %f.1
423fb3e2befSFlorian Hahn}
424fb3e2befSFlorian Hahn
425fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_1(i8 %start, i8 %high) {
426fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_1(
427fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
428fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
429fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
430fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
431fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
432fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
433fb3e2befSFlorian Hahn;
434fb3e2befSFlorian Hahnentry:
435fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
436fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
437fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
438fb3e2befSFlorian Hahn
439fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
440fb3e2befSFlorian Hahn  ret i1 %t.1
441fb3e2befSFlorian Hahn}
442fb3e2befSFlorian Hahn
443fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_2(i8 %start, i8 %high) {
444fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_2(
445fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
446fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
447fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
448fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
449fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
450fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]]
451fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
452fb3e2befSFlorian Hahn;
453fb3e2befSFlorian Hahnentry:
454fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
455fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
456fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
457fb3e2befSFlorian Hahn
458fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
459fb3e2befSFlorian Hahn  %t = icmp ult i8 %start.shl.2, %high
460fb3e2befSFlorian Hahn  ret i1 %t
461fb3e2befSFlorian Hahn}
462fb3e2befSFlorian Hahn
463fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_3(i8 %start, i8 %high) {
464fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_3(
465fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
466fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
467fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
468fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
469fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
470fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
471fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_2]]
472fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
473fb3e2befSFlorian Hahn;
474fb3e2befSFlorian Hahnentry:
475fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
476fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
477fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
478fb3e2befSFlorian Hahn
479fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
480fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
481fb3e2befSFlorian Hahn  %t = icmp ule i8 %start.add.1, %start.shl.2
482fb3e2befSFlorian Hahn  ret i1 %t
483fb3e2befSFlorian Hahn}
484fb3e2befSFlorian Hahn
485fb3e2befSFlorian Hahn
486fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_4(i8 %start, i8 %high) {
487fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_4(
488fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
489fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
490fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
491fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
492fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
493fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
494fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_SHL_2]]
495fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
496fb3e2befSFlorian Hahn;
497fb3e2befSFlorian Hahnentry:
498fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
499fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
500fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
501fb3e2befSFlorian Hahn
502fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
503fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
504fb3e2befSFlorian Hahn  %f = icmp ult i8 %start.add.1, %start.shl.2
505fb3e2befSFlorian Hahn  ret i1 %f
506fb3e2befSFlorian Hahn}
507fb3e2befSFlorian Hahn
508fb3e2befSFlorian Hahn
509fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_5(i8 %start, i8 %high) {
510fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_5(
511fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
512fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
513fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
514fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
515fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
516fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
517fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]]
518fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
519fb3e2befSFlorian Hahn;
520fb3e2befSFlorian Hahnentry:
521fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
522fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
523fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
524fb3e2befSFlorian Hahn
525fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
526fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
527fb3e2befSFlorian Hahn  %t.4 = icmp ule i8 %start.add.2, %start.shl.4
528fb3e2befSFlorian Hahn  ret i1 %t.4
529fb3e2befSFlorian Hahn}
530fb3e2befSFlorian Hahn
531fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_6(i8 %start, i8 %high) {
532fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_6(
533fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
534fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
535fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
536fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
537fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
538fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
539fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]]
540fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_2]]
541fb3e2befSFlorian Hahn;
542fb3e2befSFlorian Hahnentry:
543fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
544fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
545fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
546fb3e2befSFlorian Hahn
547fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
548fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
549fb3e2befSFlorian Hahn  %f.2 = icmp ult i8 %start.add.2, %start.shl.4
550fb3e2befSFlorian Hahn  ret i1 %f.2
551fb3e2befSFlorian Hahn}
552fb3e2befSFlorian Hahn
553fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_7(i8 %start, i8 %high) {
554fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_7(
555fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
556fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
557fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
558fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
559fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
560fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
561fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
562fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1
563fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_SHL_4]]
564fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_3]]
565fb3e2befSFlorian Hahn;
566fb3e2befSFlorian Hahnentry:
567fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
568fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
569fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
570fb3e2befSFlorian Hahn
571fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
572fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
573fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
574fb3e2befSFlorian Hahn  %start.add.2.1 = add nsw i8 %start.add.2, 1
575fb3e2befSFlorian Hahn  %f.3 = icmp ule i8 %start.add.2.1, %start.shl.4
576fb3e2befSFlorian Hahn  ret i1 %f.3
577fb3e2befSFlorian Hahn}
578fb3e2befSFlorian Hahn
579fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_8(i8 %start, i8 %high) {
580fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_8(
581fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
582fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
583fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
584fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
585fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
586fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
587fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
588fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1
589fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3
590fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_3]]
591fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
592fb3e2befSFlorian Hahn;
593fb3e2befSFlorian Hahnentry:
594fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
595fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
596fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
597fb3e2befSFlorian Hahn
598fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
599fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
600fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
601fb3e2befSFlorian Hahn  %start.add.2.1 = add nsw i8 %start.add.2, 1
602fb3e2befSFlorian Hahn  %start.shl.3 = shl nsw i8 %start, 3
603fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.1, %start.shl.3
604fb3e2befSFlorian Hahn  ret i1 %t.5
605fb3e2befSFlorian Hahn}
606fb3e2befSFlorian Hahn
607fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_9(i8 %start, i8 %high) {
608fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_9(
609fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
610fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4
611fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
612fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
613fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
614fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
615fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
616fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1
617fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3
618fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_3]]
619fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_5]]
620fb3e2befSFlorian Hahn;
621fb3e2befSFlorian Hahnentry:
622fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %start, 4
623fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
624fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
625fb3e2befSFlorian Hahn
626fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
627fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
628fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
629fb3e2befSFlorian Hahn  %start.add.2.1 = add nsw i8 %start.add.2, 1
630fb3e2befSFlorian Hahn  %start.shl.3 = shl nsw i8 %start, 3
631fb3e2befSFlorian Hahn  %f.5 = icmp ult i8 %start.add.2, %start.shl.3
632fb3e2befSFlorian Hahn  ret i1 %f.5
633fb3e2befSFlorian Hahn}
634fb3e2befSFlorian Hahn
635fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_10(i8 %start, i8 %high) {
636fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_10(
637fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
638fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl nsw i8 [[START:%.*]], 5
639fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]]
640fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
641fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3
642fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_SHL_3]], [[START_SHL_5]]
643fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
644fb3e2befSFlorian Hahn;
645fb3e2befSFlorian Hahnentry:
646fb3e2befSFlorian Hahn  %start.shl.5 = shl nsw i8 %start, 5
647fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.shl.5
648fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
649fb3e2befSFlorian Hahn
650fb3e2befSFlorian Hahn  %start.shl.3 = shl nsw i8 %start, 3
651fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.shl.3, %start.shl.5
652fb3e2befSFlorian Hahn  ret i1 %t.1
653fb3e2befSFlorian Hahn}
654fb3e2befSFlorian Hahn
655fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_11(i8 %start, i8 %high) {
656fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_11(
657fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
658fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl nsw i8 [[START:%.*]], 5
659fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]]
660fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
661fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3
662fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]]
663fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
664fb3e2befSFlorian Hahn;
665fb3e2befSFlorian Hahnentry:
666fb3e2befSFlorian Hahn  %start.shl.5 = shl nsw i8 %start, 5
667fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.shl.5
668fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
669fb3e2befSFlorian Hahn
670fb3e2befSFlorian Hahn  %start.shl.3 = shl nsw i8 %start, 3
671fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.shl.5, %start.shl.3
672fb3e2befSFlorian Hahn  ret i1 %c.1
673fb3e2befSFlorian Hahn}
674fb3e2befSFlorian Hahn
675fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_1(i8 %start, i8 %high) {
676fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_1(
677fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
678fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
679fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4
680fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
681fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
682fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
683fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
684fb3e2befSFlorian Hahn;
685fb3e2befSFlorian Hahnentry:
686fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
687fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %add, 4
688fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
689fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
690fb3e2befSFlorian Hahn
691fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
692fb3e2befSFlorian Hahn  ret i1 %t.1
693fb3e2befSFlorian Hahn}
694fb3e2befSFlorian Hahn
695fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_2(i8 %start, i8 %high) {
696fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_2(
697fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
698fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
699fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4
700fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
701fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
702fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
703fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]]
704fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_2]]
705fb3e2befSFlorian Hahn;
706fb3e2befSFlorian Hahnentry:
707fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
708fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %add, 4
709fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
710fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
711fb3e2befSFlorian Hahn
712fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
713fb3e2befSFlorian Hahn  %t.2 = icmp ult i8 %start.shl.2, %high
714fb3e2befSFlorian Hahn  ret i1 %t.2
715fb3e2befSFlorian Hahn}
716fb3e2befSFlorian Hahn
717fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_3(i8 %start, i8 %high) {
718fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_3(
719fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
720fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
721fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4
722fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
723fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
724fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
725fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
726fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]]
727fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_3]]
728fb3e2befSFlorian Hahn;
729fb3e2befSFlorian Hahnentry:
730fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
731fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %add, 4
732fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
733fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
734fb3e2befSFlorian Hahn
735fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
736fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
737fb3e2befSFlorian Hahn  %t.3 = icmp ule i8 %start.add.2, %start.shl.4
738fb3e2befSFlorian Hahn  ret i1 %t.3
739fb3e2befSFlorian Hahn}
740fb3e2befSFlorian Hahn
741fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_4(i8 %start, i8 %high) {
742fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_4(
743fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
744fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
745fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4
746fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
747fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
748fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2
749fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
750fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
751fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]]
752fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
753fb3e2befSFlorian Hahn;
754fb3e2befSFlorian Hahnentry:
755fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
756fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %add, 4
757fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
758fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
759fb3e2befSFlorian Hahn
760fb3e2befSFlorian Hahn  %start.shl.2 = shl nsw i8 %start, 2
761fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
762fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
763fb3e2befSFlorian Hahn  %t.4 = icmp ult i8 %start.add.2, %start.shl.4
764fb3e2befSFlorian Hahn  ret i1 %t.4
765fb3e2befSFlorian Hahn}
766fb3e2befSFlorian Hahn
767fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_5(i8 %start, i8 %high) {
768fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_5(
769fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
770fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
771fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4
772fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
773fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
774fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
775fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
776fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_12:%.*]] = add nsw i8 [[START_ADD_2]], 12
777fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_SHL_4]]
778fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
779fb3e2befSFlorian Hahn;
780fb3e2befSFlorian Hahnentry:
781fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
782fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %add, 4
783fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
784fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
785fb3e2befSFlorian Hahn
786fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
787fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
788fb3e2befSFlorian Hahn  %start.add.2.12 = add nsw i8 %start.add.2, 12
789fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.2.12, %start.shl.4
790fb3e2befSFlorian Hahn  ret i1 %t.5
791fb3e2befSFlorian Hahn}
792fb3e2befSFlorian Hahn
793fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_6(i8 %start, i8 %high) {
794fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_6(
795fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
796fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
797fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4
798fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
799fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
800fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
801fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
802fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_13:%.*]] = add nsw i8 [[START_ADD_2]], 13
803fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_SHL_4]]
804fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_1]]
805fb3e2befSFlorian Hahn;
806fb3e2befSFlorian Hahnentry:
807fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
808fb3e2befSFlorian Hahn  %start.shl.4 = shl nsw i8 %add, 4
809fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
810fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
811fb3e2befSFlorian Hahn
812fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
813fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
814fb3e2befSFlorian Hahn  %start.add.2.13 = add nsw i8 %start.add.2, 13
815fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.add.2.13, %start.shl.4
816fb3e2befSFlorian Hahn  ret i1 %f.1
817fb3e2befSFlorian Hahn}
818fb3e2befSFlorian Hahn
819fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_1(i8 %start, i8 %high) {
820fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_1(
821fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
822fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
823fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
824fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
825fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
826fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
827fb3e2befSFlorian Hahn;
828fb3e2befSFlorian Hahnentry:
829fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
830fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
831fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
832fb3e2befSFlorian Hahn
833fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
834fb3e2befSFlorian Hahn  ret i1 %t.1
835fb3e2befSFlorian Hahn}
836fb3e2befSFlorian Hahn
837fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_2(i8 %start, i8 %high) {
838fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_2(
839fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
840fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
841fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
842fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
843fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
844fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]]
845fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
846fb3e2befSFlorian Hahn;
847fb3e2befSFlorian Hahnentry:
848fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
849fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
850fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
851fb3e2befSFlorian Hahn
852fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
853fb3e2befSFlorian Hahn  %t = icmp ult i8 %start.shl.2, %high
854fb3e2befSFlorian Hahn  ret i1 %t
855fb3e2befSFlorian Hahn}
856fb3e2befSFlorian Hahn
857fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_3(i8 %start, i8 %high) {
858fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_3(
859fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
860fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
861fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
862fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
863fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
864fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
865fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_2]]
866fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
867fb3e2befSFlorian Hahn;
868fb3e2befSFlorian Hahnentry:
869fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
870fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
871fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
872fb3e2befSFlorian Hahn
873fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
874fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
875fb3e2befSFlorian Hahn  %t = icmp ule i8 %start.add.1, %start.shl.2
876fb3e2befSFlorian Hahn  ret i1 %t
877fb3e2befSFlorian Hahn}
878fb3e2befSFlorian Hahn
879fb3e2befSFlorian Hahn
880fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_4(i8 %start, i8 %high) {
881fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_4(
882fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
883fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
884fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
885fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
886fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
887fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
888fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_SHL_2]]
889fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
890fb3e2befSFlorian Hahn;
891fb3e2befSFlorian Hahnentry:
892fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
893fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
894fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
895fb3e2befSFlorian Hahn
896fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
897fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
898fb3e2befSFlorian Hahn  %f = icmp ult i8 %start.add.1, %start.shl.2
899fb3e2befSFlorian Hahn  ret i1 %f
900fb3e2befSFlorian Hahn}
901fb3e2befSFlorian Hahn
902fb3e2befSFlorian Hahn
903fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_5(i8 %start, i8 %high) {
904fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_5(
905fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
906fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
907fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
908fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
909fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
910fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
911fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]]
912fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
913fb3e2befSFlorian Hahn;
914fb3e2befSFlorian Hahnentry:
915fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
916fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
917fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
918fb3e2befSFlorian Hahn
919fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
920fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
921fb3e2befSFlorian Hahn  %t.4 = icmp ule i8 %start.add.2, %start.shl.4
922fb3e2befSFlorian Hahn  ret i1 %t.4
923fb3e2befSFlorian Hahn}
924fb3e2befSFlorian Hahn
925fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_6(i8 %start, i8 %high) {
926fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_6(
927fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
928fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
929fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
930fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
931fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
932fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
933fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]]
934fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_2]]
935fb3e2befSFlorian Hahn;
936fb3e2befSFlorian Hahnentry:
937fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
938fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
939fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
940fb3e2befSFlorian Hahn
941fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
942fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
943fb3e2befSFlorian Hahn  %f.2 = icmp ult i8 %start.add.2, %start.shl.4
944fb3e2befSFlorian Hahn  ret i1 %f.2
945fb3e2befSFlorian Hahn}
946fb3e2befSFlorian Hahn
947fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_7(i8 %start, i8 %high) {
948fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_7(
949fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
950fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
951fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
952fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
953fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
954fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
955fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
956fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1
957fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_SHL_4]]
958fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_3]]
959fb3e2befSFlorian Hahn;
960fb3e2befSFlorian Hahnentry:
961fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
962fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
963fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
964fb3e2befSFlorian Hahn
965fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
966fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
967fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
968fb3e2befSFlorian Hahn  %start.add.2.1 = add i8 %start.add.2, 1
969fb3e2befSFlorian Hahn  %f.3 = icmp ule i8 %start.add.2.1, %start.shl.4
970fb3e2befSFlorian Hahn  ret i1 %f.3
971fb3e2befSFlorian Hahn}
972fb3e2befSFlorian Hahn
973fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_8(i8 %start, i8 %high) {
974fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_8(
975fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
976fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
977fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
978fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
979fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
980fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
981fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
982fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1
983fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl i8 [[START]], 3
984fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_3]]
985fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
986fb3e2befSFlorian Hahn;
987fb3e2befSFlorian Hahnentry:
988fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
989fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
990fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
991fb3e2befSFlorian Hahn
992fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
993fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
994fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
995fb3e2befSFlorian Hahn  %start.add.2.1 = add i8 %start.add.2, 1
996fb3e2befSFlorian Hahn  %start.shl.3 = shl i8 %start, 3
997fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.1, %start.shl.3
998fb3e2befSFlorian Hahn  ret i1 %t.5
999fb3e2befSFlorian Hahn}
1000fb3e2befSFlorian Hahn
1001fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_9(i8 %start, i8 %high) {
1002fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_9(
1003fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1004fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4
1005fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1006fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1007fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
1008fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1009fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1010fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1
1011fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl i8 [[START]], 3
1012fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_3]]
1013fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_5]]
1014fb3e2befSFlorian Hahn;
1015fb3e2befSFlorian Hahnentry:
1016fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %start, 4
1017fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1018fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1019fb3e2befSFlorian Hahn
1020fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
1021fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1022fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1023fb3e2befSFlorian Hahn  %start.add.2.1 = add i8 %start.add.2, 1
1024fb3e2befSFlorian Hahn  %start.shl.3 = shl i8 %start, 3
1025fb3e2befSFlorian Hahn  %f.5 = icmp ult i8 %start.add.2, %start.shl.3
1026fb3e2befSFlorian Hahn  ret i1 %f.5
1027fb3e2befSFlorian Hahn}
1028fb3e2befSFlorian Hahn
1029fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_10(i8 %start, i8 %high) {
1030fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_10(
1031fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1032fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl i8 [[START:%.*]], 5
1033fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]]
1034fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
1035fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl i8 [[START]], 3
1036fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_SHL_3]], [[START_SHL_5]]
1037fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
1038fb3e2befSFlorian Hahn;
1039fb3e2befSFlorian Hahnentry:
1040fb3e2befSFlorian Hahn  %start.shl.5 = shl i8 %start, 5
1041fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.shl.5
1042fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
1043fb3e2befSFlorian Hahn
1044fb3e2befSFlorian Hahn  %start.shl.3 = shl i8 %start, 3
1045fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.shl.3, %start.shl.5
1046fb3e2befSFlorian Hahn  ret i1 %t.1
1047fb3e2befSFlorian Hahn}
1048fb3e2befSFlorian Hahn
1049fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_11(i8 %start, i8 %high) {
1050fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_11(
1051fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1052fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_5:%.*]] = shl i8 [[START:%.*]], 5
1053fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]]
1054fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
1055fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl i8 [[START]], 3
1056fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]]
1057fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
1058fb3e2befSFlorian Hahn;
1059fb3e2befSFlorian Hahnentry:
1060fb3e2befSFlorian Hahn  %start.shl.5 = shl i8 %start, 5
1061fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.shl.5
1062fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
1063fb3e2befSFlorian Hahn
1064fb3e2befSFlorian Hahn  %start.shl.3 = shl i8 %start, 3
1065fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.shl.5, %start.shl.3
1066fb3e2befSFlorian Hahn  ret i1 %c.1
1067fb3e2befSFlorian Hahn}
1068fb3e2befSFlorian Hahn
1069fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_1(i8 %start, i8 %high) {
1070fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_1(
1071fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1072fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1073fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4
1074fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1075fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1076fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
1077fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
1078fb3e2befSFlorian Hahn;
1079fb3e2befSFlorian Hahnentry:
1080fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1081fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %add, 4
1082fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1083fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1084fb3e2befSFlorian Hahn
1085fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
1086fb3e2befSFlorian Hahn  ret i1 %t.1
1087fb3e2befSFlorian Hahn}
1088fb3e2befSFlorian Hahn
1089fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_2(i8 %start, i8 %high) {
1090fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_2(
1091fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1092fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1093fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4
1094fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1095fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1096fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
1097fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]]
1098fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_2]]
1099fb3e2befSFlorian Hahn;
1100fb3e2befSFlorian Hahnentry:
1101fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1102fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %add, 4
1103fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1104fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1105fb3e2befSFlorian Hahn
1106fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
1107fb3e2befSFlorian Hahn  %t.2 = icmp ult i8 %start.shl.2, %high
1108fb3e2befSFlorian Hahn  ret i1 %t.2
1109fb3e2befSFlorian Hahn}
1110fb3e2befSFlorian Hahn
1111fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_3(i8 %start, i8 %high) {
1112fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_3(
1113fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1114fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1115fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4
1116fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1117fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1118fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1119fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1120fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]]
1121fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_3]]
1122fb3e2befSFlorian Hahn;
1123fb3e2befSFlorian Hahnentry:
1124fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1125fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %add, 4
1126fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1127fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1128fb3e2befSFlorian Hahn
1129fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1130fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1131fb3e2befSFlorian Hahn  %t.3 = icmp ule i8 %start.add.2, %start.shl.4
1132fb3e2befSFlorian Hahn  ret i1 %t.3
1133fb3e2befSFlorian Hahn}
1134fb3e2befSFlorian Hahn
1135fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_4(i8 %start, i8 %high) {
1136fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_4(
1137fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1138fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1139fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4
1140fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1141fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1142fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_2:%.*]] = shl i8 [[START]], 2
1143fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1144fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1145fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]]
1146fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
1147fb3e2befSFlorian Hahn;
1148fb3e2befSFlorian Hahnentry:
1149fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1150fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %add, 4
1151fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1152fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1153fb3e2befSFlorian Hahn
1154fb3e2befSFlorian Hahn  %start.shl.2 = shl i8 %start, 2
1155fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1156fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1157fb3e2befSFlorian Hahn  %t.4 = icmp ult i8 %start.add.2, %start.shl.4
1158fb3e2befSFlorian Hahn  ret i1 %t.4
1159fb3e2befSFlorian Hahn}
1160fb3e2befSFlorian Hahn
1161fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_5(i8 %start, i8 %high) {
1162fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_5(
1163fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1164fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1165fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4
1166fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1167fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1168fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1169fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1170fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_12:%.*]] = add i8 [[START_ADD_2]], 12
1171fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_SHL_4]]
1172fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
1173fb3e2befSFlorian Hahn;
1174fb3e2befSFlorian Hahnentry:
1175fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1176fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %add, 4
1177fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1178fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1179fb3e2befSFlorian Hahn
1180fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1181fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1182fb3e2befSFlorian Hahn  %start.add.2.12 = add i8 %start.add.2, 12
1183fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.2.12, %start.shl.4
1184fb3e2befSFlorian Hahn  ret i1 %t.5
1185fb3e2befSFlorian Hahn}
1186fb3e2befSFlorian Hahn
1187fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_6(i8 %start, i8 %high) {
1188fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_6(
1189fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1190fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1191fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4
1192fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]]
1193fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1194fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1195fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1196fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_13:%.*]] = add i8 [[START_ADD_2]], 13
1197fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_SHL_4]]
1198fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_1]]
1199fb3e2befSFlorian Hahn;
1200fb3e2befSFlorian Hahnentry:
1201fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1202fb3e2befSFlorian Hahn  %start.shl.4 = shl i8 %add, 4
1203fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.shl.4, %high
1204fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1205fb3e2befSFlorian Hahn
1206fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1207fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1208fb3e2befSFlorian Hahn  %start.add.2.13 = add i8 %start.add.2, 13
1209fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.add.2.13, %start.shl.4
1210fb3e2befSFlorian Hahn  ret i1 %f.1
1211fb3e2befSFlorian Hahn}
12127faa8c6eSZain Jaffal
12137faa8c6eSZain Jaffaldefine i1 @shl_overflow(i64 %start) {
12147faa8c6eSZain Jaffal; CHECK-LABEL: @shl_overflow(
12157faa8c6eSZain Jaffal; CHECK-NEXT:  entry:
12167faa8c6eSZain Jaffal; CHECK-NEXT:    [[PRE_COND:%.*]] = icmp ugt i64 [[START:%.*]], 0
12177faa8c6eSZain Jaffal; CHECK-NEXT:    br i1 [[PRE_COND]], label [[MAIN:%.*]], label [[EXIT:%.*]]
12187faa8c6eSZain Jaffal; CHECK:       main:
12197faa8c6eSZain Jaffal; CHECK-NEXT:    [[TMP0:%.*]] = shl nuw nsw i64 [[START]], -1
12207faa8c6eSZain Jaffal; CHECK-NEXT:    [[TMP1:%.*]] = icmp uge i64 [[TMP0]], [[START]]
12217faa8c6eSZain Jaffal; CHECK-NEXT:    ret i1 [[TMP1]]
12227faa8c6eSZain Jaffal; CHECK:       exit:
12237faa8c6eSZain Jaffal; CHECK-NEXT:    ret i1 false
12247faa8c6eSZain Jaffal;
12257faa8c6eSZain Jaffalentry:
12267faa8c6eSZain Jaffal  %pre.cond = icmp ugt i64 %start, 0
12277faa8c6eSZain Jaffal  br i1 %pre.cond, label %main, label %exit
12287faa8c6eSZain Jaffal
12297faa8c6eSZain Jaffalmain:
12307faa8c6eSZain Jaffal  %0 = shl nuw nsw i64 %start, -1
12317faa8c6eSZain Jaffal  %1 = icmp uge i64 %0, %start
12327faa8c6eSZain Jaffal  ret i1 %1
12337faa8c6eSZain Jaffal
12347faa8c6eSZain Jaffalexit:
12357faa8c6eSZain Jaffal  ret i1 0
12367faa8c6eSZain Jaffal}
12377faa8c6eSZain Jaffal
12387faa8c6eSZain Jaffal
12397faa8c6eSZain Jaffaldefine i1 @shl_overflow_2() {
12407faa8c6eSZain Jaffal; CHECK-LABEL: @shl_overflow_2(
12417faa8c6eSZain Jaffal; CHECK-NEXT:  entry:
12427faa8c6eSZain Jaffal; CHECK-NEXT:    [[SHL_UB:%.*]] = shl nuw nsw i256 0, 64
12437faa8c6eSZain Jaffal; CHECK-NEXT:    [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 0
12447faa8c6eSZain Jaffal; CHECK-NEXT:    ret i1 [[SHL_CMP]]
12457faa8c6eSZain Jaffal;
12467faa8c6eSZain Jaffalentry:
12477faa8c6eSZain Jaffal  %shl.ub = shl nuw nsw i256 0, 64
12487faa8c6eSZain Jaffal  %shl.cmp = icmp uge i256 %shl.ub, 0
12497faa8c6eSZain Jaffal  ret i1 %shl.cmp
12507faa8c6eSZain Jaffal}
12517faa8c6eSZain Jaffal
12527faa8c6eSZain Jaffaldefine i1 @shl_overflow_3() {
12537faa8c6eSZain Jaffal; CHECK-LABEL: @shl_overflow_3(
12547faa8c6eSZain Jaffal; CHECK-NEXT:  entry:
12557faa8c6eSZain Jaffal; CHECK-NEXT:    [[SHL_UB:%.*]] = shl nuw nsw i256 0, 65
12567faa8c6eSZain Jaffal; CHECK-NEXT:    [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 0
12577faa8c6eSZain Jaffal; CHECK-NEXT:    ret i1 [[SHL_CMP]]
12587faa8c6eSZain Jaffal;
12597faa8c6eSZain Jaffalentry:
12607faa8c6eSZain Jaffal  %shl.ub = shl nuw nsw i256 0, 65
12617faa8c6eSZain Jaffal  %shl.cmp = icmp uge i256 %shl.ub, 0
12627faa8c6eSZain Jaffal  ret i1 %shl.cmp
12637faa8c6eSZain Jaffal}
12642cf632a3SVitaly Buka
12652cf632a3SVitaly Bukadefine i1 @shl_55() {
12662cf632a3SVitaly Buka; CHECK-LABEL: @shl_55(
12672cf632a3SVitaly Buka; CHECK-NEXT:  entry:
12682cf632a3SVitaly Buka; CHECK-NEXT:    [[SHL_UB:%.*]] = shl nuw nsw i256 1, 55
12691d43096eSNikita Popov; CHECK-NEXT:    [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 1
12701d43096eSNikita Popov; CHECK-NEXT:    ret i1 [[SHL_CMP]]
12712cf632a3SVitaly Buka;
12722cf632a3SVitaly Bukaentry:
12732cf632a3SVitaly Buka  %shl.ub = shl nuw nsw i256 1, 55
12742cf632a3SVitaly Buka  %shl.cmp = icmp uge i256 %shl.ub, 1
12752cf632a3SVitaly Buka  ret i1 %shl.cmp
12762cf632a3SVitaly Buka}
1277db34a947SNikita Popov
1278db34a947SNikita Popovdefine i1 @shl_nsw_x8_slt_x7(i8 %start, i8 %high) {
1279db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_x8_slt_x7(
1280db34a947SNikita Popov; CHECK-NEXT:    [[C_0:%.*]] = icmp sge i8 [[HIGH:%.*]], 0
1281db34a947SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
1282db34a947SNikita Popov; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nsw i8 [[START:%.*]], 3
1283db34a947SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i8 [[START_SHL_3]], [[HIGH]]
1284db34a947SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1285db34a947SNikita Popov; CHECK-NEXT:    [[START_MUL_7:%.*]] = mul nsw i8 [[START]], 7
1286*71f56e49SNikita Popov; CHECK-NEXT:    ret i1 true
1287db34a947SNikita Popov;
1288db34a947SNikita Popov  %c.0 = icmp sge i8 %high, 0
1289db34a947SNikita Popov  call void @llvm.assume(i1 %c.0)
1290db34a947SNikita Popov
1291db34a947SNikita Popov  %start.shl.3 = shl nsw i8 %start, 3
1292db34a947SNikita Popov  %c.1 = icmp slt i8 %start.shl.3, %high
1293db34a947SNikita Popov  call void @llvm.assume(i1 %c.1)
1294db34a947SNikita Popov
1295db34a947SNikita Popov  %start.mul.7 = mul nsw i8 %start, 7
1296db34a947SNikita Popov  %t.1 = icmp slt i8 %start.mul.7, %high
1297db34a947SNikita Popov  ret i1 %t.1
1298db34a947SNikita Popov}
1299db34a947SNikita Popov
1300db34a947SNikita Popovdefine i1 @shl_nsw_x8_not_slt_x9(i8 %start, i8 %high) {
1301db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_x8_not_slt_x9(
1302db34a947SNikita Popov; CHECK-NEXT:    [[C_0:%.*]] = icmp sge i8 [[HIGH:%.*]], 0
1303db34a947SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
1304db34a947SNikita Popov; CHECK-NEXT:    [[START_SHL_3:%.*]] = shl nsw i8 [[START:%.*]], 3
1305db34a947SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i8 [[START_SHL_3]], [[HIGH]]
1306db34a947SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1307db34a947SNikita Popov; CHECK-NEXT:    [[START_MUL_9:%.*]] = mul nsw i8 [[START]], 9
1308db34a947SNikita Popov; CHECK-NEXT:    [[T_1:%.*]] = icmp slt i8 [[START_MUL_9]], [[HIGH]]
1309db34a947SNikita Popov; CHECK-NEXT:    ret i1 [[T_1]]
1310db34a947SNikita Popov;
1311db34a947SNikita Popov  %c.0 = icmp sge i8 %high, 0
1312db34a947SNikita Popov  call void @llvm.assume(i1 %c.0)
1313db34a947SNikita Popov
1314db34a947SNikita Popov  %start.shl.3 = shl nsw i8 %start, 3
1315db34a947SNikita Popov  %c.1 = icmp slt i8 %start.shl.3, %high
1316db34a947SNikita Popov  call void @llvm.assume(i1 %c.1)
1317db34a947SNikita Popov
1318db34a947SNikita Popov  %start.mul.9 = mul nsw i8 %start, 9
1319db34a947SNikita Popov  %t.1 = icmp slt i8 %start.mul.9, %high
1320db34a947SNikita Popov  ret i1 %t.1
1321db34a947SNikita Popov}
1322db34a947SNikita Popov
1323db34a947SNikita Popovdefine i1 @shl_nsw_sign_implication(i8 %x) {
1324db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_sign_implication(
1325db34a947SNikita Popov; CHECK-NEXT:    [[SHL:%.*]] = shl nsw i8 [[X:%.*]], 2
1326db34a947SNikita Popov; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 [[X]], 0
1327db34a947SNikita Popov; CHECK-NEXT:    br i1 [[CMP1]], label [[IF:%.*]], label [[ELSE:%.*]]
1328db34a947SNikita Popov; CHECK:       if:
1329*71f56e49SNikita Popov; CHECK-NEXT:    ret i1 true
1330db34a947SNikita Popov; CHECK:       else:
1331*71f56e49SNikita Popov; CHECK-NEXT:    ret i1 true
1332db34a947SNikita Popov;
1333db34a947SNikita Popov  %shl = shl nsw i8 %x, 2
1334db34a947SNikita Popov  %cmp1 = icmp slt i8 %x, 0
1335db34a947SNikita Popov  br i1 %cmp1, label %if, label %else
1336db34a947SNikita Popov
1337db34a947SNikita Popovif:
1338db34a947SNikita Popov  %cmp2 = icmp slt i8 %shl, 0
1339db34a947SNikita Popov  ret i1 %cmp2
1340db34a947SNikita Popov
1341db34a947SNikita Popovelse:
1342db34a947SNikita Popov  %cmp3 = icmp sge i8 %shl, 0
1343db34a947SNikita Popov  ret i1 %cmp3
1344db34a947SNikita Popov}
1345db34a947SNikita Popov
1346db34a947SNikita Popovdefine i1 @shl_nsw_by_bw_minus_1(i64 %x) {
1347db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_by_bw_minus_1(
1348db34a947SNikita Popov; CHECK-NEXT:    [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 63
1349db34a947SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0
1350db34a947SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1351db34a947SNikita Popov; CHECK-NEXT:    [[T_1:%.*]] = icmp slt i64 [[X]], 0
1352db34a947SNikita Popov; CHECK-NEXT:    ret i1 [[T_1]]
1353db34a947SNikita Popov;
1354db34a947SNikita Popov  %x.shl = shl nsw i64 %x, 63
1355db34a947SNikita Popov  %c.1 = icmp slt i64 %x.shl, 0
1356db34a947SNikita Popov  call void @llvm.assume(i1 %c.1)
1357db34a947SNikita Popov
1358db34a947SNikita Popov  %t.1 = icmp slt i64 %x, 0
1359db34a947SNikita Popov  ret i1 %t.1
1360db34a947SNikita Popov}
1361*71f56e49SNikita Popov
1362*71f56e49SNikita Popov; Shift returns poison in this case, just make sure we don't crash.
1363*71f56e49SNikita Popovdefine i1 @shl_nsw_by_bw(i64 %x) {
1364*71f56e49SNikita Popov; CHECK-LABEL: @shl_nsw_by_bw(
1365*71f56e49SNikita Popov; CHECK-NEXT:    [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 64
1366*71f56e49SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0
1367*71f56e49SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1368*71f56e49SNikita Popov; CHECK-NEXT:    [[T_1:%.*]] = icmp slt i64 [[X]], 0
1369*71f56e49SNikita Popov; CHECK-NEXT:    ret i1 [[T_1]]
1370*71f56e49SNikita Popov;
1371*71f56e49SNikita Popov  %x.shl = shl nsw i64 %x, 64
1372*71f56e49SNikita Popov  %c.1 = icmp slt i64 %x.shl, 0
1373*71f56e49SNikita Popov  call void @llvm.assume(i1 %c.1)
1374*71f56e49SNikita Popov
1375*71f56e49SNikita Popov  %t.1 = icmp slt i64 %x, 0
1376*71f56e49SNikita Popov  ret i1 %t.1
1377*71f56e49SNikita Popov}
1378*71f56e49SNikita Popov
1379*71f56e49SNikita Popov; Shift returns poison in this case, just make sure we don't crash.
1380*71f56e49SNikita Popovdefine i1 @shl_nsw_by_bw_plus_1(i64 %x) {
1381*71f56e49SNikita Popov; CHECK-LABEL: @shl_nsw_by_bw_plus_1(
1382*71f56e49SNikita Popov; CHECK-NEXT:    [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 65
1383*71f56e49SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0
1384*71f56e49SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1385*71f56e49SNikita Popov; CHECK-NEXT:    [[T_1:%.*]] = icmp slt i64 [[X]], 0
1386*71f56e49SNikita Popov; CHECK-NEXT:    ret i1 [[T_1]]
1387*71f56e49SNikita Popov;
1388*71f56e49SNikita Popov  %x.shl = shl nsw i64 %x, 65
1389*71f56e49SNikita Popov  %c.1 = icmp slt i64 %x.shl, 0
1390*71f56e49SNikita Popov  call void @llvm.assume(i1 %c.1)
1391*71f56e49SNikita Popov
1392*71f56e49SNikita Popov  %t.1 = icmp slt i64 %x, 0
1393*71f56e49SNikita Popov  ret i1 %t.1
1394*71f56e49SNikita Popov}
1395