[InstCombine] add/move tests for sub-of-umax; NFC

This commit is contained in:
Sanjay Patel 2021-11-09 10:35:13 -05:00
parent b1c9d3d29a
commit ad48fc35e2
2 changed files with 70 additions and 23 deletions

View File

@ -2129,26 +2129,3 @@ define <3 x i8> @umax_vector_splat_undef(<3 x i8> %x) {
%r = call <3 x i8> @llvm.umax.v3i8(<3 x i8> %a, <3 x i8> <i8 13, i8 130, i8 130>)
ret <3 x i8> %r
}
define <3 x i8> @umax_sub_vec(<3 x i8> %x, <3 x i8> %y) {
; CHECK-LABEL: @umax_sub_vec(
; CHECK-NEXT: [[TMP1:%.*]] = call <3 x i8> @llvm.usub.sat.v3i8(<3 x i8> [[X:%.*]], <3 x i8> [[Y:%.*]])
; CHECK-NEXT: ret <3 x i8> [[TMP1]]
;
%u = call <3 x i8> @llvm.umax.v3i8(<3 x i8> %x, <3 x i8> %y)
%r = sub <3 x i8> %u, %y
ret <3 x i8> %r
}
define i8 @umax_sub_use(i8 %x, i8 %y) {
; CHECK-LABEL: @umax_sub_use(
; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: call void @use(i8 [[U]])
; CHECK-NEXT: [[R:%.*]] = sub i8 [[U]], [[Y]]
; CHECK-NEXT: ret i8 [[R]]
;
%u = call i8 @llvm.umax.i8(i8 %x, i8 %y)
call void @use(i8 %u)
%r = sub i8 %u, %y
ret i8 %r
}

View File

@ -3,6 +3,7 @@
declare i5 @llvm.umin.i5(i5, i5)
declare <2 x i8> @llvm.umin.v2i8(<2 x i8>, <2 x i8>)
declare <2 x i8> @llvm.umax.v2i8(<2 x i8>, <2 x i8>)
declare i8 @llvm.smax.i8(i8, i8)
declare i8 @llvm.smin.i8(i8, i8)
@ -498,5 +499,74 @@ define i8 @umin_not_sub_intrinsic_uses(i8 %x, i8 %y) {
ret i8 %subx
}
define i8 @umax_sub_op0(i8 %x, i8 %y) {
; CHECK-LABEL: @umax_sub_op0(
; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: [[R:%.*]] = sub i8 [[U]], [[Y]]
; CHECK-NEXT: ret i8 [[R]]
;
%u = call i8 @llvm.umax.i8(i8 %y, i8 %x)
%r = sub i8 %u, %y
ret i8 %r
}
define <2 x i8> @umax_sub_op0_vec_commute(<2 x i8> %x, <2 x i8> %y) {
; CHECK-LABEL: @umax_sub_op0_vec_commute(
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]])
; CHECK-NEXT: ret <2 x i8> [[TMP1]]
;
%u = call <2 x i8> @llvm.umax.v2i8(<2 x i8> %x, <2 x i8> %y)
%r = sub <2 x i8> %u, %y
ret <2 x i8> %r
}
define i8 @umax_sub_op0_use(i8 %x, i8 %y) {
; CHECK-LABEL: @umax_sub_op0_use(
; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: call void @use8(i8 [[U]])
; CHECK-NEXT: [[R:%.*]] = sub i8 [[U]], [[Y]]
; CHECK-NEXT: ret i8 [[R]]
;
%u = call i8 @llvm.umax.i8(i8 %x, i8 %y)
call void @use8(i8 %u)
%r = sub i8 %u, %y
ret i8 %r
}
define i8 @umax_sub_op1(i8 %x, i8 %y) {
; CHECK-LABEL: @umax_sub_op1(
; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[U]]
; CHECK-NEXT: ret i8 [[R]]
;
%u = call i8 @llvm.umax.i8(i8 %x, i8 %y)
%r = sub i8 %y, %u
ret i8 %r
}
define <2 x i8> @umax_sub_op1_vec_commute(<2 x i8> %x, <2 x i8> %y) {
; CHECK-LABEL: @umax_sub_op1_vec_commute(
; CHECK-NEXT: [[U:%.*]] = call <2 x i8> @llvm.umax.v2i8(<2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]])
; CHECK-NEXT: [[R:%.*]] = sub <2 x i8> [[Y]], [[U]]
; CHECK-NEXT: ret <2 x i8> [[R]]
;
%u = call <2 x i8> @llvm.umax.v2i8(<2 x i8> %x, <2 x i8> %y)
%r = sub <2 x i8> %y, %u
ret <2 x i8> %r
}
define i8 @umax_sub_op1_use(i8 %x, i8 %y) {
; CHECK-LABEL: @umax_sub_op1_use(
; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: call void @use8(i8 [[U]])
; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[U]]
; CHECK-NEXT: ret i8 [[R]]
;
%u = call i8 @llvm.umax.i8(i8 %x, i8 %y)
call void @use8(i8 %u)
%r = sub i8 %y, %u
ret i8 %r
}
declare void @use8(i8)
declare void @use32(i32 %u)