@@ -301,3 +301,66 @@ define i8 @not_smin_swap(i8 %i41, i8 %i43) {
301301 %spec.select = select i1 %i44 , i8 %i46 , i8 0
302302 ret i8 %spec.select
303303}
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