@@ -228,3 +228,108 @@ then:
228
228
else:
229
229
ret i1 0
230
230
}
231
+
232
+ define i1 @ule_signed_pos_constant_1 (i8 %a , i8 %b ) {
233
+ ; CHECK-LABEL: @ule_signed_pos_constant_1(
234
+ ; CHECK-NEXT: [[B_NON_NEG:%.*]] = icmp sge i8 [[B:%.*]], 0
235
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[B_NON_NEG]])
236
+ ; CHECK-NEXT: [[A_ULE_B:%.*]] = icmp ule i8 [[A:%.*]], [[B]]
237
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[A_ULE_B]])
238
+ ; CHECK-NEXT: [[SLE_TEST:%.*]] = icmp sle i8 [[A]], [[B]]
239
+ ; CHECK-NEXT: [[SLT_TEST:%.*]] = icmp slt i8 [[A]], [[B]]
240
+ ; CHECK-NEXT: [[RESULT_XOR:%.*]] = xor i1 [[SLE_TEST]], [[SLT_TEST]]
241
+ ; CHECK-NEXT: ret i1 [[RESULT_XOR]]
242
+ ;
243
+ %b_non_neg = icmp sge i8 %b , 0
244
+ call void @llvm.assume (i1 %b_non_neg )
245
+ %a_ule_b = icmp ule i8 %a , %b
246
+ call void @llvm.assume (i1 %a_ule_b )
247
+
248
+ %sle_test = icmp sle i8 %a , %b
249
+ %slt_test = icmp slt i8 %a , %b
250
+ %result_xor = xor i1 %sle_test , %slt_test
251
+
252
+ ret i1 %result_xor
253
+ }
254
+
255
+ define i1 @ule_signed_pos_constant_2 (i8 %a ) {
256
+ ; CHECK-LABEL: @ule_signed_pos_constant_2(
257
+ ; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ule i8 [[A:%.*]], 4
258
+ ; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]
259
+ ; CHECK: then:
260
+ ; CHECK-NEXT: [[T_0:%.*]] = icmp sge i8 [[A]], 0
261
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp sle i8 [[A]], 4
262
+ ; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], [[T_1]]
263
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp sle i8 [[A]], 5
264
+ ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_0]]
265
+ ; CHECK-NEXT: ret i1 [[RES_2]]
266
+ ; CHECK: else:
267
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0
268
+ ; CHECK-NEXT: [[C_3:%.*]] = icmp sle i8 [[A]], 4
269
+ ; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]]
270
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp sle i8 [[A]], 5
271
+ ; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]
272
+ ; CHECK-NEXT: ret i1 [[RES_4]]
273
+ ;
274
+ %a.ult.4 = icmp ule i8 %a , 4
275
+ br i1 %a.ult.4 , label %then , label %else
276
+
277
+ then:
278
+ %t.0 = icmp sge i8 %a , 0
279
+ %t.1 = icmp sle i8 %a , 4
280
+ %res.1 = xor i1 %t.0 , %t.1
281
+
282
+ %c.0 = icmp sle i8 %a , 5
283
+ %res.2 = xor i1 %res.1 , %c.0
284
+ ret i1 %res.2
285
+
286
+ else:
287
+ %c.2 = icmp sge i8 %a , 0
288
+ %c.3 = icmp sle i8 %a , 4
289
+ %res.3 = xor i1 %c.2 , %c.3
290
+
291
+ %c.4 = icmp sle i8 %a , 5
292
+ %res.4 = xor i1 %res.3 , %c.4
293
+
294
+ ret i1 %res.4
295
+ }
296
+
297
+ define i1 @uge_assumed_positive_values (i8 %a , i8 %b ) {
298
+ ; CHECK-LABEL: @uge_assumed_positive_values(
299
+ ; CHECK-NEXT: [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0
300
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]])
301
+ ; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp uge i8 [[A]], [[B:%.*]]
302
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])
303
+ ; CHECK-NEXT: [[RESULT:%.*]] = icmp sge i8 [[A]], [[B]]
304
+ ; CHECK-NEXT: ret i1 [[RESULT]]
305
+ ;
306
+ %a_non_neg = icmp sge i8 %a , 0
307
+ call void @llvm.assume (i1 %a_non_neg )
308
+ %a_ugt_b = icmp uge i8 %a , %b
309
+ call void @llvm.assume (i1 %a_ugt_b )
310
+
311
+ %result = icmp sge i8 %a , %b
312
+
313
+ ret i1 %result
314
+ }
315
+
316
+ define i1 @ugt_assumed_positive_values (i8 %a , i8 %b ) {
317
+ ; CHECK-LABEL: @ugt_assumed_positive_values(
318
+ ; CHECK-NEXT: [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0
319
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]])
320
+ ; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp ugt i8 [[A]], [[B:%.*]]
321
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])
322
+ ; CHECK-NEXT: [[RESULT:%.*]] = icmp sgt i8 [[A]], [[B]]
323
+ ; CHECK-NEXT: ret i1 [[RESULT]]
324
+ ;
325
+ %a_non_neg = icmp sge i8 %a , 0
326
+ call void @llvm.assume (i1 %a_non_neg )
327
+ %a_ugt_b = icmp ugt i8 %a , %b
328
+ call void @llvm.assume (i1 %a_ugt_b )
329
+
330
+ %result = icmp sgt i8 %a , %b
331
+
332
+ ret i1 %result
333
+ }
334
+
335
+ declare void @llvm.assume (i1 )
0 commit comments