@@ -301,3 +301,66 @@ define i8 @not_smin_swap(i8 %i41, i8 %i43) {
301
301
%spec.select = select i1 %i44 , i8 %i46 , i8 0
302
302
ret i8 %spec.select
303
303
}
304
+
305
+ define i8 @sel_umin_constant (i8 %x ) {
306
+ ; CHECK-LABEL: @sel_umin_constant(
307
+ ; CHECK-NEXT: [[UMIN:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 16)
308
+ ; CHECK-NEXT: ret i8 [[UMIN]]
309
+ ;
310
+ %cmp = icmp sgt i8 %x , -1
311
+ %umin = call i8 @llvm.umin.i8 (i8 %x , i8 16 )
312
+ %sel = select i1 %cmp , i8 %umin , i8 16
313
+ ret i8 %sel
314
+ }
315
+
316
+ define i8 @sel_constant_smax_with_range_attr (i8 %x ) {
317
+ ; CHECK-LABEL: @sel_constant_smax_with_range_attr(
318
+ ; CHECK-NEXT: [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 16)
319
+ ; CHECK-NEXT: ret i8 [[SEL]]
320
+ ;
321
+ %cmp = icmp slt i8 %x , 0
322
+ %smax = call range(i8 8 , 16 ) i8 @llvm.smax.i8 (i8 %x , i8 16 )
323
+ %sel = select i1 %cmp , i8 16 , i8 %smax
324
+ ret i8 %sel
325
+ }
326
+
327
+ ; Negative tests
328
+
329
+ define i8 @sel_umin_constant_mismatch (i8 %x ) {
330
+ ; CHECK-LABEL: @sel_umin_constant_mismatch(
331
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1
332
+ ; CHECK-NEXT: [[UMIN:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 16)
333
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[UMIN]], i8 15
334
+ ; CHECK-NEXT: ret i8 [[SEL]]
335
+ ;
336
+ %cmp = icmp sgt i8 %x , -1
337
+ %umin = call i8 @llvm.umin.i8 (i8 %x , i8 16 )
338
+ %sel = select i1 %cmp , i8 %umin , i8 15
339
+ ret i8 %sel
340
+ }
341
+
342
+ define i8 @sel_umin_constant_op_mismatch (i8 %x , i8 %y ) {
343
+ ; CHECK-LABEL: @sel_umin_constant_op_mismatch(
344
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1
345
+ ; CHECK-NEXT: [[UMIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 16)
346
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[UMIN]], i8 16
347
+ ; CHECK-NEXT: ret i8 [[SEL]]
348
+ ;
349
+ %cmp = icmp sgt i8 %x , -1
350
+ %umin = call i8 @llvm.umin.i8 (i8 %y , i8 16 )
351
+ %sel = select i1 %cmp , i8 %umin , i8 16
352
+ ret i8 %sel
353
+ }
354
+
355
+ define i8 @sel_umin_non_constant (i8 %x , i8 %y ) {
356
+ ; CHECK-LABEL: @sel_umin_non_constant(
357
+ ; CHECK-NEXT: [[UMIN:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 16)
358
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[X]], 0
359
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i8 [[Y:%.*]], i8 [[UMIN]]
360
+ ; CHECK-NEXT: ret i8 [[SEL]]
361
+ ;
362
+ %cmp = icmp sgt i8 %x , -1
363
+ %umin = call i8 @llvm.umin.i8 (i8 %x , i8 16 )
364
+ %sel = select i1 %cmp , i8 %umin , i8 %y
365
+ ret i8 %sel
366
+ }
0 commit comments