From 400587ba0c8b14537e5b52190ee2fc869f2f9728 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Wed, 11 May 2022 08:47:05 -0400 Subject: [PATCH] [InstCombine] improve auto-generated test checks by matching function signature; NFC Without this, miscompiles go undetected here as shown in D125352. --- llvm/test/Transforms/InstCombine/sub-minmax.ll | 321 +++++++++++++++---------- 1 file changed, 188 insertions(+), 133 deletions(-) diff --git a/llvm/test/Transforms/InstCombine/sub-minmax.ll b/llvm/test/Transforms/InstCombine/sub-minmax.ll index 059013c..832c723 100644 --- a/llvm/test/Transforms/InstCombine/sub-minmax.ll +++ b/llvm/test/Transforms/InstCombine/sub-minmax.ll @@ -1,4 +1,4 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature ; RUN: opt < %s -passes=instcombine -S | FileCheck %s declare i5 @llvm.umin.i5(i5, i5) @@ -11,9 +11,10 @@ declare i8 @llvm.umax.i8(i8, i8) declare i8 @llvm.umin.i8(i8, i8) define i32 @max_na_b_minux_na(i32 %A, i32 %B) { -; CHECK-LABEL: @max_na_b_minux_na( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@max_na_b_minux_na +; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B]]) ; CHECK-NEXT: [[X:%.*]] = sub i32 0, [[TMP1]] ; CHECK-NEXT: ret i32 [[X]] ; @@ -25,9 +26,10 @@ define i32 @max_na_b_minux_na(i32 %A, i32 %B) { } define i32 @na_minus_max_na_b(i32 %A, i32 %B) { -; CHECK-LABEL: @na_minus_max_na_b( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_na_b +; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B]]) ; CHECK-NEXT: ret i32 [[TMP1]] ; %not = xor i32 %A, -1 @@ -38,8 +40,9 @@ define i32 @na_minus_max_na_b(i32 %A, i32 %B) { } define i5 @sub_umin(i5 %a, i5 %b) { -; CHECK-LABEL: @sub_umin( -; CHECK-NEXT: [[TMP1:%.*]] = call i5 @llvm.usub.sat.i5(i5 [[A:%.*]], i5 [[B:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@sub_umin +; CHECK-SAME: (i5 [[A:%.*]], i5 [[B:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i5 @llvm.usub.sat.i5(i5 [[A]], i5 [[B]]) ; CHECK-NEXT: ret i5 [[TMP1]] ; %umin = call i5 @llvm.umin.i5(i5 %a, i5 %b) @@ -48,8 +51,9 @@ define i5 @sub_umin(i5 %a, i5 %b) { } define <2 x i8> @sub_umin_commute_vec(<2 x i8> %a, <2 x i8> %b) { -; CHECK-LABEL: @sub_umin_commute_vec( -; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[B:%.*]], <2 x i8> [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@sub_umin_commute_vec +; CHECK-SAME: (<2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[B]], <2 x i8> [[A]]) ; CHECK-NEXT: ret <2 x i8> [[TMP1]] ; %umin = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %b, <2 x i8> %a) @@ -58,9 +62,10 @@ define <2 x i8> @sub_umin_commute_vec(<2 x i8> %a, <2 x i8> %b) { } define i5 @sub_umin_uses(i5 %a, i5 %b, i5* %p) { -; CHECK-LABEL: @sub_umin_uses( -; CHECK-NEXT: [[UMIN:%.*]] = call i5 @llvm.umin.i5(i5 [[A:%.*]], i5 [[B:%.*]]) -; CHECK-NEXT: store i5 [[UMIN]], i5* [[P:%.*]], align 1 +; CHECK-LABEL: define {{[^@]+}}@sub_umin_uses +; CHECK-SAME: (i5 [[A:%.*]], i5 [[B:%.*]], i5* [[P:%.*]]) { +; CHECK-NEXT: [[UMIN:%.*]] = call i5 @llvm.umin.i5(i5 [[A]], i5 [[B]]) +; CHECK-NEXT: store i5 [[UMIN]], i5* [[P]], align 1 ; CHECK-NEXT: [[R:%.*]] = sub i5 [[A]], [[UMIN]] ; CHECK-NEXT: ret i5 [[R]] ; @@ -71,9 +76,10 @@ define i5 @sub_umin_uses(i5 %a, i5 %b, i5* %p) { } define i5 @sub_umin_no_common_op(i5 %a, i5 %b, i5 %c) { -; CHECK-LABEL: @sub_umin_no_common_op( -; CHECK-NEXT: [[UMIN:%.*]] = call i5 @llvm.umin.i5(i5 [[A:%.*]], i5 [[B:%.*]]) -; CHECK-NEXT: [[R:%.*]] = sub i5 [[C:%.*]], [[UMIN]] +; CHECK-LABEL: define {{[^@]+}}@sub_umin_no_common_op +; CHECK-SAME: (i5 [[A:%.*]], i5 [[B:%.*]], i5 [[C:%.*]]) { +; CHECK-NEXT: [[UMIN:%.*]] = call i5 @llvm.umin.i5(i5 [[A]], i5 [[B]]) +; CHECK-NEXT: [[R:%.*]] = sub i5 [[C]], [[UMIN]] ; CHECK-NEXT: ret i5 [[R]] ; %umin = call i5 @llvm.umin.i5(i5 %a, i5 %b) @@ -82,9 +88,10 @@ define i5 @sub_umin_no_common_op(i5 %a, i5 %b, i5 %c) { } define i32 @max_b_na_minus_na(i32 %A, i32 %B) { -; CHECK-LABEL: @max_b_na_minus_na( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@max_b_na_minus_na +; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B]]) ; CHECK-NEXT: [[X:%.*]] = sub i32 0, [[TMP1]] ; CHECK-NEXT: ret i32 [[X]] ; @@ -96,9 +103,10 @@ define i32 @max_b_na_minus_na(i32 %A, i32 %B) { } define i32 @na_minus_max_b_na(i32 %A, i32 %B) { -; CHECK-LABEL: @na_minus_max_b_na( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_b_na +; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[NOT]], i32 [[B]]) ; CHECK-NEXT: ret i32 [[TMP1]] ; %not = xor i32 %A, -1 @@ -110,8 +118,9 @@ define i32 @na_minus_max_b_na(i32 %A, i32 %B) { define i32 @max_na_bi_minux_na(i32 %A, i32 %Bi) { -; CHECK-LABEL: @max_na_bi_minux_na( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@max_na_bi_minux_na +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: [[X:%.*]] = sub i32 0, [[TMP1]] ; CHECK-NEXT: ret i32 [[X]] ; @@ -124,8 +133,9 @@ define i32 @max_na_bi_minux_na(i32 %A, i32 %Bi) { } define i32 @na_minus_max_na_bi(i32 %A, i32 %Bi) { -; CHECK-LABEL: @na_minus_max_na_bi( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_na_bi +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: ret i32 [[TMP1]] ; %B = xor i32 %Bi, -1 @@ -137,8 +147,9 @@ define i32 @na_minus_max_na_bi(i32 %A, i32 %Bi) { } define i32 @max_bi_na_minus_na(i32 %A, i32 %Bi) { -; CHECK-LABEL: @max_bi_na_minus_na( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@max_bi_na_minus_na +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: [[X:%.*]] = sub i32 0, [[TMP1]] ; CHECK-NEXT: ret i32 [[X]] ; @@ -151,8 +162,9 @@ define i32 @max_bi_na_minus_na(i32 %A, i32 %Bi) { } define i32 @na_minus_max_bi_na(i32 %A, i32 %Bi) { -; CHECK-LABEL: @na_minus_max_bi_na( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_bi_na +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: ret i32 [[TMP1]] ; %B = xor i32 %Bi, -1 @@ -165,8 +177,9 @@ define i32 @na_minus_max_bi_na(i32 %A, i32 %Bi) { define i32 @max_na_bi_minux_na_use(i32 %A, i32 %Bi) { -; CHECK-LABEL: @max_na_bi_minux_na_use( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 -32) +; CHECK-LABEL: define {{[^@]+}}@max_na_bi_minux_na_use +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 -32) ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: [[X:%.*]] = sub i32 [[A]], [[TMP1]] ; CHECK-NEXT: call void @use32(i32 [[TMP2]]) @@ -181,8 +194,9 @@ define i32 @max_na_bi_minux_na_use(i32 %A, i32 %Bi) { } define i32 @na_minus_max_na_bi_use(i32 %A, i32 %Bi) { -; CHECK-LABEL: @na_minus_max_na_bi_use( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 -32) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_na_bi_use +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 -32) ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: [[X:%.*]] = sub i32 [[TMP1]], [[A]] ; CHECK-NEXT: call void @use32(i32 [[TMP2]]) @@ -197,8 +211,9 @@ define i32 @na_minus_max_na_bi_use(i32 %A, i32 %Bi) { } define i32 @max_bi_na_minus_na_use(i32 %A, i32 %Bi) { -; CHECK-LABEL: @max_bi_na_minus_na_use( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@max_bi_na_minus_na_use +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: [[X:%.*]] = sub i32 [[A]], [[TMP1]] ; CHECK-NEXT: call void @use32(i32 [[TMP2]]) @@ -214,8 +229,9 @@ define i32 @max_bi_na_minus_na_use(i32 %A, i32 %Bi) { } define i32 @na_minus_max_bi_na_use(i32 %A, i32 %Bi) { -; CHECK-LABEL: @na_minus_max_bi_na_use( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI:%.*]], i32 [[A:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_bi_na_use +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: [[X:%.*]] = sub i32 [[TMP1]], [[A]] ; CHECK-NEXT: call void @use32(i32 [[TMP2]]) @@ -232,8 +248,9 @@ define i32 @na_minus_max_bi_na_use(i32 %A, i32 %Bi) { define i32 @max_na_bi_minux_na_use2(i32 %A, i32 %Bi) { -; CHECK-LABEL: @max_na_bi_minux_na_use2( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 +; CHECK-LABEL: define {{[^@]+}}@max_na_bi_minux_na_use2 +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umin.i32(i32 [[NOT]], i32 31) ; CHECK-NEXT: [[X:%.*]] = sub i32 [[TMP1]], [[NOT]] ; CHECK-NEXT: call void @use32(i32 [[TMP1]]) @@ -250,8 +267,9 @@ define i32 @max_na_bi_minux_na_use2(i32 %A, i32 %Bi) { } define i32 @na_minus_max_na_bi_use2(i32 %A, i32 %Bi) { -; CHECK-LABEL: @na_minus_max_na_bi_use2( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_na_bi_use2 +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umin.i32(i32 [[NOT]], i32 31) ; CHECK-NEXT: [[X:%.*]] = sub i32 [[NOT]], [[TMP1]] ; CHECK-NEXT: call void @use32(i32 [[TMP1]]) @@ -268,9 +286,10 @@ define i32 @na_minus_max_na_bi_use2(i32 %A, i32 %Bi) { } define i32 @max_bi_na_minus_na_use2(i32 %A, i32 %Bi) { -; CHECK-LABEL: @max_bi_na_minus_na_use2( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI:%.*]], i32 [[A]]) +; CHECK-LABEL: define {{[^@]+}}@max_bi_na_minus_na_use2 +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: [[X:%.*]] = sub i32 [[A]], [[TMP1]] ; CHECK-NEXT: call void @use32(i32 [[TMP2]]) @@ -288,9 +307,10 @@ define i32 @max_bi_na_minus_na_use2(i32 %A, i32 %Bi) { } define i32 @na_minus_max_bi_na_use2(i32 %A, i32 %Bi) { -; CHECK-LABEL: @na_minus_max_bi_na_use2( -; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI:%.*]], i32 [[A]]) +; CHECK-LABEL: define {{[^@]+}}@na_minus_max_bi_na_use2 +; CHECK-SAME: (i32 [[A:%.*]], i32 [[BI:%.*]]) { +; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[BI]], i32 [[A]]) ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: [[X:%.*]] = sub i32 [[TMP1]], [[A]] ; CHECK-NEXT: call void @use32(i32 [[TMP2]]) @@ -308,8 +328,9 @@ define i32 @na_minus_max_bi_na_use2(i32 %A, i32 %Bi) { } define i8 @umin_not_sub(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_not_sub( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_not_sub +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: [[TMP2:%.*]] = xor i8 [[TMP1]], -1 ; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[TMP1]], [[X]] ; CHECK-NEXT: [[SUBY:%.*]] = sub i8 [[TMP1]], [[Y]] @@ -329,8 +350,9 @@ define i8 @umin_not_sub(i8 %x, i8 %y) { } define i8 @umin_not_sub_rev(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_not_sub_rev( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_not_sub_rev +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: [[TMP2:%.*]] = xor i8 [[TMP1]], -1 ; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[X]], [[TMP1]] ; CHECK-NEXT: [[SUBY:%.*]] = sub i8 [[Y]], [[TMP1]] @@ -350,9 +372,10 @@ define i8 @umin_not_sub_rev(i8 %x, i8 %y) { } define void @umin3_not_all_ops_extra_uses_invert_subs(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @umin3_not_all_ops_extra_uses_invert_subs( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Z:%.*]]) -; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[TMP1]]) +; CHECK-LABEL: define {{[^@]+}}@umin3_not_all_ops_extra_uses_invert_subs +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Z]]) +; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[TMP1]]) ; CHECK-NEXT: [[TMP3:%.*]] = xor i8 [[TMP2]], -1 ; CHECK-NEXT: [[XMIN:%.*]] = sub i8 [[TMP2]], [[X]] ; CHECK-NEXT: [[YMIN:%.*]] = sub i8 [[TMP2]], [[Y]] @@ -387,10 +410,11 @@ define void @umin3_not_all_ops_extra_uses_invert_subs(i8 %x, i8 %y, i8 %z) { ; Min/Max(Y, ~X) - ~X -> X - ~Min/Max(X, ~Y) define i8 @umin_not_sub_intrinsic_commute0(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_not_sub_intrinsic_commute0( -; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1 +; CHECK-LABEL: define {{[^@]+}}@umin_not_sub_intrinsic_commute0 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y]], -1 ; CHECK-NEXT: call void @use8(i8 [[NY]]) -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y]]) +; 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 [[TMP1]], [[X]] @@ -406,10 +430,11 @@ define i8 @umin_not_sub_intrinsic_commute0(i8 %x, i8 %y) { } define i8 @umax_not_sub_intrinsic_commute1(i8 %x, i8 %y) { -; CHECK-LABEL: @umax_not_sub_intrinsic_commute1( -; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1 +; CHECK-LABEL: define {{[^@]+}}@umax_not_sub_intrinsic_commute1 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y]], -1 ; CHECK-NEXT: call void @use8(i8 [[NY]]) -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y]]) +; 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 [[TMP1]], [[X]] @@ -425,10 +450,11 @@ define i8 @umax_not_sub_intrinsic_commute1(i8 %x, i8 %y) { } define i8 @smin_not_sub_intrinsic_commute2(i8 %x, i8 %y) { -; CHECK-LABEL: @smin_not_sub_intrinsic_commute2( -; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1 +; CHECK-LABEL: define {{[^@]+}}@smin_not_sub_intrinsic_commute2 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y]], -1 ; CHECK-NEXT: call void @use8(i8 [[NY]]) -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y]]) +; 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 [[X]], [[TMP1]] @@ -444,10 +470,11 @@ define i8 @smin_not_sub_intrinsic_commute2(i8 %x, i8 %y) { } define i8 @smax_not_sub_intrinsic_commute3(i8 %x, i8 %y) { -; CHECK-LABEL: @smax_not_sub_intrinsic_commute3( -; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1 +; CHECK-LABEL: define {{[^@]+}}@smax_not_sub_intrinsic_commute3 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y]], -1 ; CHECK-NEXT: call void @use8(i8 [[NY]]) -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y]]) +; 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 [[X]], [[TMP1]] @@ -465,10 +492,11 @@ define i8 @smax_not_sub_intrinsic_commute3(i8 %x, i8 %y) { ; 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 +; CHECK-LABEL: define {{[^@]+}}@umin_not_sub_intrinsic_uses +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X]], -1 ; CHECK-NEXT: call void @use8(i8 [[NX]]) -; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -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: call void @use8(i8 [[M]]) @@ -486,8 +514,9 @@ define i8 @umin_not_sub_intrinsic_uses(i8 %x, i8 %y) { } define i8 @umax_sub_op0(i8 %x, i8 %y) { -; CHECK-LABEL: @umax_sub_op0( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umax_sub_op0 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %u = call i8 @llvm.umax.i8(i8 %y, i8 %x) @@ -496,8 +525,9 @@ define i8 @umax_sub_op0(i8 %x, i8 %y) { } 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-LABEL: define {{[^@]+}}@umax_sub_op0_vec_commute +; CHECK-SAME: (<2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; 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) @@ -506,8 +536,9 @@ define <2 x i8> @umax_sub_op0_vec_commute(<2 x i8> %x, <2 x i8> %y) { } 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-LABEL: define {{[^@]+}}@umax_sub_op0_use +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; 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]] @@ -519,8 +550,9 @@ define i8 @umax_sub_op0_use(i8 %x, i8 %y) { } define i8 @umax_sub_op1(i8 %x, i8 %y) { -; CHECK-LABEL: @umax_sub_op1( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umax_sub_op1 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: [[R:%.*]] = sub i8 0, [[TMP1]] ; CHECK-NEXT: ret i8 [[R]] ; @@ -530,8 +562,9 @@ define i8 @umax_sub_op1(i8 %x, i8 %y) { } 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: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umax_sub_op1_vec_commute +; CHECK-SAME: (<2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[X]], <2 x i8> [[Y]]) ; CHECK-NEXT: [[R:%.*]] = sub <2 x i8> zeroinitializer, [[TMP1]] ; CHECK-NEXT: ret <2 x i8> [[R]] ; @@ -541,8 +574,9 @@ define <2 x i8> @umax_sub_op1_vec_commute(<2 x i8> %x, <2 x i8> %y) { } 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-LABEL: define {{[^@]+}}@umax_sub_op1_use +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; 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]] @@ -554,8 +588,9 @@ define i8 @umax_sub_op1_use(i8 %x, i8 %y) { } define i8 @umin_sub_op1(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_sub_op1( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_sub_op1 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %u = call i8 @llvm.umin.i8(i8 %y, i8 %x) @@ -564,8 +599,9 @@ define i8 @umin_sub_op1(i8 %x, i8 %y) { } define i8 @umin_sub_op1_commute(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_sub_op1_commute( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_sub_op1_commute +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %u = call i8 @llvm.umin.i8(i8 %x, i8 %y) @@ -574,8 +610,9 @@ define i8 @umin_sub_op1_commute(i8 %x, i8 %y) { } define i8 @umin_sub_op0(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_sub_op0( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_sub_op0 +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: [[R:%.*]] = sub i8 0, [[TMP1]] ; CHECK-NEXT: ret i8 [[R]] ; @@ -585,8 +622,9 @@ define i8 @umin_sub_op0(i8 %x, i8 %y) { } define i8 @umin_sub_op0_commute(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_sub_op0_commute( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_sub_op0_commute +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: [[R:%.*]] = sub i8 0, [[TMP1]] ; CHECK-NEXT: ret i8 [[R]] ; @@ -596,8 +634,9 @@ define i8 @umin_sub_op0_commute(i8 %x, i8 %y) { } define i8 @umin_sub_op1_use(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_sub_op1_use( -; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_sub_op1_use +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: call void @use8(i8 [[U]]) ; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[U]] ; CHECK-NEXT: ret i8 [[R]] @@ -609,8 +648,9 @@ define i8 @umin_sub_op1_use(i8 %x, i8 %y) { } define i8 @umin_sub_op0_use(i8 %x, i8 %y) { -; CHECK-LABEL: @umin_sub_op0_use( -; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@umin_sub_op0_use +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[U:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: call void @use8(i8 [[U]]) ; CHECK-NEXT: [[R:%.*]] = sub i8 [[U]], [[Y]] ; CHECK-NEXT: ret i8 [[R]] @@ -627,8 +667,9 @@ define i8 @umin_sub_op0_use(i8 %x, i8 %y) { ; define i8 @diff_add_smin(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_smin( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@diff_add_smin +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %a = add i8 %x, %y @@ -638,8 +679,9 @@ define i8 @diff_add_smin(i8 %x, i8 %y) { } define i8 @diff_add_smax(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_smax( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@diff_add_smax +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %a = add i8 %x, %y @@ -649,8 +691,9 @@ define i8 @diff_add_smax(i8 %x, i8 %y) { } define i8 @diff_add_umin(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_umin( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@diff_add_umin +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %a = add i8 %x, %y @@ -660,8 +703,9 @@ define i8 @diff_add_umin(i8 %x, i8 %y) { } define i8 @diff_add_umax(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_umax( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@diff_add_umax +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: ret i8 [[TMP1]] ; %a = add i8 %x, %y @@ -671,8 +715,9 @@ define i8 @diff_add_umax(i8 %x, i8 %y) { } define i8 @diff_add_smin_use(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_smin_use( -; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@diff_add_smin_use +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: call void @use8(i8 [[M]]) ; CHECK-NEXT: ret i8 [[TMP1]] @@ -685,8 +730,9 @@ define i8 @diff_add_smin_use(i8 %x, i8 %y) { } define i8 @diff_add_use_smax(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_use_smax( -; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define {{[^@]+}}@diff_add_use_smax +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = add i8 [[X]], [[Y]] ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: call void @use8(i8 [[A]]) ; CHECK-NEXT: ret i8 [[TMP1]] @@ -699,8 +745,9 @@ define i8 @diff_add_use_smax(i8 %x, i8 %y) { } define i8 @diff_add_use_umin_use(i8 %x, i8 %y) { -; CHECK-LABEL: @diff_add_use_umin_use( -; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define {{[^@]+}}@diff_add_use_umin_use +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = add i8 [[X]], [[Y]] ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) ; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] ; CHECK-NEXT: call void @use8(i8 [[A]]) @@ -720,9 +767,10 @@ define i8 @diff_add_use_umin_use(i8 %x, i8 %y) { ; define i8 @sub_add_umin(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @sub_add_umin( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[Z:%.*]]) -; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X:%.*]] +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y]], i8 [[Z]]) +; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X]] ; CHECK-NEXT: ret i8 [[S]] ; %a = add i8 %x, %y @@ -732,9 +780,10 @@ define i8 @sub_add_umin(i8 %x, i8 %y, i8 %z) { } define i8 @sub_add_umin_commute_umin(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @sub_add_umin_commute_umin( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[Z:%.*]]) -; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X:%.*]] +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_commute_umin +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Z]], i8 [[Y]]) +; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X]] ; CHECK-NEXT: ret i8 [[S]] ; %a = add i8 %x, %y @@ -744,9 +793,10 @@ define i8 @sub_add_umin_commute_umin(i8 %x, i8 %y, i8 %z) { } define i8 @sub_add_umin_commute_add(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @sub_add_umin_commute_add( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[Z:%.*]]) -; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X:%.*]] +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_commute_add +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y]], i8 [[Z]]) +; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X]] ; CHECK-NEXT: ret i8 [[S]] ; %a = add i8 %y, %x @@ -756,9 +806,10 @@ define i8 @sub_add_umin_commute_add(i8 %x, i8 %y, i8 %z) { } define i8 @sub_add_umin_commute_add_umin(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @sub_add_umin_commute_add_umin( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Y:%.*]], i8 [[Z:%.*]]) -; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X:%.*]] +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_commute_add_umin +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[Z]], i8 [[Y]]) +; CHECK-NEXT: [[S:%.*]] = add i8 [[TMP1]], [[X]] ; CHECK-NEXT: ret i8 [[S]] ; %a = add i8 %y, %x @@ -768,9 +819,10 @@ define i8 @sub_add_umin_commute_add_umin(i8 %x, i8 %y, i8 %z) { } define <2 x i8> @sub_add_umin_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { -; CHECK-LABEL: @sub_add_umin_vec( -; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[Y:%.*]], <2 x i8> [[Z:%.*]]) -; CHECK-NEXT: [[S:%.*]] = add <2 x i8> [[TMP1]], [[X:%.*]] +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_vec +; CHECK-SAME: (<2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]], <2 x i8> [[Z:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[Y]], <2 x i8> [[Z]]) +; CHECK-NEXT: [[S:%.*]] = add <2 x i8> [[TMP1]], [[X]] ; CHECK-NEXT: ret <2 x i8> [[S]] ; %a = add <2 x i8> %x, %y @@ -782,9 +834,10 @@ define <2 x i8> @sub_add_umin_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { ; negative test define i8 @sub_add_umin_mismatch(i8 %x, i8 %y, i8 %z, i8 %t) { -; CHECK-LABEL: @sub_add_umin_mismatch( -; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[T:%.*]], i8 [[Z:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_mismatch +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[T:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = add i8 [[X]], [[Y]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[T]], i8 [[Z]]) ; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] ; CHECK-NEXT: ret i8 [[S]] ; @@ -795,9 +848,10 @@ define i8 @sub_add_umin_mismatch(i8 %x, i8 %y, i8 %z, i8 %t) { } define i8 @sub_add_umin_use_a(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @sub_add_umin_use_a( -; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_use_a +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = add i8 [[X]], [[Y]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z]]) ; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] ; CHECK-NEXT: call void @use8(i8 [[A]]) ; CHECK-NEXT: ret i8 [[S]] @@ -810,9 +864,10 @@ define i8 @sub_add_umin_use_a(i8 %x, i8 %y, i8 %z) { } define i8 @sub_add_umin_use_m(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @sub_add_umin_use_m( -; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z:%.*]]) +; CHECK-LABEL: define {{[^@]+}}@sub_add_umin_use_m +; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = add i8 [[X]], [[Y]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[Z]]) ; CHECK-NEXT: [[S:%.*]] = sub i8 [[A]], [[M]] ; CHECK-NEXT: call void @use8(i8 [[M]]) ; CHECK-NEXT: ret i8 [[S]] -- 2.7.4