define void @cmyk(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTR]], i8 [[NOTG]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[R:%.*]], i8 [[G:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute1(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute1(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTR]], i8 [[NOTG]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTB]], i8 [[M]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[R:%.*]], i8 [[G:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute2(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute2(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTB]], i8 [[M]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute3(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute3(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute4(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute4(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.umin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.umax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute5(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute5(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute6(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute6(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTR]], i8 [[NOTG]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[K]], [[NOTR]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[K]], [[NOTG]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[K]], [[NOTB]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[R:%.*]], i8 [[G:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[R]], [[TMP2]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[G]], [[TMP2]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[B]], [[TMP2]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute7(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute7(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTR]], i8 [[NOTG]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTB]], i8 [[M]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[K]], [[NOTR]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[K]], [[NOTG]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[K]], [[NOTB]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[R:%.*]], i8 [[G:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[R]], [[TMP2]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[G]], [[TMP2]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[B]], [[TMP2]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute8(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute8(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTB]], i8 [[M]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[K]], [[NOTR]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[K]], [[NOTG]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[K]], [[NOTB]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[R]], [[TMP2]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[G]], [[TMP2]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[B]], [[TMP2]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute9(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute9(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[K]], [[NOTR]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[K]], [[NOTG]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[K]], [[NOTB]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[R]], [[TMP2]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[G]], [[TMP2]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[B]], [[TMP2]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute10(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute10(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.umin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[NOTB]], [[K]]
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[K]], [[NOTR]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[NOTG]], [[K]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.umax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[TMP2]], [[B]]
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[R]], [[TMP2]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[TMP2]], [[G]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
define void @cmyk_commute11(i8 %r, i8 %g, i8 %b) {
; CHECK-LABEL: @cmyk_commute11(
-; CHECK-NEXT: [[NOTR:%.*]] = xor i8 [[R:%.*]], -1
-; CHECK-NEXT: [[NOTG:%.*]] = xor i8 [[G:%.*]], -1
-; CHECK-NEXT: [[NOTB:%.*]] = xor i8 [[B:%.*]], -1
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[NOTG]], i8 [[NOTR]])
-; CHECK-NEXT: [[K:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 [[NOTB]])
-; CHECK-NEXT: [[CK:%.*]] = sub i8 [[NOTR]], [[K]]
-; CHECK-NEXT: [[YK:%.*]] = sub i8 [[K]], [[NOTB]]
-; CHECK-NEXT: [[MK:%.*]] = sub i8 [[K]], [[NOTG]]
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[G:%.*]], i8 [[R:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.smax.i8(i8 [[B:%.*]], i8 [[TMP1]])
+; CHECK-NEXT: [[K:%.*]] = xor i8 [[TMP2]], -1
+; CHECK-NEXT: [[CK:%.*]] = sub i8 [[TMP2]], [[R]]
+; CHECK-NEXT: [[YK:%.*]] = sub i8 [[B]], [[TMP2]]
+; CHECK-NEXT: [[MK:%.*]] = sub i8 [[G]], [[TMP2]]
; CHECK-NEXT: call void @use4(i8 [[CK]], i8 [[MK]], i8 [[YK]], i8 [[K]])
; CHECK-NEXT: ret void
;
ret void
}
-; TODO: Handle this pattern with extra uses because it shows up in benchmarks.
+; Handle this pattern with extra uses because it shows up in benchmarks.
; ~X - Min/Max(~X, O) -> Max/Min(X, ~O) - X
; ~X - Min/Max(O, ~X) -> Max/Min(X, ~O) - X
; Min/Max(~X, O) - ~X -> A - Max/Min(X, ~O)
define i8 @umin_not_sub_intrinsic_commute0(i8 %x, i8 %y) {
; CHECK-LABEL: @umin_not_sub_intrinsic_commute0(
-; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
; CHECK-NEXT: call void @use8(i8 [[NY]])
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[NX]], i8 [[NY]])
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y]])
+; CHECK-NEXT: [[M:%.*]] = xor i8 [[TMP1]], -1
; CHECK-NEXT: call void @use8(i8 [[M]])
-; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[NX]], [[M]]
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[TMP1]], [[X]]
; CHECK-NEXT: ret i8 [[SUBX]]
;
%nx = xor i8 %x, -1
define i8 @umax_not_sub_intrinsic_commute1(i8 %x, i8 %y) {
; CHECK-LABEL: @umax_not_sub_intrinsic_commute1(
-; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
; CHECK-NEXT: call void @use8(i8 [[NY]])
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[NY]], i8 [[NX]])
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y]])
+; CHECK-NEXT: [[M:%.*]] = xor i8 [[TMP1]], -1
; CHECK-NEXT: call void @use8(i8 [[M]])
-; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[NX]], [[M]]
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[TMP1]], [[X]]
; CHECK-NEXT: ret i8 [[SUBX]]
;
%nx = xor i8 %x, -1
define i8 @smin_not_sub_intrinsic_commute2(i8 %x, i8 %y) {
; CHECK-LABEL: @smin_not_sub_intrinsic_commute2(
-; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
; CHECK-NEXT: call void @use8(i8 [[NY]])
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NX]], i8 [[NY]])
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y]])
+; CHECK-NEXT: [[M:%.*]] = xor i8 [[TMP1]], -1
; CHECK-NEXT: call void @use8(i8 [[M]])
-; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[M]], [[NX]]
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[X]], [[TMP1]]
; CHECK-NEXT: ret i8 [[SUBX]]
;
%nx = xor i8 %x, -1
define i8 @smax_not_sub_intrinsic_commute3(i8 %x, i8 %y) {
; CHECK-LABEL: @smax_not_sub_intrinsic_commute3(
-; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
; CHECK-NEXT: call void @use8(i8 [[NY]])
-; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[NY]], i8 [[NX]])
+; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y]])
+; CHECK-NEXT: [[M:%.*]] = xor i8 [[TMP1]], -1
; CHECK-NEXT: call void @use8(i8 [[M]])
-; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[M]], [[NX]]
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[X]], [[TMP1]]
; CHECK-NEXT: ret i8 [[SUBX]]
;
%nx = xor i8 %x, -1
ret i8 %subx
}
+; negative test - don't increase instruction count
+
define i8 @umin_not_sub_intrinsic_uses(i8 %x, i8 %y) {
; CHECK-LABEL: @umin_not_sub_intrinsic_uses(
; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1