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