xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/mul.ll (revision fbcf8a8cbb2461730bfd0603b396842925a88ef2)
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_mul_const_nuw_unsigned_1(i8 %start, i8 %high) {
7fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_1(
8fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
9fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
10fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
11fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
12*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
13fb3e2befSFlorian Hahn;
14fb3e2befSFlorian Hahnentry:
15fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
16fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.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_mul_const_nuw_unsigned_2(i8 %start, i8 %high) {
24fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_2(
25fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
26fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
27fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
28fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
29fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
30*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
31fb3e2befSFlorian Hahn;
32fb3e2befSFlorian Hahnentry:
33fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
34fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
35fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
36fb3e2befSFlorian Hahn
37fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
38fb3e2befSFlorian Hahn  %t = icmp ult i8 %start.mul.2, %high
39fb3e2befSFlorian Hahn  ret i1 %t
40fb3e2befSFlorian Hahn}
41fb3e2befSFlorian Hahn
42fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_3(i8 %start, i8 %high) {
43fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_3(
44fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
45fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
46fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
47fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
48fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
49fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
507c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
51fb3e2befSFlorian Hahn;
52fb3e2befSFlorian Hahnentry:
53fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
54fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
55fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
56fb3e2befSFlorian Hahn
57fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
58fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
59fb3e2befSFlorian Hahn  %t = icmp ule i8 %start.add.1, %start.mul.2
60fb3e2befSFlorian Hahn  ret i1 %t
61fb3e2befSFlorian Hahn}
62fb3e2befSFlorian Hahn
63fb3e2befSFlorian Hahn
64fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_4(i8 %start, i8 %high) {
65fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_4(
66fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
67fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
68fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
69fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
70fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
71fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
727c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
73fb3e2befSFlorian Hahn;
74fb3e2befSFlorian Hahnentry:
75fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
76fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
77fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
78fb3e2befSFlorian Hahn
79fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
80fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
81fb3e2befSFlorian Hahn  %f = icmp ult i8 %start.add.1, %start.mul.2
82fb3e2befSFlorian Hahn  ret i1 %f
83fb3e2befSFlorian Hahn}
84fb3e2befSFlorian Hahn
85fb3e2befSFlorian Hahn
86fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_5(i8 %start, i8 %high) {
87fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_5(
88fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
89fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
90fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_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]]
947c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
95fb3e2befSFlorian Hahn;
96fb3e2befSFlorian Hahnentry:
97fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
98fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.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.mul.4
104fb3e2befSFlorian Hahn  ret i1 %t.4
105fb3e2befSFlorian Hahn}
106fb3e2befSFlorian Hahn
107fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_6(i8 %start, i8 %high) {
108fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_6(
109fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
110fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
111fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_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]]
1157c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
116fb3e2befSFlorian Hahn;
117fb3e2befSFlorian Hahnentry:
118fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
119fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
120fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
121fb3e2befSFlorian Hahn
122fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
123fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
124fb3e2befSFlorian Hahn  %f.2 = icmp ult i8 %start.add.2, %start.mul.4
125fb3e2befSFlorian Hahn  ret i1 %f.2
126fb3e2befSFlorian Hahn}
127fb3e2befSFlorian Hahn
128fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_7(i8 %start, i8 %high) {
129fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_7(
130fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
131fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
132fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
133fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
134fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
135fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
136fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
137fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
1387c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
139fb3e2befSFlorian Hahn;
140fb3e2befSFlorian Hahnentry:
141fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
142fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
143fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
144fb3e2befSFlorian Hahn
145fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
146fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
147fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
148fb3e2befSFlorian Hahn  %start.add.2.1 = add nuw i8 %start.add.2, 1
149fb3e2befSFlorian Hahn  %f.3 = icmp ule i8 %start.add.2.1, %start.mul.4
150fb3e2befSFlorian Hahn  ret i1 %f.3
151fb3e2befSFlorian Hahn}
152fb3e2befSFlorian Hahn
153fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_8(i8 %start, i8 %high) {
154fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_8(
155fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
156fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
157fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
158fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
159fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
160fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
161fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
162fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
163fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
164*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
165fb3e2befSFlorian Hahn;
166fb3e2befSFlorian Hahnentry:
167fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
168fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
169fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
170fb3e2befSFlorian Hahn
171fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
172fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
173fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
174fb3e2befSFlorian Hahn  %start.add.2.1 = add nuw i8 %start.add.2, 1
175fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, 3
176fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.1, %start.mul.3
177fb3e2befSFlorian Hahn  ret i1 %t.5
178fb3e2befSFlorian Hahn}
179fb3e2befSFlorian Hahn
180fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_9(i8 %start, i8 %high) {
181fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_9(
182fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
183fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
184fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
185fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
186fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
187fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
188fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
189fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
190fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
191*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 false
192fb3e2befSFlorian Hahn;
193fb3e2befSFlorian Hahnentry:
194fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %start, 4
195fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
196fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
197fb3e2befSFlorian Hahn
198fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
199fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
200fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
201fb3e2befSFlorian Hahn  %start.add.2.1 = add nuw i8 %start.add.2, 1
202fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, 3
203fb3e2befSFlorian Hahn  %f.5 = icmp ult i8 %start.add.2, %start.mul.3
204fb3e2befSFlorian Hahn  ret i1 %f.5
205fb3e2befSFlorian Hahn}
206fb3e2befSFlorian Hahn
207fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_10(i8 %start, i8 %high) {
208fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_10(
209fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
210fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], 5
211fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
212fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
213fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
2147c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
215fb3e2befSFlorian Hahn;
216fb3e2befSFlorian Hahnentry:
217fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw i8 %start, 5
218fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
219fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
220fb3e2befSFlorian Hahn
221fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, 3
222fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
223fb3e2befSFlorian Hahn  ret i1 %t.1
224fb3e2befSFlorian Hahn}
225fb3e2befSFlorian Hahn
226fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_11(i8 %start, i8 %high) {
227fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_11(
228fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
229fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], 5
230fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
231fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
232fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
2337c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
234fb3e2befSFlorian Hahn;
235fb3e2befSFlorian Hahnentry:
236fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw i8 %start, 5
237fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
238fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
239fb3e2befSFlorian Hahn
240fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, 3
241fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.mul.5, %start.mul.3
242fb3e2befSFlorian Hahn  ret i1 %c.1
243fb3e2befSFlorian Hahn}
244fb3e2befSFlorian Hahn
245fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_12(i8 %start) {
246fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_12(
247fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
248fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START:%.*]], 3
249fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]]
250fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
251fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw i8 [[START]], 5
2527c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
253fb3e2befSFlorian Hahn;
254fb3e2befSFlorian Hahnentry:
255fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, 3
256fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start, %start.mul.3
257fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
258fb3e2befSFlorian Hahn
259fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw i8 %start, 5
260fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
261fb3e2befSFlorian Hahn  ret i1 %t.1
262fb3e2befSFlorian Hahn}
263fb3e2befSFlorian Hahn
264fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_13(i8 %start) {
265fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_13(
266fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
267fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START:%.*]], 3
268fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]]
269fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
270fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw i8 [[START]], 5
2717c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
272fb3e2befSFlorian Hahn;
273fb3e2befSFlorian Hahnentry:
274fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, 3
275fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start, %start.mul.3
276fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
277fb3e2befSFlorian Hahn
278fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw i8 %start, 5
279fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.mul.5, %start.mul.3
280fb3e2befSFlorian Hahn  ret i1 %f.1
281fb3e2befSFlorian Hahn}
282fb3e2befSFlorian Hahn
283fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_14(i8 %start) {
284fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_14(
285fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
286fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], -5
287fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
288fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
289fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START]], -3
290fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
291fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
292fb3e2befSFlorian Hahn;
293fb3e2befSFlorian Hahnentry:
294fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw i8 %start, -5
295fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
296fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
297fb3e2befSFlorian Hahn
298fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, -3
299fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
300fb3e2befSFlorian Hahn  ret i1 %t.1
301fb3e2befSFlorian Hahn}
302fb3e2befSFlorian Hahn
303fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_15(i8 %start) {
304fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_15(
305fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
306fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], -5
307fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
308fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
309fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw i8 [[START]], -3
310fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
311fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
312fb3e2befSFlorian Hahn;
313fb3e2befSFlorian Hahnentry:
314fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw i8 %start, -5
315fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
316fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
317fb3e2befSFlorian Hahn
318fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw i8 %start, -3
319fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.mul.5, %start.mul.3
320fb3e2befSFlorian Hahn  ret i1 %c.1
321fb3e2befSFlorian Hahn}
322fb3e2befSFlorian Hahn
323fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_nsw_unsigned_16(i8 %start) {
324fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_nsw_unsigned_16(
325fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
326fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw nsw i8 [[START:%.*]], -5
327fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
328fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
329fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw nsw i8 [[START]], -3
330fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
331fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
332fb3e2befSFlorian Hahn;
333fb3e2befSFlorian Hahnentry:
334fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw nsw i8 %start, -5
335fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
336fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
337fb3e2befSFlorian Hahn
338fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw nsw i8 %start, -3
339fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
340fb3e2befSFlorian Hahn  ret i1 %t.1
341fb3e2befSFlorian Hahn}
342fb3e2befSFlorian Hahn
343fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_nsw_unsigned_17(i8 %start) {
344fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_nsw_unsigned_17(
345fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
346fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nuw nsw i8 [[START:%.*]], -5
347fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
348fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
349fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nuw nsw i8 [[START]], -3
350fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
351fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
352fb3e2befSFlorian Hahn;
353fb3e2befSFlorian Hahnentry:
354fb3e2befSFlorian Hahn  %start.mul.5 = mul nuw nsw i8 %start, -5
355fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
356fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
357fb3e2befSFlorian Hahn
358fb3e2befSFlorian Hahn  %start.mul.3 = mul nuw nsw i8 %start, -3
359fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.mul.5, %start.mul.3
360fb3e2befSFlorian Hahn  ret i1 %c.1
361fb3e2befSFlorian Hahn}
362fb3e2befSFlorian Hahn
363fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_1(i8 %start, i8 %high) {
364fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_1(
365fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
366fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
367fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
368fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
369fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
370*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
371fb3e2befSFlorian Hahn;
372fb3e2befSFlorian Hahnentry:
373fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
374fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %add, 4
375fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
376fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
377fb3e2befSFlorian Hahn
378fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
379fb3e2befSFlorian Hahn  ret i1 %t.1
380fb3e2befSFlorian Hahn}
381fb3e2befSFlorian Hahn
382fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_2(i8 %start, i8 %high) {
383fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_2(
384fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
385fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
386fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
387fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
388fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
389fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
390*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
391fb3e2befSFlorian Hahn;
392fb3e2befSFlorian Hahnentry:
393fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
394fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %add, 4
395fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
396fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
397fb3e2befSFlorian Hahn
398fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
399fb3e2befSFlorian Hahn  %t.2 = icmp ult i8 %start.mul.2, %high
400fb3e2befSFlorian Hahn  ret i1 %t.2
401fb3e2befSFlorian Hahn}
402fb3e2befSFlorian Hahn
403fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_3(i8 %start, i8 %high) {
404fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_3(
405fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
406fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
407fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
408fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
409fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
410fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
411fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
4127c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
413fb3e2befSFlorian Hahn;
414fb3e2befSFlorian Hahnentry:
415fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
416fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %add, 4
417fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
418fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
419fb3e2befSFlorian Hahn
420fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
421fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
422fb3e2befSFlorian Hahn  %t.3 = icmp ule i8 %start.add.2, %start.mul.4
423fb3e2befSFlorian Hahn  ret i1 %t.3
424fb3e2befSFlorian Hahn}
425fb3e2befSFlorian Hahn
426fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_4(i8 %start, i8 %high) {
427fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_4(
428fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
429fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
430fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
431fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
432fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
433fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
434fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
435fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
4367c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
437fb3e2befSFlorian Hahn;
438fb3e2befSFlorian Hahnentry:
439fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
440fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %add, 4
441fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
442fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
443fb3e2befSFlorian Hahn
444fb3e2befSFlorian Hahn  %start.mul.2 = mul nuw i8 %start, 2
445fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
446fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
447fb3e2befSFlorian Hahn  %t.4 = icmp ult i8 %start.add.2, %start.mul.4
448fb3e2befSFlorian Hahn  ret i1 %t.4
449fb3e2befSFlorian Hahn}
450fb3e2befSFlorian Hahn
451fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_5(i8 %start, i8 %high) {
452fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_5(
453fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
454fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
455fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
456fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
457fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
458fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
459fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
460fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_12:%.*]] = add nuw i8 [[START_ADD_2]], 12
4617c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 true
462fb3e2befSFlorian Hahn;
463fb3e2befSFlorian Hahnentry:
464fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
465fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %add, 4
466fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
467fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
468fb3e2befSFlorian Hahn
469fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
470fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
471fb3e2befSFlorian Hahn  %start.add.2.12 = add nuw i8 %start.add.2, 12
472fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.2.12, %start.mul.4
473fb3e2befSFlorian Hahn  ret i1 %t.5
474fb3e2befSFlorian Hahn}
475fb3e2befSFlorian Hahn
476fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_6(i8 %start, i8 %high) {
477fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_6(
478fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
479fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3
480fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
481fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
482fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
483fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]]
484fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
485fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_13:%.*]] = add nuw i8 [[START_ADD_2]], 13
4867c1b80e3SFlorian Hahn; CHECK-NEXT:    ret i1 false
487fb3e2befSFlorian Hahn;
488fb3e2befSFlorian Hahnentry:
489fb3e2befSFlorian Hahn  %add = add nuw i8 %start, 3
490fb3e2befSFlorian Hahn  %start.mul.4 = mul nuw i8 %add, 4
491fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
492fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
493fb3e2befSFlorian Hahn
494fb3e2befSFlorian Hahn  %start.add.1 = add nuw i8 %start, %start
495fb3e2befSFlorian Hahn  %start.add.2 = add nuw i8 %start.add.1, %start.add.1
496fb3e2befSFlorian Hahn  %start.add.2.13 = add nuw i8 %start.add.2, 13
497fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.add.2.13, %start.mul.4
498fb3e2befSFlorian Hahn  ret i1 %f.1
499fb3e2befSFlorian Hahn}
500fb3e2befSFlorian Hahn
501fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_1(i8 %start, i8 %high) {
502fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_1(
503fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
504fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
505fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
506fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
507fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
508fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
509fb3e2befSFlorian Hahn;
510fb3e2befSFlorian Hahnentry:
511fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
512fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
513fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
514fb3e2befSFlorian Hahn
515fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
516fb3e2befSFlorian Hahn  ret i1 %t.1
517fb3e2befSFlorian Hahn}
518fb3e2befSFlorian Hahn
519fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_2(i8 %start, i8 %high) {
520fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_2(
521fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
522fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
523fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
524fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
525fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
526fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]]
527fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
528fb3e2befSFlorian Hahn;
529fb3e2befSFlorian Hahnentry:
530fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
531fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
532fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
533fb3e2befSFlorian Hahn
534fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
535fb3e2befSFlorian Hahn  %t = icmp ult i8 %start.mul.2, %high
536fb3e2befSFlorian Hahn  ret i1 %t
537fb3e2befSFlorian Hahn}
538fb3e2befSFlorian Hahn
539fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_3(i8 %start, i8 %high) {
540fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_3(
541fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
542fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
543fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
544fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
545fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
546fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
547fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_2]]
548fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
549fb3e2befSFlorian Hahn;
550fb3e2befSFlorian Hahnentry:
551fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
552fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
553fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
554fb3e2befSFlorian Hahn
555fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
556fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
557fb3e2befSFlorian Hahn  %t = icmp ule i8 %start.add.1, %start.mul.2
558fb3e2befSFlorian Hahn  ret i1 %t
559fb3e2befSFlorian Hahn}
560fb3e2befSFlorian Hahn
561fb3e2befSFlorian Hahn
562fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_4(i8 %start, i8 %high) {
563fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_4(
564fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
565fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
566fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
567fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
568fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
569fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
570fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_MUL_2]]
571fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
572fb3e2befSFlorian Hahn;
573fb3e2befSFlorian Hahnentry:
574fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
575fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
576fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
577fb3e2befSFlorian Hahn
578fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
579fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
580fb3e2befSFlorian Hahn  %f = icmp ult i8 %start.add.1, %start.mul.2
581fb3e2befSFlorian Hahn  ret i1 %f
582fb3e2befSFlorian Hahn}
583fb3e2befSFlorian Hahn
584fb3e2befSFlorian Hahn
585fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_5(i8 %start, i8 %high) {
586fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_5(
587fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
588fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
589fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
590fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
591fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
592fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
593fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]]
594fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
595fb3e2befSFlorian Hahn;
596fb3e2befSFlorian Hahnentry:
597fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
598fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
599fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
600fb3e2befSFlorian Hahn
601fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
602fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
603fb3e2befSFlorian Hahn  %t.4 = icmp ule i8 %start.add.2, %start.mul.4
604fb3e2befSFlorian Hahn  ret i1 %t.4
605fb3e2befSFlorian Hahn}
606fb3e2befSFlorian Hahn
607fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_6(i8 %start, i8 %high) {
608fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_6(
609fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
610fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
611fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
612fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
613fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
614fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
615fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]]
616fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_2]]
617fb3e2befSFlorian Hahn;
618fb3e2befSFlorian Hahnentry:
619fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
620fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
621fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
622fb3e2befSFlorian Hahn
623fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
624fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
625fb3e2befSFlorian Hahn  %f.2 = icmp ult i8 %start.add.2, %start.mul.4
626fb3e2befSFlorian Hahn  ret i1 %f.2
627fb3e2befSFlorian Hahn}
628fb3e2befSFlorian Hahn
629fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_7(i8 %start, i8 %high) {
630fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_7(
631fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
632fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
633fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
634fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
635fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
636fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
637fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
638fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1
639fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_MUL_4]]
640fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_3]]
641fb3e2befSFlorian Hahn;
642fb3e2befSFlorian Hahnentry:
643fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
644fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
645fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
646fb3e2befSFlorian Hahn
647fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
648fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
649fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
650fb3e2befSFlorian Hahn  %start.add.2.1 = add nsw i8 %start.add.2, 1
651fb3e2befSFlorian Hahn  %f.3 = icmp ule i8 %start.add.2.1, %start.mul.4
652fb3e2befSFlorian Hahn  ret i1 %f.3
653fb3e2befSFlorian Hahn}
654fb3e2befSFlorian Hahn
655fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_8(i8 %start, i8 %high) {
656fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_8(
657fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
658fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
659fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
660fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
661fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
662fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
663fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
664fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1
665fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3
666fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_3]]
667fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
668fb3e2befSFlorian Hahn;
669fb3e2befSFlorian Hahnentry:
670fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
671fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
672fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
673fb3e2befSFlorian Hahn
674fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
675fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
676fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
677fb3e2befSFlorian Hahn  %start.add.2.1 = add nsw i8 %start.add.2, 1
678fb3e2befSFlorian Hahn  %start.mul.3 = mul nsw i8 %start, 3
679fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.1, %start.mul.3
680fb3e2befSFlorian Hahn  ret i1 %t.5
681fb3e2befSFlorian Hahn}
682fb3e2befSFlorian Hahn
683fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_9(i8 %start, i8 %high) {
684fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_9(
685fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
686fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4
687fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
688fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
689fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
690fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
691fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
692fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1
693fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3
694fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_3]]
695fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_5]]
696fb3e2befSFlorian Hahn;
697fb3e2befSFlorian Hahnentry:
698fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %start, 4
699fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
700fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
701fb3e2befSFlorian Hahn
702fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
703fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
704fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
705fb3e2befSFlorian Hahn  %start.add.2.1 = add nsw i8 %start.add.2, 1
706fb3e2befSFlorian Hahn  %start.mul.3 = mul nsw i8 %start, 3
707fb3e2befSFlorian Hahn  %f.5 = icmp ult i8 %start.add.2, %start.mul.3
708fb3e2befSFlorian Hahn  ret i1 %f.5
709fb3e2befSFlorian Hahn}
710fb3e2befSFlorian Hahn
711fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_10(i8 %start, i8 %high) {
712fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_10(
713fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
714fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], 5
715fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
716fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
717fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3
718fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
719fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
720fb3e2befSFlorian Hahn;
721fb3e2befSFlorian Hahnentry:
722fb3e2befSFlorian Hahn  %start.mul.5 = mul nsw i8 %start, 5
723fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
724fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
725fb3e2befSFlorian Hahn
726fb3e2befSFlorian Hahn  %start.mul.3 = mul nsw i8 %start, 3
727fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
728fb3e2befSFlorian Hahn  ret i1 %t.1
729fb3e2befSFlorian Hahn}
730fb3e2befSFlorian Hahn
731fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_11(i8 %start, i8 %high) {
732fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_11(
733fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
734fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], 5
735fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
736fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
737fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3
738fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
739fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
740fb3e2befSFlorian Hahn;
741fb3e2befSFlorian Hahnentry:
742fb3e2befSFlorian Hahn  %start.mul.5 = mul nsw i8 %start, 5
743fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
744fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
745fb3e2befSFlorian Hahn
746fb3e2befSFlorian Hahn  %start.mul.3 = mul nsw i8 %start, 3
747fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.mul.5, %start.mul.3
748fb3e2befSFlorian Hahn  ret i1 %c.1
749fb3e2befSFlorian Hahn}
750fb3e2befSFlorian Hahn
751fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_12(i8 %start) {
752fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_12(
753fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
754fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], -5
755fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
756fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
757fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nsw i8 [[START]], -3
758fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
759fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
760fb3e2befSFlorian Hahn;
761fb3e2befSFlorian Hahnentry:
762fb3e2befSFlorian Hahn  %start.mul.5 = mul nsw i8 %start, -5
763fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
764fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
765fb3e2befSFlorian Hahn
766fb3e2befSFlorian Hahn  %start.mul.3 = mul nsw i8 %start, -3
767fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
768fb3e2befSFlorian Hahn  ret i1 %t.1
769fb3e2befSFlorian Hahn}
770fb3e2befSFlorian Hahn
771fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_13(i8 %start) {
772fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_13(
773fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
774fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], -5
775fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
776fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
777fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul nsw i8 [[START]], -3
778fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
779fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
780fb3e2befSFlorian Hahn;
781fb3e2befSFlorian Hahnentry:
782fb3e2befSFlorian Hahn  %start.mul.5 = mul nsw i8 %start, -5
783fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
784fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
785fb3e2befSFlorian Hahn
786fb3e2befSFlorian Hahn  %start.mul.3 = mul nsw i8 %start, -3
787fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.mul.5, %start.mul.3
788fb3e2befSFlorian Hahn  ret i1 %c.1
789fb3e2befSFlorian Hahn}
790fb3e2befSFlorian Hahn
791fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_1(i8 %start, i8 %high) {
792fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_1(
793fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
794fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
795fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4
796fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
797fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
798fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
799fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
800fb3e2befSFlorian Hahn;
801fb3e2befSFlorian Hahnentry:
802fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
803fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %add, 4
804fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
805fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
806fb3e2befSFlorian Hahn
807fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
808fb3e2befSFlorian Hahn  ret i1 %t.1
809fb3e2befSFlorian Hahn}
810fb3e2befSFlorian Hahn
811fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_2(i8 %start, i8 %high) {
812fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_2(
813fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
814fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
815fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4
816fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
817fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
818fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
819fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]]
820fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_2]]
821fb3e2befSFlorian Hahn;
822fb3e2befSFlorian Hahnentry:
823fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
824fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %add, 4
825fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
826fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
827fb3e2befSFlorian Hahn
828fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
829fb3e2befSFlorian Hahn  %t.2 = icmp ult i8 %start.mul.2, %high
830fb3e2befSFlorian Hahn  ret i1 %t.2
831fb3e2befSFlorian Hahn}
832fb3e2befSFlorian Hahn
833fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_3(i8 %start, i8 %high) {
834fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_3(
835fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
836fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
837fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4
838fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
839fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
840fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
841fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
842fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]]
843fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_3]]
844fb3e2befSFlorian Hahn;
845fb3e2befSFlorian Hahnentry:
846fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
847fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %add, 4
848fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
849fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
850fb3e2befSFlorian Hahn
851fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
852fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
853fb3e2befSFlorian Hahn  %t.3 = icmp ule i8 %start.add.2, %start.mul.4
854fb3e2befSFlorian Hahn  ret i1 %t.3
855fb3e2befSFlorian Hahn}
856fb3e2befSFlorian Hahn
857fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_4(i8 %start, i8 %high) {
858fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_4(
859fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
860fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
861fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4
862fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
863fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
864fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2
865fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
866fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
867fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]]
868fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
869fb3e2befSFlorian Hahn;
870fb3e2befSFlorian Hahnentry:
871fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
872fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %add, 4
873fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
874fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
875fb3e2befSFlorian Hahn
876fb3e2befSFlorian Hahn  %start.mul.2 = mul nsw i8 %start, 2
877fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
878fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
879fb3e2befSFlorian Hahn  %t.4 = icmp ult i8 %start.add.2, %start.mul.4
880fb3e2befSFlorian Hahn  ret i1 %t.4
881fb3e2befSFlorian Hahn}
882fb3e2befSFlorian Hahn
883fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_5(i8 %start, i8 %high) {
884fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_5(
885fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
886fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
887fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4
888fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
889fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
890fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
891fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
892fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_12:%.*]] = add nsw i8 [[START_ADD_2]], 12
893fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_MUL_4]]
894fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
895fb3e2befSFlorian Hahn;
896fb3e2befSFlorian Hahnentry:
897fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
898fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %add, 4
899fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
900fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
901fb3e2befSFlorian Hahn
902fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
903fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
904fb3e2befSFlorian Hahn  %start.add.2.12 = add nsw i8 %start.add.2, 12
905fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.2.12, %start.mul.4
906fb3e2befSFlorian Hahn  ret i1 %t.5
907fb3e2befSFlorian Hahn}
908fb3e2befSFlorian Hahn
909fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_6(i8 %start, i8 %high) {
910fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_6(
911fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
912fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
913fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4
914fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
915fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
916fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]]
917fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]]
918fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_13:%.*]] = add nsw i8 [[START_ADD_2]], 13
919fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_MUL_4]]
920fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_1]]
921fb3e2befSFlorian Hahn;
922fb3e2befSFlorian Hahnentry:
923fb3e2befSFlorian Hahn  %add = add nsw i8 %start, 3
924fb3e2befSFlorian Hahn  %start.mul.4 = mul nsw i8 %add, 4
925fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
926fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
927fb3e2befSFlorian Hahn
928fb3e2befSFlorian Hahn  %start.add.1 = add nsw i8 %start, %start
929fb3e2befSFlorian Hahn  %start.add.2 = add nsw i8 %start.add.1, %start.add.1
930fb3e2befSFlorian Hahn  %start.add.2.13 = add nsw i8 %start.add.2, 13
931fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.add.2.13, %start.mul.4
932fb3e2befSFlorian Hahn  ret i1 %f.1
933fb3e2befSFlorian Hahn}
934fb3e2befSFlorian Hahn
935fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_1(i8 %start, i8 %high) {
936fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_1(
937fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
938fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
939fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
940fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
941fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
942fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
943fb3e2befSFlorian Hahn;
944fb3e2befSFlorian Hahnentry:
945fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
946fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
947fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
948fb3e2befSFlorian Hahn
949fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
950fb3e2befSFlorian Hahn  ret i1 %t.1
951fb3e2befSFlorian Hahn}
952fb3e2befSFlorian Hahn
953fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_2(i8 %start, i8 %high) {
954fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_2(
955fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
956fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
957fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
958fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
959fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
960fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]]
961fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
962fb3e2befSFlorian Hahn;
963fb3e2befSFlorian Hahnentry:
964fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
965fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
966fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
967fb3e2befSFlorian Hahn
968fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
969fb3e2befSFlorian Hahn  %t = icmp ult i8 %start.mul.2, %high
970fb3e2befSFlorian Hahn  ret i1 %t
971fb3e2befSFlorian Hahn}
972fb3e2befSFlorian Hahn
973fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_3(i8 %start, i8 %high) {
974fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_3(
975fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
976fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
977fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
978fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
979fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
980fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
981fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_2]]
982fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
983fb3e2befSFlorian Hahn;
984fb3e2befSFlorian Hahnentry:
985fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
986fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
987fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
988fb3e2befSFlorian Hahn
989fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
990fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
991fb3e2befSFlorian Hahn  %t = icmp ule i8 %start.add.1, %start.mul.2
992fb3e2befSFlorian Hahn  ret i1 %t
993fb3e2befSFlorian Hahn}
994fb3e2befSFlorian Hahn
995fb3e2befSFlorian Hahn
996fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_4(i8 %start, i8 %high) {
997fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_4(
998fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
999fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
1000fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1001fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1002fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
1003fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1004fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_MUL_2]]
1005fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
1006fb3e2befSFlorian Hahn;
1007fb3e2befSFlorian Hahnentry:
1008fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
1009fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1010fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1011fb3e2befSFlorian Hahn
1012fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
1013fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1014fb3e2befSFlorian Hahn  %f = icmp ult i8 %start.add.1, %start.mul.2
1015fb3e2befSFlorian Hahn  ret i1 %f
1016fb3e2befSFlorian Hahn}
1017fb3e2befSFlorian Hahn
1018fb3e2befSFlorian Hahn
1019fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_5(i8 %start, i8 %high) {
1020fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_5(
1021fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1022fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
1023fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1024fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1025fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1026fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1027fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]]
1028fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
1029fb3e2befSFlorian Hahn;
1030fb3e2befSFlorian Hahnentry:
1031fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
1032fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1033fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1034fb3e2befSFlorian Hahn
1035fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1036fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1037fb3e2befSFlorian Hahn  %t.4 = icmp ule i8 %start.add.2, %start.mul.4
1038fb3e2befSFlorian Hahn  ret i1 %t.4
1039fb3e2befSFlorian Hahn}
1040fb3e2befSFlorian Hahn
1041fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_6(i8 %start, i8 %high) {
1042fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_6(
1043fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1044fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
1045fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1046fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1047fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1048fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1049fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]]
1050fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_2]]
1051fb3e2befSFlorian Hahn;
1052fb3e2befSFlorian Hahnentry:
1053fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
1054fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1055fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1056fb3e2befSFlorian Hahn
1057fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1058fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1059fb3e2befSFlorian Hahn  %f.2 = icmp ult i8 %start.add.2, %start.mul.4
1060fb3e2befSFlorian Hahn  ret i1 %f.2
1061fb3e2befSFlorian Hahn}
1062fb3e2befSFlorian Hahn
1063fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_7(i8 %start, i8 %high) {
1064fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_7(
1065fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1066fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
1067fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1068fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1069fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
1070fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1071fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1072fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1
1073fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_MUL_4]]
1074fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_3]]
1075fb3e2befSFlorian Hahn;
1076fb3e2befSFlorian Hahnentry:
1077fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
1078fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1079fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1080fb3e2befSFlorian Hahn
1081fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
1082fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1083fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1084fb3e2befSFlorian Hahn  %start.add.2.1 = add i8 %start.add.2, 1
1085fb3e2befSFlorian Hahn  %f.3 = icmp ule i8 %start.add.2.1, %start.mul.4
1086fb3e2befSFlorian Hahn  ret i1 %f.3
1087fb3e2befSFlorian Hahn}
1088fb3e2befSFlorian Hahn
1089fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_8(i8 %start, i8 %high) {
1090fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_8(
1091fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1092fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
1093fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1094fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1095fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
1096fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1097fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1098fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1
1099fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul i8 [[START]], 3
1100fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_3]]
1101fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
1102fb3e2befSFlorian Hahn;
1103fb3e2befSFlorian Hahnentry:
1104fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
1105fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1106fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1107fb3e2befSFlorian Hahn
1108fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
1109fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1110fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1111fb3e2befSFlorian Hahn  %start.add.2.1 = add i8 %start.add.2, 1
1112fb3e2befSFlorian Hahn  %start.mul.3 = mul i8 %start, 3
1113fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.1, %start.mul.3
1114fb3e2befSFlorian Hahn  ret i1 %t.5
1115fb3e2befSFlorian Hahn}
1116fb3e2befSFlorian Hahn
1117fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_9(i8 %start, i8 %high) {
1118fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_9(
1119fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1120fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4
1121fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1122fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1123fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
1124fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1125fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1126fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1
1127fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul i8 [[START]], 3
1128fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_3]]
1129fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_5]]
1130fb3e2befSFlorian Hahn;
1131fb3e2befSFlorian Hahnentry:
1132fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %start, 4
1133fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1134fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1135fb3e2befSFlorian Hahn
1136fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
1137fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1138fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1139fb3e2befSFlorian Hahn  %start.add.2.1 = add i8 %start.add.2, 1
1140fb3e2befSFlorian Hahn  %start.mul.3 = mul i8 %start, 3
1141fb3e2befSFlorian Hahn  %f.5 = icmp ult i8 %start.add.2, %start.mul.3
1142fb3e2befSFlorian Hahn  ret i1 %f.5
1143fb3e2befSFlorian Hahn}
1144fb3e2befSFlorian Hahn
1145fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_10(i8 %start, i8 %high) {
1146fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_10(
1147fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1148fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul i8 [[START:%.*]], 5
1149fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
1150fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
1151fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul i8 [[START]], 3
1152fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
1153fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
1154fb3e2befSFlorian Hahn;
1155fb3e2befSFlorian Hahnentry:
1156fb3e2befSFlorian Hahn  %start.mul.5 = mul i8 %start, 5
1157fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
1158fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
1159fb3e2befSFlorian Hahn
1160fb3e2befSFlorian Hahn  %start.mul.3 = mul i8 %start, 3
1161fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
1162fb3e2befSFlorian Hahn  ret i1 %t.1
1163fb3e2befSFlorian Hahn}
1164fb3e2befSFlorian Hahn
1165fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_11(i8 %start, i8 %high) {
1166fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_11(
1167fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1168fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul i8 [[START:%.*]], 5
1169fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]]
1170fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_0]])
1171fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul i8 [[START]], 3
1172fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
1173fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
1174fb3e2befSFlorian Hahn;
1175fb3e2befSFlorian Hahnentry:
1176fb3e2befSFlorian Hahn  %start.mul.5 = mul i8 %start, 5
1177fb3e2befSFlorian Hahn  %c.0 = icmp ult i8 %start, %start.mul.5
1178fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.0)
1179fb3e2befSFlorian Hahn
1180fb3e2befSFlorian Hahn  %start.mul.3 = mul i8 %start, 3
1181fb3e2befSFlorian Hahn  %c.1 = icmp ule i8 %start.mul.5, %start.mul.3
1182fb3e2befSFlorian Hahn  ret i1 %c.1
1183fb3e2befSFlorian Hahn}
1184fb3e2befSFlorian Hahn
1185fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_12(i8 %start) {
1186fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_12(
1187fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1188fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul i8 [[START:%.*]], 3
1189fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]]
1190fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1191fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul i8 [[START]], 5
1192fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]]
1193fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
1194fb3e2befSFlorian Hahn;
1195fb3e2befSFlorian Hahnentry:
1196fb3e2befSFlorian Hahn  %start.mul.3 = mul i8 %start, 3
1197fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start, %start.mul.3
1198fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1199fb3e2befSFlorian Hahn
1200fb3e2befSFlorian Hahn  %start.mul.5 = mul i8 %start, 5
1201fb3e2befSFlorian Hahn  %t.1 = icmp ule i8 %start.mul.3, %start.mul.5
1202fb3e2befSFlorian Hahn  ret i1 %t.1
1203fb3e2befSFlorian Hahn}
1204fb3e2befSFlorian Hahn
1205fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_13(i8 %start) {
1206fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_13(
1207fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1208fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_3:%.*]] = mul i8 [[START:%.*]], 3
1209fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]]
1210fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1211fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_5:%.*]] = mul i8 [[START]], 5
1212fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]]
1213fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_1]]
1214fb3e2befSFlorian Hahn;
1215fb3e2befSFlorian Hahnentry:
1216fb3e2befSFlorian Hahn  %start.mul.3 = mul i8 %start, 3
1217fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start, %start.mul.3
1218fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1219fb3e2befSFlorian Hahn
1220fb3e2befSFlorian Hahn  %start.mul.5 = mul i8 %start, 5
1221fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.mul.5, %start.mul.3
1222fb3e2befSFlorian Hahn  ret i1 %f.1
1223fb3e2befSFlorian Hahn}
1224fb3e2befSFlorian Hahn
1225fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_1(i8 %start, i8 %high) {
1226fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_1(
1227fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1228fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1229fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4
1230fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1231fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1232fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
1233fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_1]]
1234fb3e2befSFlorian Hahn;
1235fb3e2befSFlorian Hahnentry:
1236fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1237fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %add, 4
1238fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1239fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1240fb3e2befSFlorian Hahn
1241fb3e2befSFlorian Hahn  %t.1 = icmp ult i8 %start, %high
1242fb3e2befSFlorian Hahn  ret i1 %t.1
1243fb3e2befSFlorian Hahn}
1244fb3e2befSFlorian Hahn
1245fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_2(i8 %start, i8 %high) {
1246fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_2(
1247fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1248fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1249fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4
1250fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1251fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1252fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
1253fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]]
1254fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_2]]
1255fb3e2befSFlorian Hahn;
1256fb3e2befSFlorian Hahnentry:
1257fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1258fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %add, 4
1259fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1260fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1261fb3e2befSFlorian Hahn
1262fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
1263fb3e2befSFlorian Hahn  %t.2 = icmp ult i8 %start.mul.2, %high
1264fb3e2befSFlorian Hahn  ret i1 %t.2
1265fb3e2befSFlorian Hahn}
1266fb3e2befSFlorian Hahn
1267fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_3(i8 %start, i8 %high) {
1268fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_3(
1269fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1270fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1271fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4
1272fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1273fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1274fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1275fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1276fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]]
1277fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_3]]
1278fb3e2befSFlorian Hahn;
1279fb3e2befSFlorian Hahnentry:
1280fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1281fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %add, 4
1282fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1283fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1284fb3e2befSFlorian Hahn
1285fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1286fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1287fb3e2befSFlorian Hahn  %t.3 = icmp ule i8 %start.add.2, %start.mul.4
1288fb3e2befSFlorian Hahn  ret i1 %t.3
1289fb3e2befSFlorian Hahn}
1290fb3e2befSFlorian Hahn
1291fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_4(i8 %start, i8 %high) {
1292fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_4(
1293fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1294fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1295fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4
1296fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1297fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1298fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_2:%.*]] = mul i8 [[START]], 2
1299fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1300fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1301fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]]
1302fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_4]]
1303fb3e2befSFlorian Hahn;
1304fb3e2befSFlorian Hahnentry:
1305fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1306fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %add, 4
1307fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1308fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1309fb3e2befSFlorian Hahn
1310fb3e2befSFlorian Hahn  %start.mul.2 = mul i8 %start, 2
1311fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1312fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1313fb3e2befSFlorian Hahn  %t.4 = icmp ult i8 %start.add.2, %start.mul.4
1314fb3e2befSFlorian Hahn  ret i1 %t.4
1315fb3e2befSFlorian Hahn}
1316fb3e2befSFlorian Hahn
1317fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_5(i8 %start, i8 %high) {
1318fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_5(
1319fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1320fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1321fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4
1322fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1323fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1324fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1325fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1326fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_12:%.*]] = add i8 [[START_ADD_2]], 12
1327fb3e2befSFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_MUL_4]]
1328fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[T_5]]
1329fb3e2befSFlorian Hahn;
1330fb3e2befSFlorian Hahnentry:
1331fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1332fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %add, 4
1333fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1334fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1335fb3e2befSFlorian Hahn
1336fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1337fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1338fb3e2befSFlorian Hahn  %start.add.2.12 = add i8 %start.add.2, 12
1339fb3e2befSFlorian Hahn  %t.5 = icmp ule i8 %start.add.2.12, %start.mul.4
1340fb3e2befSFlorian Hahn  ret i1 %t.5
1341fb3e2befSFlorian Hahn}
1342fb3e2befSFlorian Hahn
1343fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_6(i8 %start, i8 %high) {
1344fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_6(
1345fb3e2befSFlorian Hahn; CHECK-NEXT:  entry:
1346fb3e2befSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], 3
1347fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4
1348fb3e2befSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1349fb3e2befSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
1350fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_1:%.*]] = add i8 [[START]], [[START]]
1351fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]]
1352fb3e2befSFlorian Hahn; CHECK-NEXT:    [[START_ADD_2_13:%.*]] = add i8 [[START_ADD_2]], 13
1353fb3e2befSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_MUL_4]]
1354fb3e2befSFlorian Hahn; CHECK-NEXT:    ret i1 [[F_1]]
1355fb3e2befSFlorian Hahn;
1356fb3e2befSFlorian Hahnentry:
1357fb3e2befSFlorian Hahn  %add = add i8 %start, 3
1358fb3e2befSFlorian Hahn  %start.mul.4 = mul i8 %add, 4
1359fb3e2befSFlorian Hahn  %c.1 = icmp ult i8 %start.mul.4, %high
1360fb3e2befSFlorian Hahn  call void @llvm.assume(i1 %c.1)
1361fb3e2befSFlorian Hahn
1362fb3e2befSFlorian Hahn  %start.add.1 = add i8 %start, %start
1363fb3e2befSFlorian Hahn  %start.add.2 = add i8 %start.add.1, %start.add.1
1364fb3e2befSFlorian Hahn  %start.add.2.13 = add i8 %start.add.2, 13
1365fb3e2befSFlorian Hahn  %f.1 = icmp ule i8 %start.add.2.13, %start.mul.4
1366fb3e2befSFlorian Hahn  ret i1 %f.1
1367fb3e2befSFlorian Hahn}
1368fb3e2befSFlorian Hahn
1369