diff options
Diffstat (limited to 'llvm/test/Transforms/InstCombine/select.ll')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/select.ll | 2438 |
1 files changed, 1383 insertions, 1055 deletions
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll index 1f9ee8353601..db117aa28cad 100644 --- a/llvm/test/Transforms/InstCombine/select.ll +++ b/llvm/test/Transforms/InstCombine/select.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: --version 5 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s ; PR1822 @@ -6,8 +6,9 @@ target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64" define i1 @test5(i1 %C) { -; CHECK-LABEL: @test5( -; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true +; CHECK-LABEL: define i1 @test5( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true ; CHECK-NEXT: ret i1 [[NOT_C]] ; %V = select i1 %C, i1 false, i1 true @@ -15,8 +16,9 @@ define i1 @test5(i1 %C) { } define i32 @test6(i1 %C) { -; CHECK-LABEL: @test6( -; CHECK-NEXT: [[V:%.*]] = zext i1 [[C:%.*]] to i32 +; CHECK-LABEL: define i32 @test6( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT: [[V:%.*]] = zext i1 [[C]] to i32 ; CHECK-NEXT: ret i32 [[V]] ; %V = select i1 %C, i32 1, i32 0 @@ -24,8 +26,9 @@ define i32 @test6(i1 %C) { } define i1 @trueval_is_true(i1 %C, i1 %X) { -; CHECK-LABEL: @trueval_is_true( -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[X:%.*]] +; CHECK-LABEL: define i1 @trueval_is_true( +; CHECK-SAME: i1 [[C:%.*]], i1 [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select i1 [[C]], i1 true, i1 [[X]] ; CHECK-NEXT: ret i1 [[R]] ; %R = select i1 %C, i1 true, i1 %X @@ -33,8 +36,9 @@ define i1 @trueval_is_true(i1 %C, i1 %X) { } define <2 x i1> @trueval_is_true_vec(<2 x i1> %C, <2 x i1> %X) { -; CHECK-LABEL: @trueval_is_true_vec( -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> splat (i1 true), <2 x i1> [[X:%.*]] +; CHECK-LABEL: define <2 x i1> @trueval_is_true_vec( +; CHECK-SAME: <2 x i1> [[C:%.*]], <2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C]], <2 x i1> splat (i1 true), <2 x i1> [[X]] ; CHECK-NEXT: ret <2 x i1> [[R]] ; %R = select <2 x i1> %C, <2 x i1> <i1 true, i1 true>, <2 x i1> %X @@ -42,8 +46,9 @@ define <2 x i1> @trueval_is_true_vec(<2 x i1> %C, <2 x i1> %X) { } define <2 x i1> @trueval_is_true_vec_poison_elt(<2 x i1> %C, <2 x i1> %X) { -; CHECK-LABEL: @trueval_is_true_vec_poison_elt( -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> <i1 poison, i1 true>, <2 x i1> [[X:%.*]] +; CHECK-LABEL: define <2 x i1> @trueval_is_true_vec_poison_elt( +; CHECK-SAME: <2 x i1> [[C:%.*]], <2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C]], <2 x i1> <i1 poison, i1 true>, <2 x i1> [[X]] ; CHECK-NEXT: ret <2 x i1> [[R]] ; %R = select <2 x i1> %C, <2 x i1> <i1 poison, i1 true>, <2 x i1> %X @@ -51,8 +56,9 @@ define <2 x i1> @trueval_is_true_vec_poison_elt(<2 x i1> %C, <2 x i1> %X) { } define i1 @test8(i1 %C, i1 %X) { -; CHECK-LABEL: @test8( -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[X:%.*]], i1 false +; CHECK-LABEL: define i1 @test8( +; CHECK-SAME: i1 [[C:%.*]], i1 [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select i1 [[C]], i1 [[X]], i1 false ; CHECK-NEXT: ret i1 [[R]] ; %R = select i1 %C, i1 %X, i1 false @@ -60,8 +66,9 @@ define i1 @test8(i1 %C, i1 %X) { } define <2 x i1> @test8vec(<2 x i1> %C, <2 x i1> %X) { -; CHECK-LABEL: @test8vec( -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> [[X:%.*]], <2 x i1> zeroinitializer +; CHECK-LABEL: define <2 x i1> @test8vec( +; CHECK-SAME: <2 x i1> [[C:%.*]], <2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C]], <2 x i1> [[X]], <2 x i1> zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[R]] ; %R = select <2 x i1> %C, <2 x i1> %X, <2 x i1> <i1 false, i1 false> @@ -69,8 +76,9 @@ define <2 x i1> @test8vec(<2 x i1> %C, <2 x i1> %X) { } define <vscale x 2 x i1> @test8vvec(<vscale x 2 x i1> %C, <vscale x 2 x i1> %X) { -; CHECK-LABEL: @test8vvec( -; CHECK-NEXT: [[R:%.*]] = select <vscale x 2 x i1> [[C:%.*]], <vscale x 2 x i1> [[X:%.*]], <vscale x 2 x i1> zeroinitializer +; CHECK-LABEL: define <vscale x 2 x i1> @test8vvec( +; CHECK-SAME: <vscale x 2 x i1> [[C:%.*]], <vscale x 2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select <vscale x 2 x i1> [[C]], <vscale x 2 x i1> [[X]], <vscale x 2 x i1> zeroinitializer ; CHECK-NEXT: ret <vscale x 2 x i1> [[R]] ; %R = select <vscale x 2 x i1> %C, <vscale x 2 x i1> %X, <vscale x 2 x i1> zeroinitializer @@ -78,9 +86,10 @@ define <vscale x 2 x i1> @test8vvec(<vscale x 2 x i1> %C, <vscale x 2 x i1> %X) } define i1 @test9(i1 %C, i1 %X) { -; CHECK-LABEL: @test9( -; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true -; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_C]], i1 [[X:%.*]], i1 false +; CHECK-LABEL: define i1 @test9( +; CHECK-SAME: i1 [[C:%.*]], i1 [[X:%.*]]) { +; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true +; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_C]], i1 [[X]], i1 false ; CHECK-NEXT: ret i1 [[R]] ; %R = select i1 %C, i1 false, i1 %X @@ -88,9 +97,10 @@ define i1 @test9(i1 %C, i1 %X) { } define <2 x i1> @test9vec(<2 x i1> %C, <2 x i1> %X) { -; CHECK-LABEL: @test9vec( -; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> [[C:%.*]], splat (i1 true) -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[NOT_C]], <2 x i1> [[X:%.*]], <2 x i1> zeroinitializer +; CHECK-LABEL: define <2 x i1> @test9vec( +; CHECK-SAME: <2 x i1> [[C:%.*]], <2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> [[C]], splat (i1 true) +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[NOT_C]], <2 x i1> [[X]], <2 x i1> zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[R]] ; %R = select <2 x i1> %C, <2 x i1> <i1 false, i1 false>, <2 x i1> %X @@ -98,9 +108,10 @@ define <2 x i1> @test9vec(<2 x i1> %C, <2 x i1> %X) { } define <vscale x 2 x i1> @test9vvec(<vscale x 2 x i1> %C, <vscale x 2 x i1> %X) { -; CHECK-LABEL: @test9vvec( -; CHECK-NEXT: [[NOT_C:%.*]] = xor <vscale x 2 x i1> [[C:%.*]], splat (i1 true) -; CHECK-NEXT: [[R:%.*]] = select <vscale x 2 x i1> [[NOT_C]], <vscale x 2 x i1> [[X:%.*]], <vscale x 2 x i1> zeroinitializer +; CHECK-LABEL: define <vscale x 2 x i1> @test9vvec( +; CHECK-SAME: <vscale x 2 x i1> [[C:%.*]], <vscale x 2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[NOT_C:%.*]] = xor <vscale x 2 x i1> [[C]], splat (i1 true) +; CHECK-NEXT: [[R:%.*]] = select <vscale x 2 x i1> [[NOT_C]], <vscale x 2 x i1> [[X]], <vscale x 2 x i1> zeroinitializer ; CHECK-NEXT: ret <vscale x 2 x i1> [[R]] ; %R = select <vscale x 2 x i1> %C, <vscale x 2 x i1> zeroinitializer, <vscale x 2 x i1> %X @@ -108,9 +119,10 @@ define <vscale x 2 x i1> @test9vvec(<vscale x 2 x i1> %C, <vscale x 2 x i1> %X) } define i1 @test10(i1 %C, i1 %X) { -; CHECK-LABEL: @test10( -; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true -; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_C]], i1 true, i1 [[X:%.*]] +; CHECK-LABEL: define i1 @test10( +; CHECK-SAME: i1 [[C:%.*]], i1 [[X:%.*]]) { +; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true +; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_C]], i1 true, i1 [[X]] ; CHECK-NEXT: ret i1 [[R]] ; %R = select i1 %C, i1 %X, i1 true @@ -118,9 +130,10 @@ define i1 @test10(i1 %C, i1 %X) { } define <2 x i1> @test10vec(<2 x i1> %C, <2 x i1> %X) { -; CHECK-LABEL: @test10vec( -; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> [[C:%.*]], splat (i1 true) -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[NOT_C]], <2 x i1> splat (i1 true), <2 x i1> [[X:%.*]] +; CHECK-LABEL: define <2 x i1> @test10vec( +; CHECK-SAME: <2 x i1> [[C:%.*]], <2 x i1> [[X:%.*]]) { +; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> [[C]], splat (i1 true) +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[NOT_C]], <2 x i1> splat (i1 true), <2 x i1> [[X]] ; CHECK-NEXT: ret <2 x i1> [[R]] ; %R = select <2 x i1> %C, <2 x i1> %X, <2 x i1> <i1 true, i1 true> @@ -128,8 +141,9 @@ define <2 x i1> @test10vec(<2 x i1> %C, <2 x i1> %X) { } define i1 @test23(i1 %a, i1 %b) { -; CHECK-LABEL: @test23( -; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false +; CHECK-LABEL: define i1 @test23( +; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i1 [[B]], i1 false ; CHECK-NEXT: ret i1 [[C]] ; %c = select i1 %a, i1 %b, i1 %a @@ -137,8 +151,9 @@ define i1 @test23(i1 %a, i1 %b) { } define <2 x i1> @test23vec(<2 x i1> %a, <2 x i1> %b) { -; CHECK-LABEL: @test23vec( -; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]], <2 x i1> zeroinitializer +; CHECK-LABEL: define <2 x i1> @test23vec( +; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i1> [[B]], <2 x i1> zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[C]] ; %c = select <2 x i1> %a, <2 x i1> %b, <2 x i1> %a @@ -146,8 +161,9 @@ define <2 x i1> @test23vec(<2 x i1> %a, <2 x i1> %b) { } define i1 @test24(i1 %a, i1 %b) { -; CHECK-LABEL: @test24( -; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] +; CHECK-LABEL: define i1 @test24( +; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i1 true, i1 [[B]] ; CHECK-NEXT: ret i1 [[C]] ; %c = select i1 %a, i1 %a, i1 %b @@ -155,8 +171,9 @@ define i1 @test24(i1 %a, i1 %b) { } define <2 x i1> @test24vec(<2 x i1> %a, <2 x i1> %b) { -; CHECK-LABEL: @test24vec( -; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A:%.*]], <2 x i1> splat (i1 true), <2 x i1> [[B:%.*]] +; CHECK-LABEL: define <2 x i1> @test24vec( +; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i1> splat (i1 true), <2 x i1> [[B]] ; CHECK-NEXT: ret <2 x i1> [[C]] ; %c = select <2 x i1> %a, <2 x i1> %a, <2 x i1> %b @@ -164,9 +181,10 @@ define <2 x i1> @test24vec(<2 x i1> %a, <2 x i1> %b) { } define i1 @test62(i1 %A, i1 %B) { -; CHECK-LABEL: @test62( -; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A:%.*]], true -; CHECK-NEXT: [[C:%.*]] = select i1 [[NOT_A]], i1 [[B:%.*]], i1 false +; CHECK-LABEL: define i1 @test62( +; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) { +; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A]], true +; CHECK-NEXT: [[C:%.*]] = select i1 [[NOT_A]], i1 [[B]], i1 false ; CHECK-NEXT: ret i1 [[C]] ; %not = xor i1 %A, true @@ -175,9 +193,10 @@ define i1 @test62(i1 %A, i1 %B) { } define <2 x i1> @test62vec(<2 x i1> %A, <2 x i1> %B) { -; CHECK-LABEL: @test62vec( -; CHECK-NEXT: [[NOT_A:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) -; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[NOT_A]], <2 x i1> [[B:%.*]], <2 x i1> zeroinitializer +; CHECK-LABEL: define <2 x i1> @test62vec( +; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]]) { +; CHECK-NEXT: [[NOT_A:%.*]] = xor <2 x i1> [[A]], splat (i1 true) +; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[NOT_A]], <2 x i1> [[B]], <2 x i1> zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[C]] ; %not = xor <2 x i1> %A, <i1 true, i1 true> @@ -186,9 +205,10 @@ define <2 x i1> @test62vec(<2 x i1> %A, <2 x i1> %B) { } define i1 @test63(i1 %A, i1 %B) { -; CHECK-LABEL: @test63( -; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A:%.*]], true -; CHECK-NEXT: [[C:%.*]] = select i1 [[NOT_A]], i1 true, i1 [[B:%.*]] +; CHECK-LABEL: define i1 @test63( +; CHECK-SAME: i1 [[A:%.*]], i1 [[B:%.*]]) { +; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A]], true +; CHECK-NEXT: [[C:%.*]] = select i1 [[NOT_A]], i1 true, i1 [[B]] ; CHECK-NEXT: ret i1 [[C]] ; %not = xor i1 %A, true @@ -197,9 +217,10 @@ define i1 @test63(i1 %A, i1 %B) { } define <2 x i1> @test63vec(<2 x i1> %A, <2 x i1> %B) { -; CHECK-LABEL: @test63vec( -; CHECK-NEXT: [[NOT_A:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) -; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[NOT_A]], <2 x i1> splat (i1 true), <2 x i1> [[B:%.*]] +; CHECK-LABEL: define <2 x i1> @test63vec( +; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]]) { +; CHECK-NEXT: [[NOT_A:%.*]] = xor <2 x i1> [[A]], splat (i1 true) +; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[NOT_A]], <2 x i1> splat (i1 true), <2 x i1> [[B]] ; CHECK-NEXT: ret <2 x i1> [[C]] ; %not = xor <2 x i1> %A, <i1 true, i1 true> @@ -208,8 +229,9 @@ define <2 x i1> @test63vec(<2 x i1> %A, <2 x i1> %B) { } define i32 @test11(i32 %a) { -; CHECK-LABEL: @test11( -; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[A:%.*]], 0 +; CHECK-LABEL: define i32 @test11( +; CHECK-SAME: i32 [[A:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[A]], 0 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[C]] to i32 ; CHECK-NEXT: ret i32 [[R]] ; @@ -219,9 +241,10 @@ define i32 @test11(i32 %a) { } define i32 @test12(i1 %cond, i32 %a) { -; CHECK-LABEL: @test12( -; CHECK-NEXT: [[B:%.*]] = zext i1 [[COND:%.*]] to i32 -; CHECK-NEXT: [[C:%.*]] = or i32 [[A:%.*]], [[B]] +; CHECK-LABEL: define i32 @test12( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = zext i1 [[COND]] to i32 +; CHECK-NEXT: [[C:%.*]] = or i32 [[A]], [[B]] ; CHECK-NEXT: ret i32 [[C]] ; %b = or i32 %a, 1 @@ -230,9 +253,10 @@ define i32 @test12(i1 %cond, i32 %a) { } define <2 x i32> @test12vec(<2 x i1> %cond, <2 x i32> %a) { -; CHECK-LABEL: @test12vec( -; CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[COND:%.*]] to <2 x i32> -; CHECK-NEXT: [[C:%.*]] = or <2 x i32> [[A:%.*]], [[B]] +; CHECK-LABEL: define <2 x i32> @test12vec( +; CHECK-SAME: <2 x i1> [[COND:%.*]], <2 x i32> [[A:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[COND]] to <2 x i32> +; CHECK-NEXT: [[C:%.*]] = or <2 x i32> [[A]], [[B]] ; CHECK-NEXT: ret <2 x i32> [[C]] ; %b = or <2 x i32> %a, <i32 1, i32 1> @@ -241,9 +265,10 @@ define <2 x i32> @test12vec(<2 x i1> %cond, <2 x i32> %a) { } define i32 @test12a(i1 %cond, i32 %a) { -; CHECK-LABEL: @test12a( -; CHECK-NEXT: [[B:%.*]] = zext i1 [[COND:%.*]] to i32 -; CHECK-NEXT: [[C:%.*]] = ashr i32 [[A:%.*]], [[B]] +; CHECK-LABEL: define i32 @test12a( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = zext i1 [[COND]] to i32 +; CHECK-NEXT: [[C:%.*]] = ashr i32 [[A]], [[B]] ; CHECK-NEXT: ret i32 [[C]] ; %b = ashr i32 %a, 1 @@ -252,9 +277,10 @@ define i32 @test12a(i1 %cond, i32 %a) { } define <2 x i32> @test12avec(<2 x i1> %cond, <2 x i32> %a) { -; CHECK-LABEL: @test12avec( -; CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[COND:%.*]] to <2 x i32> -; CHECK-NEXT: [[C:%.*]] = ashr <2 x i32> [[A:%.*]], [[B]] +; CHECK-LABEL: define <2 x i32> @test12avec( +; CHECK-SAME: <2 x i1> [[COND:%.*]], <2 x i32> [[A:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[COND]] to <2 x i32> +; CHECK-NEXT: [[C:%.*]] = ashr <2 x i32> [[A]], [[B]] ; CHECK-NEXT: ret <2 x i32> [[C]] ; %b = ashr <2 x i32> %a, <i32 1, i32 1> @@ -263,10 +289,11 @@ define <2 x i32> @test12avec(<2 x i1> %cond, <2 x i32> %a) { } define i32 @test12b(i1 %cond, i32 %a) { -; CHECK-LABEL: @test12b( -; CHECK-NEXT: [[NOT_COND:%.*]] = xor i1 [[COND:%.*]], true +; CHECK-LABEL: define i32 @test12b( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]]) { +; CHECK-NEXT: [[NOT_COND:%.*]] = xor i1 [[COND]], true ; CHECK-NEXT: [[B:%.*]] = zext i1 [[NOT_COND]] to i32 -; CHECK-NEXT: [[D:%.*]] = ashr i32 [[A:%.*]], [[B]] +; CHECK-NEXT: [[D:%.*]] = ashr i32 [[A]], [[B]] ; CHECK-NEXT: ret i32 [[D]] ; %b = ashr i32 %a, 1 @@ -275,10 +302,11 @@ define i32 @test12b(i1 %cond, i32 %a) { } define <2 x i32> @test12bvec(<2 x i1> %cond, <2 x i32> %a) { -; CHECK-LABEL: @test12bvec( -; CHECK-NEXT: [[NOT_COND:%.*]] = xor <2 x i1> [[COND:%.*]], splat (i1 true) +; CHECK-LABEL: define <2 x i32> @test12bvec( +; CHECK-SAME: <2 x i1> [[COND:%.*]], <2 x i32> [[A:%.*]]) { +; CHECK-NEXT: [[NOT_COND:%.*]] = xor <2 x i1> [[COND]], splat (i1 true) ; CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[NOT_COND]] to <2 x i32> -; CHECK-NEXT: [[D:%.*]] = ashr <2 x i32> [[A:%.*]], [[B]] +; CHECK-NEXT: [[D:%.*]] = ashr <2 x i32> [[A]], [[B]] ; CHECK-NEXT: ret <2 x i32> [[D]] ; %b = ashr <2 x i32> %a, <i32 1, i32 1> @@ -287,8 +315,9 @@ define <2 x i32> @test12bvec(<2 x i1> %cond, <2 x i32> %a) { } define i32 @test13(i32 %a, i32 %b) { -; CHECK-LABEL: @test13( -; CHECK-NEXT: ret i32 [[B:%.*]] +; CHECK-LABEL: define i32 @test13( +; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: ret i32 [[B]] ; %C = icmp eq i32 %a, %b %V = select i1 %C, i32 %a, i32 %b @@ -296,8 +325,9 @@ define i32 @test13(i32 %a, i32 %b) { } define i32 @test13a(i32 %a, i32 %b) { -; CHECK-LABEL: @test13a( -; CHECK-NEXT: ret i32 [[A:%.*]] +; CHECK-LABEL: define i32 @test13a( +; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: ret i32 [[A]] ; %C = icmp ne i32 %a, %b %V = select i1 %C, i32 %a, i32 %b @@ -305,8 +335,9 @@ define i32 @test13a(i32 %a, i32 %b) { } define i32 @test13b(i32 %a, i32 %b) { -; CHECK-LABEL: @test13b( -; CHECK-NEXT: ret i32 [[A:%.*]] +; CHECK-LABEL: define i32 @test13b( +; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: ret i32 [[A]] ; %C = icmp eq i32 %a, %b %V = select i1 %C, i32 %b, i32 %a @@ -314,9 +345,10 @@ define i32 @test13b(i32 %a, i32 %b) { } define i1 @test14a(i1 %C, i32 %X) { -; CHECK-LABEL: @test14a( -; CHECK-NEXT: [[R1:%.*]] = icmp slt i32 [[X:%.*]], 1 -; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true +; CHECK-LABEL: define i1 @test14a( +; CHECK-SAME: i1 [[C:%.*]], i32 [[X:%.*]]) { +; CHECK-NEXT: [[R1:%.*]] = icmp slt i32 [[X]], 1 +; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true ; CHECK-NEXT: [[R:%.*]] = select i1 [[NOT_C]], i1 true, i1 [[R1]] ; CHECK-NEXT: ret i1 [[R]] ; @@ -327,9 +359,10 @@ define i1 @test14a(i1 %C, i32 %X) { } define i1 @test14b(i1 %C, i32 %X) { -; CHECK-LABEL: @test14b( -; CHECK-NEXT: [[R1:%.*]] = icmp slt i32 [[X:%.*]], 1 -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[R1]] +; CHECK-LABEL: define i1 @test14b( +; CHECK-SAME: i1 [[C:%.*]], i32 [[X:%.*]]) { +; CHECK-NEXT: [[R1:%.*]] = icmp slt i32 [[X]], 1 +; CHECK-NEXT: [[R:%.*]] = select i1 [[C]], i1 true, i1 [[R1]] ; CHECK-NEXT: ret i1 [[R]] ; %V = select i1 %C, i32 0, i32 %X @@ -339,8 +372,9 @@ define i1 @test14b(i1 %C, i32 %X) { } define i32 @test16(i1 %C, ptr %P) { -; CHECK-LABEL: @test16( -; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P:%.*]], align 4 +; CHECK-LABEL: define i32 @test16( +; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; %P2 = select i1 %C, ptr %P, ptr null @@ -350,8 +384,9 @@ define i32 @test16(i1 %C, ptr %P) { ;; It may be legal to load from a null address in a non-zero address space define i32 @test16_neg(i1 %C, ptr addrspace(1) %P) { -; CHECK-LABEL: @test16_neg( -; CHECK-NEXT: [[P2:%.*]] = select i1 [[C:%.*]], ptr addrspace(1) [[P:%.*]], ptr addrspace(1) null +; CHECK-LABEL: define i32 @test16_neg( +; CHECK-SAME: i1 [[C:%.*]], ptr addrspace(1) [[P:%.*]]) { +; CHECK-NEXT: [[P2:%.*]] = select i1 [[C]], ptr addrspace(1) [[P]], ptr addrspace(1) null ; CHECK-NEXT: [[V:%.*]] = load i32, ptr addrspace(1) [[P2]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -361,8 +396,9 @@ define i32 @test16_neg(i1 %C, ptr addrspace(1) %P) { } define i32 @test16_neg2(i1 %C, ptr addrspace(1) %P) { -; CHECK-LABEL: @test16_neg2( -; CHECK-NEXT: [[P2:%.*]] = select i1 [[C:%.*]], ptr addrspace(1) null, ptr addrspace(1) [[P:%.*]] +; CHECK-LABEL: define i32 @test16_neg2( +; CHECK-SAME: i1 [[C:%.*]], ptr addrspace(1) [[P:%.*]]) { +; CHECK-NEXT: [[P2:%.*]] = select i1 [[C]], ptr addrspace(1) null, ptr addrspace(1) [[P]] ; CHECK-NEXT: [[V:%.*]] = load i32, ptr addrspace(1) [[P2]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -373,8 +409,9 @@ define i32 @test16_neg2(i1 %C, ptr addrspace(1) %P) { ;; It may be legal to load from a null address with null pointer valid attribute. define i32 @test16_no_null_opt(i1 %C, ptr %P) #0 { -; CHECK-LABEL: @test16_no_null_opt( -; CHECK-NEXT: [[P2:%.*]] = select i1 [[C:%.*]], ptr [[P:%.*]], ptr null +; CHECK-LABEL: define i32 @test16_no_null_opt( +; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: [[P2:%.*]] = select i1 [[C]], ptr [[P]], ptr null ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P2]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -384,8 +421,9 @@ define i32 @test16_no_null_opt(i1 %C, ptr %P) #0 { } define i32 @test16_no_null_opt_2(i1 %C, ptr %P) #0 { -; CHECK-LABEL: @test16_no_null_opt_2( -; CHECK-NEXT: [[P2:%.*]] = select i1 [[C:%.*]], ptr null, ptr [[P:%.*]] +; CHECK-LABEL: define i32 @test16_no_null_opt_2( +; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) #[[ATTR0]] { +; CHECK-NEXT: [[P2:%.*]] = select i1 [[C]], ptr null, ptr [[P]] ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P2]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -397,9 +435,10 @@ define i32 @test16_no_null_opt_2(i1 %C, ptr %P) #0 { attributes #0 = { null_pointer_is_valid } define i1 @test17(ptr %X, i1 %C) { -; CHECK-LABEL: @test17( -; CHECK-NEXT: [[RV1:%.*]] = icmp eq ptr [[X:%.*]], null -; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true +; CHECK-LABEL: define i1 @test17( +; CHECK-SAME: ptr [[X:%.*]], i1 [[C:%.*]]) { +; CHECK-NEXT: [[RV1:%.*]] = icmp eq ptr [[X]], null +; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true ; CHECK-NEXT: [[RV:%.*]] = select i1 [[NOT_C]], i1 true, i1 [[RV1]] ; CHECK-NEXT: ret i1 [[RV]] ; @@ -409,8 +448,9 @@ define i1 @test17(ptr %X, i1 %C) { } define i32 @test18(i32 %X, i32 %Y, i1 %C) { -; CHECK-LABEL: @test18( -; CHECK-NEXT: [[V:%.*]] = sdiv i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @test18( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i1 [[C:%.*]]) { +; CHECK-NEXT: [[V:%.*]] = sdiv i32 [[Y]], [[X]] ; CHECK-NEXT: ret i32 [[V]] ; %R = select i1 %C, i32 %X, i32 0 @@ -419,8 +459,9 @@ define i32 @test18(i32 %X, i32 %Y, i1 %C) { } define i32 @test19(i32 %x) { -; CHECK-LABEL: @test19( -; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X:%.*]], 31 +; CHECK-LABEL: define i32 @test19( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X]], 31 ; CHECK-NEXT: ret i32 [[X_LOBIT]] ; %t = icmp ugt i32 %x, 2147483647 @@ -429,8 +470,9 @@ define i32 @test19(i32 %x) { } define i32 @test20(i32 %x) { -; CHECK-LABEL: @test20( -; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X:%.*]], 31 +; CHECK-LABEL: define i32 @test20( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X]], 31 ; CHECK-NEXT: ret i32 [[X_LOBIT]] ; %t = icmp slt i32 %x, 0 @@ -439,8 +481,9 @@ define i32 @test20(i32 %x) { } define i64 @test21(i32 %x) { -; CHECK-LABEL: @test21( -; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X:%.*]], 31 +; CHECK-LABEL: define i64 @test21( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X]], 31 ; CHECK-NEXT: [[RETVAL:%.*]] = sext i32 [[X_LOBIT]] to i64 ; CHECK-NEXT: ret i64 [[RETVAL]] ; @@ -450,8 +493,9 @@ define i64 @test21(i32 %x) { } define i16 @test22(i32 %x) { -; CHECK-LABEL: @test22( -; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X:%.*]], 31 +; CHECK-LABEL: define i16 @test22( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i32 [[X]], 31 ; CHECK-NEXT: [[RETVAL:%.*]] = trunc nsw i32 [[X_LOBIT]] to i16 ; CHECK-NEXT: ret i16 [[RETVAL]] ; @@ -461,13 +505,14 @@ define i16 @test22(i32 %x) { } define i32 @test25(i1 %c) { -; CHECK-LABEL: @test25( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C:%.*]], label [[JUMP:%.*]], label [[RET:%.*]] -; CHECK: jump: -; CHECK-NEXT: br label [[RET]] -; CHECK: ret: -; CHECK-NEXT: [[B:%.*]] = phi i32 [ 10, [[JUMP]] ], [ 20, [[ENTRY:%.*]] ] +; CHECK-LABEL: define i32 @test25( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[C]], label %[[JUMP:.*]], label %[[RET:.*]] +; CHECK: [[JUMP]]: +; CHECK-NEXT: br label %[[RET]] +; CHECK: [[RET]]: +; CHECK-NEXT: [[B:%.*]] = phi i32 [ 10, %[[JUMP]] ], [ 20, %[[ENTRY]] ] ; CHECK-NEXT: ret i32 [[B]] ; entry: @@ -481,13 +526,14 @@ ret: } define i32 @test26(i1 %cond) { -; CHECK-LABEL: @test26( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[JUMP:%.*]], label [[RET:%.*]] -; CHECK: jump: -; CHECK-NEXT: br label [[RET]] -; CHECK: ret: -; CHECK-NEXT: [[B:%.*]] = phi i32 [ 20, [[ENTRY:%.*]] ], [ 10, [[JUMP]] ] +; CHECK-LABEL: define i32 @test26( +; CHECK-SAME: i1 [[COND:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[COND]], label %[[JUMP:.*]], label %[[RET:.*]] +; CHECK: [[JUMP]]: +; CHECK-NEXT: br label %[[RET]] +; CHECK: [[RET]]: +; CHECK-NEXT: [[B:%.*]] = phi i32 [ 20, %[[ENTRY]] ], [ 10, %[[JUMP]] ] ; CHECK-NEXT: ret i32 [[B]] ; entry: @@ -502,13 +548,14 @@ ret: } define i32 @test26_logical(i1 %cond) { -; CHECK-LABEL: @test26_logical( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[JUMP:%.*]], label [[RET:%.*]] -; CHECK: jump: -; CHECK-NEXT: br label [[RET]] -; CHECK: ret: -; CHECK-NEXT: [[B:%.*]] = phi i32 [ 20, [[ENTRY:%.*]] ], [ 10, [[JUMP]] ] +; CHECK-LABEL: define i32 @test26_logical( +; CHECK-SAME: i1 [[COND:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[COND]], label %[[JUMP:.*]], label %[[RET:.*]] +; CHECK: [[JUMP]]: +; CHECK-NEXT: br label %[[RET]] +; CHECK: [[RET]]: +; CHECK-NEXT: [[B:%.*]] = phi i32 [ 20, %[[ENTRY]] ], [ 10, %[[JUMP]] ] ; CHECK-NEXT: ret i32 [[B]] ; entry: @@ -523,13 +570,14 @@ ret: } define i32 @test27(i1 %c, i32 %A, i32 %B) { -; CHECK-LABEL: @test27( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C:%.*]], label [[JUMP:%.*]], label [[RET:%.*]] -; CHECK: jump: -; CHECK-NEXT: br label [[RET]] -; CHECK: ret: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[A:%.*]], [[JUMP]] ], [ [[B:%.*]], [[ENTRY:%.*]] ] +; CHECK-LABEL: define i32 @test27( +; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[C]], label %[[JUMP:.*]], label %[[RET:.*]] +; CHECK: [[JUMP]]: +; CHECK-NEXT: br label %[[RET]] +; CHECK: [[RET]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[A]], %[[JUMP]] ], [ [[B]], %[[ENTRY]] ] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -543,13 +591,14 @@ ret: } define i32 @test28(i1 %cond, i32 %A, i32 %B) { -; CHECK-LABEL: @test28( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[JUMP:%.*]], label [[RET:%.*]] -; CHECK: jump: -; CHECK-NEXT: br label [[RET]] -; CHECK: ret: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[A:%.*]], [[JUMP]] ], [ [[B:%.*]], [[ENTRY:%.*]] ] +; CHECK-LABEL: define i32 @test28( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[COND]], label %[[JUMP:.*]], label %[[RET:.*]] +; CHECK: [[JUMP]]: +; CHECK-NEXT: br label %[[RET]] +; CHECK: [[RET]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[A]], %[[JUMP]] ], [ [[B]], %[[ENTRY]] ] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -564,15 +613,16 @@ ret: } define i32 @test29(i1 %cond, i32 %A, i32 %B) { -; CHECK-LABEL: @test29( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[JUMP:%.*]], label [[RET:%.*]] -; CHECK: jump: -; CHECK-NEXT: br label [[RET]] -; CHECK: ret: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[A:%.*]], [[JUMP]] ], [ [[B:%.*]], [[ENTRY:%.*]] ] -; CHECK-NEXT: br label [[NEXT:%.*]] -; CHECK: next: +; CHECK-LABEL: define i32 @test29( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[COND]], label %[[JUMP:.*]], label %[[RET:.*]] +; CHECK: [[JUMP]]: +; CHECK-NEXT: br label %[[RET]] +; CHECK: [[RET]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[A]], %[[JUMP]] ], [ [[B]], %[[ENTRY]] ] +; CHECK-NEXT: br label %[[NEXT:.*]] +; CHECK: [[NEXT]]: ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -591,8 +641,9 @@ next: ; SMAX(SMAX(x, y), x) -> SMAX(x, y) define i32 @test30(i32 %x, i32 %y) { -; CHECK-LABEL: @test30( -; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) +; CHECK-LABEL: define i32 @test30( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 [[Y]]) ; CHECK-NEXT: ret i32 [[COND]] ; %cmp = icmp sgt i32 %x, %y @@ -604,8 +655,9 @@ define i32 @test30(i32 %x, i32 %y) { ; UMAX(UMAX(x, y), x) -> UMAX(x, y) define i32 @test31(i32 %x, i32 %y) { -; CHECK-LABEL: @test31( -; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.umax.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) +; CHECK-LABEL: define i32 @test31( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 [[Y]]) ; CHECK-NEXT: ret i32 [[COND]] ; %cmp = icmp ugt i32 %x, %y @@ -617,8 +669,9 @@ define i32 @test31(i32 %x, i32 %y) { ; SMIN(SMIN(x, y), x) -> SMIN(x, y) define i32 @test32(i32 %x, i32 %y) { -; CHECK-LABEL: @test32( -; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) +; CHECK-LABEL: define i32 @test32( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y]]) ; CHECK-NEXT: ret i32 [[COND]] ; %cmp = icmp sgt i32 %x, %y @@ -630,8 +683,9 @@ define i32 @test32(i32 %x, i32 %y) { ; MAX(MIN(x, y), x) -> x define i32 @test33(i32 %x, i32 %y) { -; CHECK-LABEL: @test33( -; CHECK-NEXT: ret i32 [[X:%.*]] +; CHECK-LABEL: define i32 @test33( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: ret i32 [[X]] ; %cmp = icmp sgt i32 %x, %y %cond = select i1 %cmp, i32 %y, i32 %x @@ -642,8 +696,9 @@ define i32 @test33(i32 %x, i32 %y) { ; MIN(MAX(x, y), x) -> x define i32 @test34(i32 %x, i32 %y) { -; CHECK-LABEL: @test34( -; CHECK-NEXT: ret i32 [[X:%.*]] +; CHECK-LABEL: define i32 @test34( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: ret i32 [[X]] ; %cmp = icmp sgt i32 %x, %y %cond = select i1 %cmp, i32 %x, i32 %y @@ -653,7 +708,8 @@ define i32 @test34(i32 %x, i32 %y) { } define i1 @test38(i1 %cond) { -; CHECK-LABEL: @test38( +; CHECK-LABEL: define i1 @test38( +; CHECK-SAME: i1 [[COND:%.*]]) { ; CHECK-NEXT: ret i1 false ; %zero = alloca i32 @@ -664,7 +720,8 @@ define i1 @test38(i1 %cond) { } define i1 @test39(i1 %cond, double %x) { -; CHECK-LABEL: @test39( +; CHECK-LABEL: define i1 @test39( +; CHECK-SAME: i1 [[COND:%.*]], double [[X:%.*]]) { ; CHECK-NEXT: ret i1 true ; %s = select i1 %cond, double %x, double 0x7FF0000000000000 ; RHS = +infty @@ -673,7 +730,8 @@ define i1 @test39(i1 %cond, double %x) { } define i1 @test40(i1 %cond) { -; CHECK-LABEL: @test40( +; CHECK-LABEL: define i1 @test40( +; CHECK-SAME: i1 [[COND:%.*]]) { ; CHECK-NEXT: ret i1 false ; %a = alloca i32 @@ -685,8 +743,9 @@ define i1 @test40(i1 %cond) { } define i32 @test41(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @test41( -; CHECK-NEXT: [[R:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @test41( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: ret i32 [[R]] ; %z = and i32 %x, %y @@ -696,10 +755,11 @@ define i32 @test41(i1 %cond, i32 %x, i32 %y) { } define i32 @test42(i32 %x, i32 %y) { -; CHECK-LABEL: @test42( -; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X:%.*]], 0 +; CHECK-LABEL: define i32 @test42( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X]], 0 ; CHECK-NEXT: [[B:%.*]] = sext i1 [[COND]] to i32 -; CHECK-NEXT: [[C:%.*]] = add i32 [[Y:%.*]], [[B]] +; CHECK-NEXT: [[C:%.*]] = add i32 [[Y]], [[B]] ; CHECK-NEXT: ret i32 [[C]] ; %b = add i32 %y, -1 @@ -709,10 +769,11 @@ define i32 @test42(i32 %x, i32 %y) { } define <2 x i32> @test42vec(<2 x i32> %x, <2 x i32> %y) { -; CHECK-LABEL: @test42vec( -; CHECK-NEXT: [[COND:%.*]] = icmp eq <2 x i32> [[X:%.*]], zeroinitializer +; CHECK-LABEL: define <2 x i32> @test42vec( +; CHECK-SAME: <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]]) { +; CHECK-NEXT: [[COND:%.*]] = icmp eq <2 x i32> [[X]], zeroinitializer ; CHECK-NEXT: [[B:%.*]] = sext <2 x i1> [[COND]] to <2 x i32> -; CHECK-NEXT: [[C:%.*]] = add <2 x i32> [[Y:%.*]], [[B]] +; CHECK-NEXT: [[C:%.*]] = add <2 x i32> [[Y]], [[B]] ; CHECK-NEXT: ret <2 x i32> [[C]] ; %b = add <2 x i32> %y, <i32 -1, i32 -1> @@ -726,8 +787,9 @@ define <2 x i32> @test42vec(<2 x i32> %x, <2 x i32> %y) { ; This select instruction can't be eliminated because trying to do so would ; change the number of vector elements. This used to assert. define i48 @test51(<3 x i1> %icmp, <3 x i16> %t) { -; CHECK-LABEL: @test51( -; CHECK-NEXT: [[SELECT:%.*]] = select <3 x i1> [[ICMP:%.*]], <3 x i16> zeroinitializer, <3 x i16> [[T:%.*]] +; CHECK-LABEL: define i48 @test51( +; CHECK-SAME: <3 x i1> [[ICMP:%.*]], <3 x i16> [[T:%.*]]) { +; CHECK-NEXT: [[SELECT:%.*]] = select <3 x i1> [[ICMP]], <3 x i16> zeroinitializer, <3 x i16> [[T]] ; CHECK-NEXT: [[T2:%.*]] = bitcast <3 x i16> [[SELECT]] to i48 ; CHECK-NEXT: ret i48 [[T2]] ; @@ -737,9 +799,10 @@ define i48 @test51(<3 x i1> %icmp, <3 x i16> %t) { } define <vscale x 4 x float> @bitcast_select_bitcast(<vscale x 4 x i1> %icmp, <vscale x 4 x i32> %a, <vscale x 4 x float> %b) { -; CHECK-LABEL: @bitcast_select_bitcast( -; CHECK-NEXT: [[TMP1:%.*]] = bitcast <vscale x 4 x i32> [[A:%.*]] to <vscale x 4 x float> -; CHECK-NEXT: [[BC2:%.*]] = select <vscale x 4 x i1> [[ICMP:%.*]], <vscale x 4 x float> [[B:%.*]], <vscale x 4 x float> [[TMP1]] +; CHECK-LABEL: define <vscale x 4 x float> @bitcast_select_bitcast( +; CHECK-SAME: <vscale x 4 x i1> [[ICMP:%.*]], <vscale x 4 x i32> [[A:%.*]], <vscale x 4 x float> [[B:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = bitcast <vscale x 4 x i32> [[A]] to <vscale x 4 x float> +; CHECK-NEXT: [[BC2:%.*]] = select <vscale x 4 x i1> [[ICMP]], <vscale x 4 x float> [[B]], <vscale x 4 x float> [[TMP1]] ; CHECK-NEXT: ret <vscale x 4 x float> [[BC2]] ; %bc1 = bitcast <vscale x 4 x float> %b to <vscale x 4 x i32> @@ -749,10 +812,11 @@ define <vscale x 4 x float> @bitcast_select_bitcast(<vscale x 4 x i1> %icmp, <vs } define void @select_oneuse_bitcast(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i32> %c, <vscale x 4 x i32> %d, ptr %ptr1) { -; CHECK-LABEL: @select_oneuse_bitcast( -; CHECK-NEXT: [[CMP:%.*]] = icmp ult <vscale x 4 x i32> [[C:%.*]], [[D:%.*]] -; CHECK-NEXT: [[SEL1_V:%.*]] = select <vscale x 4 x i1> [[CMP]], <vscale x 4 x float> [[A:%.*]], <vscale x 4 x float> [[B:%.*]] -; CHECK-NEXT: store <vscale x 4 x float> [[SEL1_V]], ptr [[PTR1:%.*]], align 16 +; CHECK-LABEL: define void @select_oneuse_bitcast( +; CHECK-SAME: <vscale x 4 x float> [[A:%.*]], <vscale x 4 x float> [[B:%.*]], <vscale x 4 x i32> [[C:%.*]], <vscale x 4 x i32> [[D:%.*]], ptr [[PTR1:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <vscale x 4 x i32> [[C]], [[D]] +; CHECK-NEXT: [[SEL1_V:%.*]] = select <vscale x 4 x i1> [[CMP]], <vscale x 4 x float> [[A]], <vscale x 4 x float> [[B]] +; CHECK-NEXT: store <vscale x 4 x float> [[SEL1_V]], ptr [[PTR1]], align 16 ; CHECK-NEXT: ret void ; %cmp = icmp ult <vscale x 4 x i32> %c, %d @@ -767,12 +831,13 @@ define void @select_oneuse_bitcast(<vscale x 4 x float> %a, <vscale x 4 x float> ; Hoisting the selects allows later pattern matching to see that these are min/max ops. define void @min_max_bitcast(<4 x float> %a, <4 x float> %b, ptr %ptr1, ptr %ptr2) { -; CHECK-LABEL: @min_max_bitcast( -; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> [[A:%.*]], [[B:%.*]] +; CHECK-LABEL: define void @min_max_bitcast( +; CHECK-SAME: <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], ptr [[PTR1:%.*]], ptr [[PTR2:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> [[A]], [[B]] ; CHECK-NEXT: [[SEL1_V:%.*]] = select <4 x i1> [[CMP]], <4 x float> [[A]], <4 x float> [[B]] ; CHECK-NEXT: [[SEL2_V:%.*]] = select <4 x i1> [[CMP]], <4 x float> [[B]], <4 x float> [[A]] -; CHECK-NEXT: store <4 x float> [[SEL1_V]], ptr [[PTR1:%.*]], align 16 -; CHECK-NEXT: store <4 x float> [[SEL2_V]], ptr [[PTR2:%.*]], align 16 +; CHECK-NEXT: store <4 x float> [[SEL1_V]], ptr [[PTR1]], align 16 +; CHECK-NEXT: store <4 x float> [[SEL2_V]], ptr [[PTR2]], align 16 ; CHECK-NEXT: ret void ; %cmp = fcmp olt <4 x float> %a, %b @@ -786,12 +851,13 @@ define void @min_max_bitcast(<4 x float> %a, <4 x float> %b, ptr %ptr1, ptr %ptr } define void @min_max_bitcast1(<vscale x 4 x float> %a, <vscale x 4 x float> %b, ptr %ptr1, ptr %ptr2) { -; CHECK-LABEL: @min_max_bitcast1( -; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <vscale x 4 x float> [[A:%.*]], [[B:%.*]] +; CHECK-LABEL: define void @min_max_bitcast1( +; CHECK-SAME: <vscale x 4 x float> [[A:%.*]], <vscale x 4 x float> [[B:%.*]], ptr [[PTR1:%.*]], ptr [[PTR2:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <vscale x 4 x float> [[A]], [[B]] ; CHECK-NEXT: [[SEL1_V:%.*]] = select <vscale x 4 x i1> [[CMP]], <vscale x 4 x float> [[A]], <vscale x 4 x float> [[B]] ; CHECK-NEXT: [[SEL2_V:%.*]] = select <vscale x 4 x i1> [[CMP]], <vscale x 4 x float> [[B]], <vscale x 4 x float> [[A]] -; CHECK-NEXT: store <vscale x 4 x float> [[SEL1_V]], ptr [[PTR1:%.*]], align 16 -; CHECK-NEXT: store <vscale x 4 x float> [[SEL2_V]], ptr [[PTR2:%.*]], align 16 +; CHECK-NEXT: store <vscale x 4 x float> [[SEL1_V]], ptr [[PTR1]], align 16 +; CHECK-NEXT: store <vscale x 4 x float> [[SEL2_V]], ptr [[PTR2]], align 16 ; CHECK-NEXT: ret void ; %cmp = fcmp olt <vscale x 4 x float> %a, %b @@ -807,14 +873,15 @@ define void @min_max_bitcast1(<vscale x 4 x float> %a, <vscale x 4 x float> %b, ; To avoid potential backend problems, we don't do the same transform for other casts. define void @truncs_before_selects(<4 x float> %f1, <4 x float> %f2, <4 x i64> %a, <4 x i64> %b, ptr %ptr1, ptr %ptr2) { -; CHECK-LABEL: @truncs_before_selects( -; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> [[F1:%.*]], [[F2:%.*]] -; CHECK-NEXT: [[BC1:%.*]] = trunc <4 x i64> [[A:%.*]] to <4 x i32> -; CHECK-NEXT: [[BC2:%.*]] = trunc <4 x i64> [[B:%.*]] to <4 x i32> +; CHECK-LABEL: define void @truncs_before_selects( +; CHECK-SAME: <4 x float> [[F1:%.*]], <4 x float> [[F2:%.*]], <4 x i64> [[A:%.*]], <4 x i64> [[B:%.*]], ptr [[PTR1:%.*]], ptr [[PTR2:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> [[F1]], [[F2]] +; CHECK-NEXT: [[BC1:%.*]] = trunc <4 x i64> [[A]] to <4 x i32> +; CHECK-NEXT: [[BC2:%.*]] = trunc <4 x i64> [[B]] to <4 x i32> ; CHECK-NEXT: [[SEL1:%.*]] = select <4 x i1> [[CMP]], <4 x i32> [[BC1]], <4 x i32> [[BC2]] ; CHECK-NEXT: [[SEL2:%.*]] = select <4 x i1> [[CMP]], <4 x i32> [[BC2]], <4 x i32> [[BC1]] -; CHECK-NEXT: store <4 x i32> [[SEL1]], ptr [[PTR1:%.*]], align 16 -; CHECK-NEXT: store <4 x i32> [[SEL2]], ptr [[PTR2:%.*]], align 16 +; CHECK-NEXT: store <4 x i32> [[SEL1]], ptr [[PTR1]], align 16 +; CHECK-NEXT: store <4 x i32> [[SEL2]], ptr [[PTR2]], align 16 ; CHECK-NEXT: ret void ; %cmp = fcmp olt <4 x float> %f1, %f2 @@ -830,8 +897,9 @@ define void @truncs_before_selects(<4 x float> %f1, <4 x float> %f2, <4 x i64> % ; PR8575 define i32 @test52(i32 %n, i32 %m) { -; CHECK-LABEL: @test52( -; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], [[M:%.*]] +; CHECK-LABEL: define i32 @test52( +; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N]], [[M]] ; CHECK-NEXT: [[STOREMERGE:%.*]] = select i1 [[CMP]], i32 1, i32 6 ; CHECK-NEXT: ret i32 [[STOREMERGE]] ; @@ -845,8 +913,9 @@ define i32 @test52(i32 %n, i32 %m) { ; PR9454 define i32 @test53(i32 %x) { -; CHECK-LABEL: @test53( -; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -3 +; CHECK-LABEL: define i32 @test53( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X]], -3 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1]], 0 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 2, i32 1 ; CHECK-NEXT: ret i32 [[SEL]] @@ -858,8 +927,9 @@ define i32 @test53(i32 %x) { } define i32 @test54(i32 %X, i32 %Y) { -; CHECK-LABEL: @test54( -; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[X:%.*]], 0 +; CHECK-LABEL: define i32 @test54( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[X]], 0 ; CHECK-NEXT: [[C:%.*]] = zext i1 [[B]] to i32 ; CHECK-NEXT: ret i32 [[C]] ; @@ -870,8 +940,9 @@ define i32 @test54(i32 %X, i32 %Y) { } define i1 @test55(i1 %X, i32 %Y, i32 %Z) { -; CHECK-LABEL: @test55( -; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[Y:%.*]], 0 +; CHECK-LABEL: define i1 @test55( +; CHECK-SAME: i1 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[Y]], 0 ; CHECK-NEXT: ret i1 [[C]] ; %A = ashr exact i32 %Y, %Z @@ -881,8 +952,9 @@ define i1 @test55(i1 %X, i32 %Y, i32 %Z) { } define i32 @test56(i16 %x) { -; CHECK-LABEL: @test56( -; CHECK-NEXT: [[CONV:%.*]] = zext i16 [[X:%.*]] to i32 +; CHECK-LABEL: define i32 @test56( +; CHECK-SAME: i16 [[X:%.*]]) { +; CHECK-NEXT: [[CONV:%.*]] = zext i16 [[X]] to i32 ; CHECK-NEXT: ret i32 [[CONV]] ; %tobool = icmp eq i16 %x, 0 @@ -892,9 +964,10 @@ define i32 @test56(i16 %x) { } define i32 @test57(i32 %x, i32 %y) { -; CHECK-LABEL: @test57( -; CHECK-NEXT: [[Y:%.*]] = freeze i32 [[Y1:%.*]] -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]] +; CHECK-LABEL: define i32 @test57( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y_FR]] ; CHECK-NEXT: ret i32 [[AND]] ; %and = and i32 %x, %y @@ -904,8 +977,9 @@ define i32 @test57(i32 %x, i32 %y) { } define i32 @test58(i16 %x) { -; CHECK-LABEL: @test58( -; CHECK-NEXT: [[CONV:%.*]] = zext i16 [[X:%.*]] to i32 +; CHECK-LABEL: define i32 @test58( +; CHECK-SAME: i16 [[X:%.*]]) { +; CHECK-NEXT: [[CONV:%.*]] = zext i16 [[X]] to i32 ; CHECK-NEXT: ret i32 [[CONV]] ; %tobool = icmp ne i16 %x, 1 @@ -915,8 +989,9 @@ define i32 @test58(i16 %x) { } define i32 @test59(i32 %x, i32 %y) { -; CHECK-LABEL: @test59( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @test59( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[AND]] ; %and = and i32 %x, %y @@ -926,9 +1001,10 @@ define i32 @test59(i32 %x, i32 %y) { } define i1 @test60(i32 %x, ptr %y) { -; CHECK-LABEL: @test60( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0 -; CHECK-NEXT: [[LOAD:%.*]] = load i1, ptr [[Y:%.*]], align 1 +; CHECK-LABEL: define i1 @test60( +; CHECK-SAME: i32 [[X:%.*]], ptr [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT: [[LOAD:%.*]] = load i1, ptr [[Y]], align 1 ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[X]], 1 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i1 [[LOAD]], i1 [[CMP1]] ; CHECK-NEXT: ret i1 [[SEL]] @@ -942,7 +1018,8 @@ define i1 @test60(i32 %x, ptr %y) { @glbl = constant i32 10 define i32 @test61(ptr %ptr) { -; CHECK-LABEL: @test61( +; CHECK-LABEL: define i32 @test61( +; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: ret i32 10 ; %A = load i32, ptr %ptr @@ -953,19 +1030,20 @@ define i32 @test61(ptr %ptr) { ; PR14131 define void @test64(i32 %p, i16 %b, i1 %c1) noreturn { -; CHECK-LABEL: @test64( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOR_RHS:%.*]], label [[LOR_END:%.*]] -; CHECK: lor.rhs: -; CHECK-NEXT: br label [[LOR_END]] -; CHECK: lor.end: -; CHECK-NEXT: br i1 poison, label [[COND_END17:%.*]], label [[COND_FALSE16:%.*]] -; CHECK: cond.false16: -; CHECK-NEXT: br label [[COND_END17]] -; CHECK: cond.end17: -; CHECK-NEXT: br label [[WHILE_BODY:%.*]] -; CHECK: while.body: -; CHECK-NEXT: br label [[WHILE_BODY]] +; CHECK-LABEL: define void @test64( +; CHECK-SAME: i32 [[P:%.*]], i16 [[B:%.*]], i1 [[C1:%.*]]) #[[ATTR1:[0-9]+]] { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[C1]], label %[[LOR_RHS:.*]], label %[[LOR_END:.*]] +; CHECK: [[LOR_RHS]]: +; CHECK-NEXT: br label %[[LOR_END]] +; CHECK: [[LOR_END]]: +; CHECK-NEXT: br i1 poison, label %[[COND_END17:.*]], label %[[COND_FALSE16:.*]] +; CHECK: [[COND_FALSE16]]: +; CHECK-NEXT: br label %[[COND_END17]] +; CHECK: [[COND_END17]]: +; CHECK-NEXT: br label %[[WHILE_BODY:.*]] +; CHECK: [[WHILE_BODY]]: +; CHECK-NEXT: br label %[[WHILE_BODY]] ; entry: %p.addr.0.insert.mask = and i32 %p, -65536 @@ -1003,9 +1081,10 @@ while.body: ; select is trivially dereferenceable but may have a lower alignment than the ; load does. define i32 @test76(i1 %flag, ptr %x) { -; CHECK-LABEL: @test76( -; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4 -; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG:%.*]], ptr @under_aligned, ptr [[X]] +; CHECK-LABEL: define i32 @test76( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr [[X:%.*]]) { +; CHECK-NEXT: store i32 0, ptr [[X]], align 4 +; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG]], ptr @under_aligned, ptr [[X]] ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -1022,11 +1101,12 @@ declare void @scribble_on_i32(ptr) ; load does. define i32 @test77(i1 %flag, ptr %x) { -; CHECK-LABEL: @test77( +; CHECK-LABEL: define i32 @test77( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr [[X:%.*]]) { ; CHECK-NEXT: [[UNDER_ALIGNED:%.*]] = alloca i32, align 1 ; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[UNDER_ALIGNED]]) -; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4 -; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG:%.*]], ptr [[UNDER_ALIGNED]], ptr [[X]] +; CHECK-NEXT: store i32 0, ptr [[X]], align 4 +; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG]], ptr [[UNDER_ALIGNED]], ptr [[X]] ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -1041,14 +1121,15 @@ define i32 @test77(i1 %flag, ptr %x) { define i32 @test78(i1 %flag, ptr %x, ptr %y, ptr %z) { ; Test that we can speculate the loads around the select even when we can't ; fold the load completely away. -; CHECK-LABEL: @test78( -; CHECK-NEXT: entry: -; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4 -; CHECK-NEXT: store i32 0, ptr [[Y:%.*]], align 4 -; CHECK-NEXT: store i32 42, ptr [[Z:%.*]], align 4 +; CHECK-LABEL: define i32 @test78( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]], ptr [[Z:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: store i32 0, ptr [[X]], align 4 +; CHECK-NEXT: store i32 0, ptr [[Y]], align 4 +; CHECK-NEXT: store i32 42, ptr [[Z]], align 4 ; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X]], align 4 ; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y]], align 4 -; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], i32 [[X_VAL]], i32 [[Y_VAL]] +; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG]], i32 [[X_VAL]], i32 [[Y_VAL]] ; CHECK-NEXT: ret i32 [[V]] ; entry: @@ -1064,10 +1145,11 @@ entry: ; Test that we can speculate the loads around the select even when we can't ; fold the load completely away. define i32 @test78_deref(i1 %flag, ptr dereferenceable(4) align 4 %x, ptr dereferenceable(4) align 4 %y, ptr %z) nofree nosync { -; CHECK-LABEL: @test78_deref( -; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X:%.*]], align 4 -; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y:%.*]], align 4 -; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], i32 [[X_VAL]], i32 [[Y_VAL]] +; CHECK-LABEL: define i32 @test78_deref( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr align 4 dereferenceable(4) [[X:%.*]], ptr align 4 dereferenceable(4) [[Y:%.*]], ptr [[Z:%.*]]) #[[ATTR2:[0-9]+]] { +; CHECK-NEXT: [[X_VAL:%.*]] = load i32, ptr [[X]], align 4 +; CHECK-NEXT: [[Y_VAL:%.*]] = load i32, ptr [[Y]], align 4 +; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG]], i32 [[X_VAL]], i32 [[Y_VAL]] ; CHECK-NEXT: ret i32 [[V]] ; %p = select i1 %flag, ptr %x, ptr %y @@ -1078,11 +1160,12 @@ define i32 @test78_deref(i1 %flag, ptr dereferenceable(4) align 4 %x, ptr derefe ; The same as @test78 but we can't speculate the load because it can trap ; if under-aligned. define i32 @test78_neg(i1 %flag, ptr %x, ptr %y, ptr %z) { -; CHECK-LABEL: @test78_neg( -; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4 -; CHECK-NEXT: store i32 0, ptr [[Y:%.*]], align 4 -; CHECK-NEXT: store i32 42, ptr [[Z:%.*]], align 4 -; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG:%.*]], ptr [[X]], ptr [[Y]] +; CHECK-LABEL: define i32 @test78_neg( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]], ptr [[Z:%.*]]) { +; CHECK-NEXT: store i32 0, ptr [[X]], align 4 +; CHECK-NEXT: store i32 0, ptr [[Y]], align 4 +; CHECK-NEXT: store i32 42, ptr [[Z]], align 4 +; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG]], ptr [[X]], ptr [[Y]] ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 16 ; CHECK-NEXT: ret i32 [[V]] ; @@ -1098,8 +1181,9 @@ define i32 @test78_neg(i1 %flag, ptr %x, ptr %y, ptr %z) { ; The same as @test78_deref but we can't speculate the load because ; one of the arguments is not sufficiently dereferenceable. define i32 @test78_deref_neg(i1 %flag, ptr dereferenceable(2) %x, ptr dereferenceable(4) %y, ptr %z) nofree nosync { -; CHECK-LABEL: @test78_deref_neg( -; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]] +; CHECK-LABEL: define i32 @test78_deref_neg( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr dereferenceable(2) [[X:%.*]], ptr dereferenceable(4) [[Y:%.*]], ptr [[Z:%.*]]) #[[ATTR2]] { +; CHECK-NEXT: [[P:%.*]] = select i1 [[FLAG]], ptr [[X]], ptr [[Y]] ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 4 ; CHECK-NEXT: ret i32 [[V]] ; @@ -1111,13 +1195,14 @@ define i32 @test78_deref_neg(i1 %flag, ptr dereferenceable(2) %x, ptr dereferenc ; Test that we can speculate the loads around the select even when we can't ; fold the load completely away. define float @test79(i1 %flag, ptr %x, ptr %y, ptr %z) { -; CHECK-LABEL: @test79( -; CHECK-NEXT: store i32 0, ptr [[X:%.*]], align 4 -; CHECK-NEXT: store i32 0, ptr [[Y:%.*]], align 4 -; CHECK-NEXT: store i32 42, ptr [[Z:%.*]], align 4 +; CHECK-LABEL: define float @test79( +; CHECK-SAME: i1 [[FLAG:%.*]], ptr [[X:%.*]], ptr [[Y:%.*]], ptr [[Z:%.*]]) { +; CHECK-NEXT: store i32 0, ptr [[X]], align 4 +; CHECK-NEXT: store i32 0, ptr [[Y]], align 4 +; CHECK-NEXT: store i32 42, ptr [[Z]], align 4 ; CHECK-NEXT: [[X_VAL:%.*]] = load float, ptr [[X]], align 4 ; CHECK-NEXT: [[Y_VAL:%.*]] = load float, ptr [[Y]], align 4 -; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], float [[X_VAL]], float [[Y_VAL]] +; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG]], float [[X_VAL]], float [[Y_VAL]] ; CHECK-NEXT: ret float [[V]] ; store i32 0, ptr %x @@ -1132,7 +1217,8 @@ define float @test79(i1 %flag, ptr %x, ptr %y, ptr %z) { ; Test that when we speculate the loads around the select they fold throug ; load->load folding and load->store folding. define i32 @test80(i1 %flag) { -; CHECK-LABEL: @test80( +; CHECK-LABEL: define i32 @test80( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca i32, align 4 ; CHECK-NEXT: [[Y:%.*]] = alloca i32, align 4 ; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[X]]) @@ -1155,7 +1241,8 @@ define i32 @test80(i1 %flag) { ; Test that we can speculate the load around the select even though they use ; differently typed pointers. define float @test81(i1 %flag) { -; CHECK-LABEL: @test81( +; CHECK-LABEL: define float @test81( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca float, align 4 ; CHECK-NEXT: [[Y:%.*]] = alloca i32, align 4 ; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[X]]) @@ -1179,7 +1266,8 @@ define float @test81(i1 %flag) { ; Test that we can speculate the load around the select even though they use ; differently typed pointers. define i32 @test82(i1 %flag) { -; CHECK-LABEL: @test82( +; CHECK-LABEL: define i32 @test82( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca float, align 4 ; CHECK-NEXT: [[Y:%.*]] = alloca i32, align 4 ; CHECK-NEXT: call void @scribble_on_i32(ptr nonnull [[X]]) @@ -1206,7 +1294,8 @@ declare void @scribble_on_i128(ptr) ; Test that we can speculate the load around the select even though they use ; differently typed pointers and requires inttoptr casts. define ptr @test83(i1 %flag) { -; CHECK-LABEL: @test83( +; CHECK-LABEL: define ptr @test83( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca ptr, align 8 ; CHECK-NEXT: [[Y:%.*]] = alloca i64, align 8 ; CHECK-NEXT: call void @scribble_on_i64(ptr nonnull [[X]]) @@ -1230,7 +1319,8 @@ define ptr @test83(i1 %flag) { ; Test that we can speculate the load around the select even though they use ; differently typed pointers and requires a ptrtoint cast. define i64 @test84(i1 %flag) { -; CHECK-LABEL: @test84( +; CHECK-LABEL: define i64 @test84( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca ptr, align 8 ; CHECK-NEXT: [[Y:%.*]] = alloca i64, align 8 ; CHECK-NEXT: call void @scribble_on_i64(ptr nonnull [[X]]) @@ -1255,7 +1345,8 @@ define i64 @test84(i1 %flag) { ; pointer doesn't load all of the stored integer bits. We could fix this, but it ; would require endianness checks and other nastiness. define ptr @test85(i1 %flag) { -; CHECK-LABEL: @test85( +; CHECK-LABEL: define ptr @test85( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca [2 x ptr], align 8 ; CHECK-NEXT: [[Y:%.*]] = alloca i128, align 8 ; CHECK-NEXT: call void @scribble_on_i128(ptr nonnull [[X]]) @@ -1264,7 +1355,7 @@ define ptr @test85(i1 %flag) { ; CHECK-NEXT: store i128 [[T]], ptr [[Y]], align 4 ; CHECK-NEXT: [[X_VAL:%.*]] = load ptr, ptr [[X]], align 8 ; CHECK-NEXT: [[Y_VAL:%.*]] = load ptr, ptr [[Y]], align 8 -; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], ptr [[X_VAL]], ptr [[Y_VAL]] +; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG]], ptr [[X_VAL]], ptr [[Y_VAL]] ; CHECK-NEXT: ret ptr [[V]] ; %x = alloca [2 x ptr] @@ -1282,7 +1373,8 @@ define ptr @test85(i1 %flag) { ; is larger than the pointer size. The store of the pointer doesn't store to all ; the bits of the integer. define i128 @test86(i1 %flag) { -; CHECK-LABEL: @test86( +; CHECK-LABEL: define i128 @test86( +; CHECK-SAME: i1 [[FLAG:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = alloca [2 x ptr], align 8 ; CHECK-NEXT: [[Y:%.*]] = alloca i128, align 8 ; CHECK-NEXT: call void @scribble_on_i128(ptr nonnull [[X]]) @@ -1291,7 +1383,7 @@ define i128 @test86(i1 %flag) { ; CHECK-NEXT: store ptr [[T]], ptr [[Y]], align 8 ; CHECK-NEXT: [[X_VAL:%.*]] = load i128, ptr [[X]], align 4 ; CHECK-NEXT: [[Y_VAL:%.*]] = load i128, ptr [[Y]], align 4 -; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG:%.*]], i128 [[X_VAL]], i128 [[Y_VAL]] +; CHECK-NEXT: [[V:%.*]] = select i1 [[FLAG]], i128 [[X_VAL]], i128 [[Y_VAL]] ; CHECK-NEXT: ret i128 [[V]] ; %x = alloca [2 x ptr] @@ -1306,10 +1398,11 @@ define i128 @test86(i1 %flag) { } define i32 @test_select_select0(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) { -; CHECK-LABEL: @test_select_select0( -; CHECK-NEXT: [[C0_NOT:%.*]] = icmp slt i32 [[A:%.*]], [[V1:%.*]] -; CHECK-NEXT: [[S0:%.*]] = select i1 [[C0_NOT]], i32 [[R1:%.*]], i32 [[R0:%.*]] -; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[A]], [[V2:%.*]] +; CHECK-LABEL: define i32 @test_select_select0( +; CHECK-SAME: i32 [[A:%.*]], i32 [[R0:%.*]], i32 [[R1:%.*]], i32 [[V1:%.*]], i32 [[V2:%.*]]) { +; CHECK-NEXT: [[C0_NOT:%.*]] = icmp slt i32 [[A]], [[V1]] +; CHECK-NEXT: [[S0:%.*]] = select i1 [[C0_NOT]], i32 [[R1]], i32 [[R0]] +; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[A]], [[V2]] ; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1]], i32 [[S0]], i32 [[R1]] ; CHECK-NEXT: ret i32 [[S1]] ; @@ -1321,10 +1414,11 @@ define i32 @test_select_select0(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) { } define i32 @test_select_select1(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) { -; CHECK-LABEL: @test_select_select1( -; CHECK-NEXT: [[C0_NOT:%.*]] = icmp slt i32 [[A:%.*]], [[V1:%.*]] -; CHECK-NEXT: [[S0:%.*]] = select i1 [[C0_NOT]], i32 [[R1:%.*]], i32 [[R0:%.*]] -; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[A]], [[V2:%.*]] +; CHECK-LABEL: define i32 @test_select_select1( +; CHECK-SAME: i32 [[A:%.*]], i32 [[R0:%.*]], i32 [[R1:%.*]], i32 [[V1:%.*]], i32 [[V2:%.*]]) { +; CHECK-NEXT: [[C0_NOT:%.*]] = icmp slt i32 [[A]], [[V1]] +; CHECK-NEXT: [[S0:%.*]] = select i1 [[C0_NOT]], i32 [[R1]], i32 [[R0]] +; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[A]], [[V2]] ; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1]], i32 [[R0]], i32 [[S0]] ; CHECK-NEXT: ret i32 [[S1]] ; @@ -1336,8 +1430,9 @@ define i32 @test_select_select1(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) { } define i32 @PR23757(i32 %x) { -; CHECK-LABEL: @PR23757( -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X:%.*]], 1 +; CHECK-LABEL: define i32 @PR23757( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 1 ; CHECK-NEXT: ret i32 [[ADD]] ; %cmp = icmp eq i32 %x, 2147483647 @@ -1347,7 +1442,8 @@ define i32 @PR23757(i32 %x) { } define i32 @PR23757_swapped(i32 %x) { -; CHECK-LABEL: @PR23757_swapped( +; CHECK-LABEL: define i32 @PR23757_swapped( +; CHECK-SAME: i32 [[X:%.*]]) { ; CHECK-NEXT: ret i32 -2147483648 ; %cmp = icmp eq i32 %x, 2147483647 @@ -1357,9 +1453,10 @@ define i32 @PR23757_swapped(i32 %x) { } define i32 @PR23757_ne(i32 %x, ptr %p) { -; CHECK-LABEL: @PR23757_ne( -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 2147483647 -; CHECK-NEXT: store i1 [[CMP]], ptr [[P:%.*]], align 1 +; CHECK-LABEL: define i32 @PR23757_ne( +; CHECK-SAME: i32 [[X:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], 2147483647 +; CHECK-NEXT: store i1 [[CMP]], ptr [[P]], align 1 ; CHECK-NEXT: ret i32 -2147483648 ; %cmp = icmp ne i32 %x, 2147483647 @@ -1370,9 +1467,10 @@ define i32 @PR23757_ne(i32 %x, ptr %p) { } define i32 @PR23757_ne_swapped(i32 %x, ptr %p) { -; CHECK-LABEL: @PR23757_ne_swapped( -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 2147483647 -; CHECK-NEXT: store i1 [[CMP]], ptr [[P:%.*]], align 1 +; CHECK-LABEL: define i32 @PR23757_ne_swapped( +; CHECK-SAME: i32 [[X:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], 2147483647 +; CHECK-NEXT: store i1 [[CMP]], ptr [[P]], align 1 ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 1 ; CHECK-NEXT: ret i32 [[ADD]] ; @@ -1386,8 +1484,9 @@ define i32 @PR23757_ne_swapped(i32 %x, ptr %p) { ; max(max(~a, -1), -1) --> ~min(a, 0) define i32 @PR27137(i32 %a) { -; CHECK-LABEL: @PR27137( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smin.i32(i32 [[A:%.*]], i32 0) +; CHECK-LABEL: define i32 @PR27137( +; CHECK-SAME: i32 [[A:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 0) ; CHECK-NEXT: [[S1:%.*]] = xor i32 [[TMP1]], -1 ; CHECK-NEXT: ret i32 [[S1]] ; @@ -1401,8 +1500,9 @@ define i32 @PR27137(i32 %a) { ; ub-safe negation pattern define i32 @PR27817(i32 %x) { -; CHECK-LABEL: @PR27817( -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[X:%.*]] +; CHECK-LABEL: define i32 @PR27817( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[X]] ; CHECK-NEXT: ret i32 [[SUB]] ; %cmp = icmp eq i32 %x, -2147483648 @@ -1412,8 +1512,9 @@ define i32 @PR27817(i32 %x) { } define i32 @PR27817_nsw(i32 %x) { -; CHECK-LABEL: @PR27817_nsw( -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[X:%.*]] +; CHECK-LABEL: define i32 @PR27817_nsw( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[X]] ; CHECK-NEXT: ret i32 [[SUB]] ; %cmp = icmp eq i32 %x, -2147483648 @@ -1423,8 +1524,9 @@ define i32 @PR27817_nsw(i32 %x) { } define <2 x i32> @PR27817_nsw_vec(<2 x i32> %x) { -; CHECK-LABEL: @PR27817_nsw_vec( -; CHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> zeroinitializer, [[X:%.*]] +; CHECK-LABEL: define <2 x i32> @PR27817_nsw_vec( +; CHECK-SAME: <2 x i32> [[X:%.*]]) { +; CHECK-NEXT: [[SUB:%.*]] = sub <2 x i32> zeroinitializer, [[X]] ; CHECK-NEXT: ret <2 x i32> [[SUB]] ; %cmp = icmp eq <2 x i32> %x, <i32 -2147483648, i32 -2147483648> @@ -1434,8 +1536,9 @@ define <2 x i32> @PR27817_nsw_vec(<2 x i32> %x) { } define i32 @select_icmp_slt0_xor(i32 %x) { -; CHECK-LABEL: @select_icmp_slt0_xor( -; CHECK-NEXT: [[X_XOR:%.*]] = or i32 [[X:%.*]], -2147483648 +; CHECK-LABEL: define i32 @select_icmp_slt0_xor( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[X_XOR:%.*]] = or i32 [[X]], -2147483648 ; CHECK-NEXT: ret i32 [[X_XOR]] ; %cmp = icmp slt i32 %x, zeroinitializer @@ -1445,8 +1548,9 @@ define i32 @select_icmp_slt0_xor(i32 %x) { } define <2 x i32> @select_icmp_slt0_xor_vec(<2 x i32> %x) { -; CHECK-LABEL: @select_icmp_slt0_xor_vec( -; CHECK-NEXT: [[X_XOR:%.*]] = or <2 x i32> [[X:%.*]], splat (i32 -2147483648) +; CHECK-LABEL: define <2 x i32> @select_icmp_slt0_xor_vec( +; CHECK-SAME: <2 x i32> [[X:%.*]]) { +; CHECK-NEXT: [[X_XOR:%.*]] = or <2 x i32> [[X]], splat (i32 -2147483648) ; CHECK-NEXT: ret <2 x i32> [[X_XOR]] ; %cmp = icmp slt <2 x i32> %x, zeroinitializer @@ -1456,8 +1560,9 @@ define <2 x i32> @select_icmp_slt0_xor_vec(<2 x i32> %x) { } define <4 x i32> @canonicalize_to_shuffle(<4 x i32> %a, <4 x i32> %b) { -; CHECK-LABEL: @canonicalize_to_shuffle( -; CHECK-NEXT: [[SEL:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 5, i32 6, i32 3> +; CHECK-LABEL: define <4 x i32> @canonicalize_to_shuffle( +; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 0, i32 5, i32 6, i32 3> ; CHECK-NEXT: ret <4 x i32> [[SEL]] ; %sel = select <4 x i1> <i1 true, i1 false, i1 false, i1 true>, <4 x i32> %a, <4 x i32> %b @@ -1469,8 +1574,9 @@ define <4 x i32> @canonicalize_to_shuffle(<4 x i32> %a, <4 x i32> %b) { ; https://bugs.llvm.org/show_bug.cgi?id=32486 define <4 x i32> @undef_elts_in_condition(<4 x i32> %a, <4 x i32> %b) { -; CHECK-LABEL: @undef_elts_in_condition( -; CHECK-NEXT: [[SEL:%.*]] = select <4 x i1> <i1 true, i1 undef, i1 false, i1 undef>, <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]] +; CHECK-LABEL: define <4 x i32> @undef_elts_in_condition( +; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <4 x i1> <i1 true, i1 undef, i1 false, i1 undef>, <4 x i32> [[A]], <4 x i32> [[B]] ; CHECK-NEXT: ret <4 x i32> [[SEL]] ; %sel = select <4 x i1> <i1 true, i1 undef, i1 false, i1 undef>, <4 x i32> %a, <4 x i32> %b @@ -1482,8 +1588,9 @@ define <4 x i32> @undef_elts_in_condition(<4 x i32> %a, <4 x i32> %b) { @g = global i32 0 define <4 x i32> @cannot_canonicalize_to_shuffle1(<4 x i32> %a, <4 x i32> %b) { -; CHECK-LABEL: @cannot_canonicalize_to_shuffle1( -; CHECK-NEXT: [[SEL:%.*]] = select <4 x i1> bitcast (i4 ptrtoint (ptr @g to i4) to <4 x i1>), <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]] +; CHECK-LABEL: define <4 x i32> @cannot_canonicalize_to_shuffle1( +; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <4 x i1> bitcast (i4 ptrtoint (ptr @g to i4) to <4 x i1>), <4 x i32> [[A]], <4 x i32> [[B]] ; CHECK-NEXT: ret <4 x i32> [[SEL]] ; %sel = select <4 x i1> bitcast (i4 ptrtoint (ptr @g to i4) to <4 x i1>), <4 x i32> %a, <4 x i32> %b @@ -1491,8 +1598,9 @@ define <4 x i32> @cannot_canonicalize_to_shuffle1(<4 x i32> %a, <4 x i32> %b) { } define <4 x i32> @cannot_canonicalize_to_shuffle2(<4 x i32> %a, <4 x i32> %b) { -; CHECK-LABEL: @cannot_canonicalize_to_shuffle2( -; CHECK-NEXT: [[SEL:%.*]] = select <4 x i1> <i1 true, i1 undef, i1 false, i1 ptrtoint (ptr @g to i1)>, <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]] +; CHECK-LABEL: define <4 x i32> @cannot_canonicalize_to_shuffle2( +; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <4 x i1> <i1 true, i1 undef, i1 false, i1 ptrtoint (ptr @g to i1)>, <4 x i32> [[A]], <4 x i32> [[B]] ; CHECK-NEXT: ret <4 x i32> [[SEL]] ; %sel = select <4 x i1> <i1 true, i1 undef, i1 false, i1 ptrtoint (ptr @g to i1)>, <4 x i32> %a, <4 x i32> %b @@ -1502,9 +1610,10 @@ define <4 x i32> @cannot_canonicalize_to_shuffle2(<4 x i32> %a, <4 x i32> %b) { declare void @llvm.assume(i1) define i8 @assume_cond_true(i1 %cond, i8 %x, i8 %y) { -; CHECK-LABEL: @assume_cond_true( -; CHECK-NEXT: call void @llvm.assume(i1 [[COND:%.*]]) -; CHECK-NEXT: ret i8 [[X:%.*]] +; CHECK-LABEL: define i8 @assume_cond_true( +; CHECK-SAME: i1 [[COND:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: call void @llvm.assume(i1 [[COND]]) +; CHECK-NEXT: ret i8 [[X]] ; call void @llvm.assume(i1 %cond) %sel = select i1 %cond, i8 %x, i8 %y @@ -1514,10 +1623,11 @@ define i8 @assume_cond_true(i1 %cond, i8 %x, i8 %y) { ; computeKnownBitsFromAssume() understands the 'not' of an assumed condition. define i8 @assume_cond_false(i1 %cond, i8 %x, i8 %y) { -; CHECK-LABEL: @assume_cond_false( -; CHECK-NEXT: [[NOTCOND:%.*]] = xor i1 [[COND:%.*]], true +; CHECK-LABEL: define i8 @assume_cond_false( +; CHECK-SAME: i1 [[COND:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[NOTCOND:%.*]] = xor i1 [[COND]], true ; CHECK-NEXT: call void @llvm.assume(i1 [[NOTCOND]]) -; CHECK-NEXT: ret i8 [[Y:%.*]] +; CHECK-NEXT: ret i8 [[Y]] ; %notcond = xor i1 %cond, true call void @llvm.assume(i1 %notcond) @@ -1527,9 +1637,10 @@ define i8 @assume_cond_false(i1 %cond, i8 %x, i8 %y) { ; Test case to make sure we don't consider an all ones float values for converting the select into a sext. define <4 x float> @PR33721(<4 x float> %w) { -; CHECK-LABEL: @PR33721( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = fcmp ole <4 x float> [[W:%.*]], zeroinitializer +; CHECK-LABEL: define <4 x float> @PR33721( +; CHECK-SAME: <4 x float> [[W:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[TMP0:%.*]] = fcmp ole <4 x float> [[W]], zeroinitializer ; CHECK-NEXT: [[TMP1:%.*]] = select <4 x i1> [[TMP0]], <4 x float> splat (float 0xFFFFFFFFE0000000), <4 x float> zeroinitializer ; CHECK-NEXT: ret <4 x float> [[TMP1]] ; @@ -1541,9 +1652,10 @@ entry: ; select(C, binop(select(C, X, Y), W), Z) -> select(C, binop(X, W), Z) define i8 @test87(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @test87( -; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[W:%.*]] -; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], i8 [[B]], i8 [[Z:%.*]] +; CHECK-LABEL: define i8 @test87( +; CHECK-SAME: i1 [[COND:%.*]], i8 [[W:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = add i8 [[X]], [[W]] +; CHECK-NEXT: [[C:%.*]] = select i1 [[COND]], i8 [[B]], i8 [[Z]] ; CHECK-NEXT: ret i8 [[C]] ; %a = select i1 %cond, i8 %x, i8 %y @@ -1554,9 +1666,10 @@ define i8 @test87(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { ; select(C, binop(select(C, X, Y), W), Z) -> select(C, Z, binop(Y, W)) define i8 @test88(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @test88( -; CHECK-NEXT: [[B:%.*]] = sub i8 [[Y:%.*]], [[W:%.*]] -; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], i8 [[Z:%.*]], i8 [[B]] +; CHECK-LABEL: define i8 @test88( +; CHECK-SAME: i1 [[COND:%.*]], i8 [[W:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = sub i8 [[Y]], [[W]] +; CHECK-NEXT: [[C:%.*]] = select i1 [[COND]], i8 [[Z]], i8 [[B]] ; CHECK-NEXT: ret i8 [[C]] ; %a = select i1 %cond, i8 %x, i8 %y @@ -1567,9 +1680,10 @@ define i8 @test88(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { ; select(C, Z, binop(W, select(C, X, Y))) -> select(C, binop(X, W), Z) define i8 @test89(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @test89( -; CHECK-NEXT: [[B:%.*]] = and i8 [[W:%.*]], [[X:%.*]] -; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], i8 [[B]], i8 [[Z:%.*]] +; CHECK-LABEL: define i8 @test89( +; CHECK-SAME: i1 [[COND:%.*]], i8 [[W:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = and i8 [[W]], [[X]] +; CHECK-NEXT: [[C:%.*]] = select i1 [[COND]], i8 [[B]], i8 [[Z]] ; CHECK-NEXT: ret i8 [[C]] ; %a = select i1 %cond, i8 %x, i8 %y @@ -1580,9 +1694,10 @@ define i8 @test89(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { ; select(C, Z, binop(W, select(C, X, Y))) -> select(C, Z, binop(W, Y)) define i8 @test90(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @test90( -; CHECK-NEXT: [[B:%.*]] = or i8 [[W:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], i8 [[Z:%.*]], i8 [[B]] +; CHECK-LABEL: define i8 @test90( +; CHECK-SAME: i1 [[COND:%.*]], i8 [[W:%.*]], i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[B:%.*]] = or i8 [[W]], [[Y]] +; CHECK-NEXT: [[C:%.*]] = select i1 [[COND]], i8 [[Z]], i8 [[B]] ; CHECK-NEXT: ret i8 [[C]] ; %a = select i1 %cond, i8 %x, i8 %y @@ -1592,8 +1707,9 @@ define i8 @test90(i1 %cond, i8 %w, i8 %x, i8 %y, i8 %z) { } define i32 @test_shl_zext_bool(i1 %t) { -; CHECK-LABEL: @test_shl_zext_bool( -; CHECK-NEXT: [[R:%.*]] = select i1 [[T:%.*]], i32 4, i32 0 +; CHECK-LABEL: define i32 @test_shl_zext_bool( +; CHECK-SAME: i1 [[T:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select i1 [[T]], i32 4, i32 0 ; CHECK-NEXT: ret i32 [[R]] ; %r = select i1 %t, i32 4, i32 0 @@ -1601,8 +1717,9 @@ define i32 @test_shl_zext_bool(i1 %t) { } define <2 x i32> @test_shl_zext_bool_splat(<2 x i1> %t) { -; CHECK-LABEL: @test_shl_zext_bool_splat( -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[T:%.*]], <2 x i32> splat (i32 8), <2 x i32> zeroinitializer +; CHECK-LABEL: define <2 x i32> @test_shl_zext_bool_splat( +; CHECK-SAME: <2 x i1> [[T:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[T]], <2 x i32> splat (i32 8), <2 x i32> zeroinitializer ; CHECK-NEXT: ret <2 x i32> [[R]] ; %r = select <2 x i1> %t, <2 x i32> <i32 8, i32 8>, <2 x i32> zeroinitializer @@ -1610,8 +1727,9 @@ define <2 x i32> @test_shl_zext_bool_splat(<2 x i1> %t) { } define <2 x i32> @test_shl_zext_bool_vec(<2 x i1> %t) { -; CHECK-LABEL: @test_shl_zext_bool_vec( -; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[T:%.*]], <2 x i32> <i32 4, i32 8>, <2 x i32> zeroinitializer +; CHECK-LABEL: define <2 x i32> @test_shl_zext_bool_vec( +; CHECK-SAME: <2 x i1> [[T:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[T]], <2 x i32> <i32 4, i32 8>, <2 x i32> zeroinitializer ; CHECK-NEXT: ret <2 x i32> [[R]] ; %r = select <2 x i1> %t, <2 x i32> <i32 4, i32 8>, <2 x i32> zeroinitializer @@ -1619,8 +1737,9 @@ define <2 x i32> @test_shl_zext_bool_vec(<2 x i1> %t) { } define float @copysign1(float %x) { -; CHECK-LABEL: @copysign1( -; CHECK-NEXT: [[R:%.*]] = call float @llvm.copysign.f32(float 1.000000e+00, float [[X:%.*]]) +; CHECK-LABEL: define float @copysign1( +; CHECK-SAME: float [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call float @llvm.copysign.f32(float 1.000000e+00, float [[X]]) ; CHECK-NEXT: ret float [[R]] ; %i = bitcast float %x to i32 @@ -1630,8 +1749,9 @@ define float @copysign1(float %x) { } define float @copysign1_fmf(float %x) { -; CHECK-LABEL: @copysign1_fmf( -; CHECK-NEXT: [[R:%.*]] = call float @llvm.copysign.f32(float 1.000000e+00, float [[X:%.*]]) +; CHECK-LABEL: define float @copysign1_fmf( +; CHECK-SAME: float [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call float @llvm.copysign.f32(float 1.000000e+00, float [[X]]) ; CHECK-NEXT: ret float [[R]] ; %i = bitcast float %x to i32 @@ -1641,8 +1761,9 @@ define float @copysign1_fmf(float %x) { } define <2 x float> @copysign2(<2 x float> %x) { -; CHECK-LABEL: @copysign2( -; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x float> [[X:%.*]] +; CHECK-LABEL: define <2 x float> @copysign2( +; CHECK-SAME: <2 x float> [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x float> [[X]] ; CHECK-NEXT: [[R:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> splat (float 4.200000e+01), <2 x float> [[TMP1]]) ; CHECK-NEXT: ret <2 x float> [[R]] ; @@ -1653,8 +1774,9 @@ define <2 x float> @copysign2(<2 x float> %x) { } define float @copysign3(float %x) { -; CHECK-LABEL: @copysign3( -; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[X:%.*]] +; CHECK-LABEL: define float @copysign3( +; CHECK-SAME: float [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[X]] ; CHECK-NEXT: [[R:%.*]] = call float @llvm.copysign.f32(float 4.300000e+01, float [[TMP1]]) ; CHECK-NEXT: ret float [[R]] ; @@ -1665,8 +1787,9 @@ define float @copysign3(float %x) { } define <2 x float> @copysign_vec_poison(<2 x float> %x) { -; CHECK-LABEL: @copysign_vec_poison( -; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x float> [[X:%.*]] +; CHECK-LABEL: define <2 x float> @copysign_vec_poison( +; CHECK-SAME: <2 x float> [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x float> [[X]] ; CHECK-NEXT: [[R:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> splat (float 4.200000e+01), <2 x float> [[TMP1]]) ; CHECK-NEXT: ret <2 x float> [[R]] ; @@ -1677,8 +1800,9 @@ define <2 x float> @copysign_vec_poison(<2 x float> %x) { } define <2 x float> @copysign_vec_poison1(<2 x float> %x) { -; CHECK-LABEL: @copysign_vec_poison1( -; CHECK-NEXT: [[R:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> splat (float 4.200000e+01), <2 x float> [[X:%.*]]) +; CHECK-LABEL: define <2 x float> @copysign_vec_poison1( +; CHECK-SAME: <2 x float> [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> splat (float 4.200000e+01), <2 x float> [[X]]) ; CHECK-NEXT: ret <2 x float> [[R]] ; %i = bitcast <2 x float> %x to <2 x i32> @@ -1688,8 +1812,9 @@ define <2 x float> @copysign_vec_poison1(<2 x float> %x) { } define <2 x float> @copysign_vec_poison3(<2 x float> %x) { -; CHECK-LABEL: @copysign_vec_poison3( -; CHECK-NEXT: [[R:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> splat (float 4.200000e+01), <2 x float> [[X:%.*]]) +; CHECK-LABEL: define <2 x float> @copysign_vec_poison3( +; CHECK-SAME: <2 x float> [[X:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> splat (float 4.200000e+01), <2 x float> [[X]]) ; CHECK-NEXT: ret <2 x float> [[R]] ; %i = bitcast <2 x float> %x to <2 x i32> @@ -1703,8 +1828,9 @@ declare void @use1(i1) ; Negative test define float @copysign_extra_use(float %x) { -; CHECK-LABEL: @copysign_extra_use( -; CHECK-NEXT: [[I:%.*]] = bitcast float [[X:%.*]] to i32 +; CHECK-LABEL: define float @copysign_extra_use( +; CHECK-SAME: float [[X:%.*]]) { +; CHECK-NEXT: [[I:%.*]] = bitcast float [[X]] to i32 ; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[I]], 0 ; CHECK-NEXT: call void @use1(i1 [[ISNEG]]) ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISNEG]], float -4.400000e+01, float 4.400000e+01 @@ -1720,8 +1846,9 @@ define float @copysign_extra_use(float %x) { ; Negative test define float @copysign_type_mismatch(double %x) { -; CHECK-LABEL: @copysign_type_mismatch( -; CHECK-NEXT: [[I:%.*]] = bitcast double [[X:%.*]] to i64 +; CHECK-LABEL: define float @copysign_type_mismatch( +; CHECK-SAME: double [[X:%.*]]) { +; CHECK-NEXT: [[I:%.*]] = bitcast double [[X]] to i64 ; CHECK-NEXT: [[ISPOS:%.*]] = icmp sgt i64 [[I]], -1 ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISPOS]], float 1.000000e+00, float -1.000000e+00 ; CHECK-NEXT: ret float [[R]] @@ -1735,8 +1862,9 @@ define float @copysign_type_mismatch(double %x) { ; Negative test define <2 x float> @copysign_type_mismatch2(<2 x float> %x) { -; CHECK-LABEL: @copysign_type_mismatch2( -; CHECK-NEXT: [[I:%.*]] = bitcast <2 x float> [[X:%.*]] to i64 +; CHECK-LABEL: define <2 x float> @copysign_type_mismatch2( +; CHECK-SAME: <2 x float> [[X:%.*]]) { +; CHECK-NEXT: [[I:%.*]] = bitcast <2 x float> [[X]] to i64 ; CHECK-NEXT: [[ISPOS:%.*]] = icmp sgt i64 [[I]], -1 ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISPOS]], <2 x float> splat (float 1.000000e+00), <2 x float> splat (float -1.000000e+00) ; CHECK-NEXT: ret <2 x float> [[R]] @@ -1750,8 +1878,9 @@ define <2 x float> @copysign_type_mismatch2(<2 x float> %x) { ; Negative test define float @copysign_wrong_cmp(float %x) { -; CHECK-LABEL: @copysign_wrong_cmp( -; CHECK-NEXT: [[I:%.*]] = bitcast float [[X:%.*]] to i32 +; CHECK-LABEL: define float @copysign_wrong_cmp( +; CHECK-SAME: float [[X:%.*]]) { +; CHECK-NEXT: [[I:%.*]] = bitcast float [[X]] to i32 ; CHECK-NEXT: [[ISPOS:%.*]] = icmp sgt i32 [[I]], 0 ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISPOS]], float 1.000000e+00, float -1.000000e+00 ; CHECK-NEXT: ret float [[R]] @@ -1765,8 +1894,9 @@ define float @copysign_wrong_cmp(float %x) { ; Negative test define float @copysign_wrong_const(float %x) { -; CHECK-LABEL: @copysign_wrong_const( -; CHECK-NEXT: [[I:%.*]] = bitcast float [[X:%.*]] to i32 +; CHECK-LABEL: define float @copysign_wrong_const( +; CHECK-SAME: float [[X:%.*]]) { +; CHECK-NEXT: [[I:%.*]] = bitcast float [[X]] to i32 ; CHECK-NEXT: [[ISPOS:%.*]] = icmp sgt i32 [[I]], -1 ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISPOS]], float 2.000000e+00, float -1.000000e+00 ; CHECK-NEXT: ret float [[R]] @@ -1779,15 +1909,16 @@ define float @copysign_wrong_const(float %x) { ; TODO: we can replace select with a Phi. define i32 @select_dominating_cond(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominating_cond( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[Y:%.*]], [[IF_FALSE]] ], [ [[X:%.*]], [[IF_TRUE]] ] +; CHECK-LABEL: define i32 @select_dominating_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[Y]], %[[IF_FALSE]] ], [ [[X]], %[[IF_TRUE]] ] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -1805,15 +1936,16 @@ merge: } define i32 @select_dominating_inverted(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominating_inverted( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X:%.*]], [[IF_FALSE]] ], [ [[Y:%.*]], [[IF_TRUE]] ] +; CHECK-LABEL: define i32 @select_dominating_inverted( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_FALSE:.*]], label %[[IF_TRUE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X]], %[[IF_FALSE]] ], [ [[Y]], %[[IF_TRUE]] ] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -1833,23 +1965,24 @@ merge: ; More complex CFG: the block with select has multiple predecessors. define i32 @select_dominating_cond_multiple_preds(i1 %cond, i1 %cond2, i1 %cond3, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominating_cond_multiple_preds( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] -; CHECK: if.true.1: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.true.2: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: if.false: -; CHECK-NEXT: br i1 [[COND3:%.*]], label [[IF_FALSE_1:%.*]], label [[EXIT:%.*]] -; CHECK: if.false.1: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[Y:%.*]], [[IF_FALSE_1]] ], [ [[X:%.*]], [[IF_TRUE_2]] ], [ [[X]], [[IF_TRUE_1]] ] +; CHECK-LABEL: define i32 @select_dominating_cond_multiple_preds( +; CHECK-SAME: i1 [[COND:%.*]], i1 [[COND2:%.*]], i1 [[COND3:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br i1 [[COND2]], label %[[IF_TRUE_1:.*]], label %[[IF_TRUE_2:.*]] +; CHECK: [[IF_TRUE_1]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_TRUE_2]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br i1 [[COND3]], label %[[IF_FALSE_1:.*]], label %[[EXIT:.*]] +; CHECK: [[IF_FALSE_1]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[Y]], %[[IF_FALSE_1]] ], [ [[X]], %[[IF_TRUE_2]] ], [ [[X]], %[[IF_TRUE_1]] ] ; CHECK-NEXT: ret i32 [[S]] -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 0 ; entry: @@ -1880,23 +2013,24 @@ exit: ; More complex CFG for inverted case: the block with select has multiple predecessors. define i32 @select_dominating_cond_inverted_multiple_preds(i1 %cond, i1 %cond2, i1 %cond3, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominating_cond_inverted_multiple_preds( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] -; CHECK: if.true.1: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.true.2: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: if.false: -; CHECK-NEXT: br i1 [[COND3:%.*]], label [[IF_FALSE_1:%.*]], label [[EXIT:%.*]] -; CHECK: if.false.1: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X:%.*]], [[IF_FALSE_1]] ], [ [[Y:%.*]], [[IF_TRUE_2]] ], [ [[Y]], [[IF_TRUE_1]] ] +; CHECK-LABEL: define i32 @select_dominating_cond_inverted_multiple_preds( +; CHECK-SAME: i1 [[COND:%.*]], i1 [[COND2:%.*]], i1 [[COND3:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_FALSE:.*]], label %[[IF_TRUE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br i1 [[COND2]], label %[[IF_TRUE_1:.*]], label %[[IF_TRUE_2:.*]] +; CHECK: [[IF_TRUE_1]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_TRUE_2]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br i1 [[COND3]], label %[[IF_FALSE_1:.*]], label %[[EXIT:.*]] +; CHECK: [[IF_FALSE_1]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X]], %[[IF_FALSE_1]] ], [ [[Y]], %[[IF_TRUE_2]] ], [ [[Y]], %[[IF_TRUE_1]] ] ; CHECK-NEXT: ret i32 [[S]] -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 0 ; entry: @@ -1928,25 +2062,26 @@ exit: ; More complex CFG for inverted case: the block with select has multiple predecessors that can duplicate. define i32 @select_dominating_cond_inverted_multiple_duplicating_preds(i1 %cond, i32 %cond2, i1 %cond3, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominating_cond_inverted_multiple_duplicating_preds( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: switch i32 [[COND2:%.*]], label [[SWITCH_CASE_1:%.*]] [ -; CHECK-NEXT: i32 1, label [[MERGE:%.*]] -; CHECK-NEXT: i32 2, label [[MERGE]] -; CHECK-NEXT: i32 3, label [[MERGE]] +; CHECK-LABEL: define i32 @select_dominating_cond_inverted_multiple_duplicating_preds( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[COND2:%.*]], i1 [[COND3:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_FALSE:.*]], label %[[IF_TRUE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: switch i32 [[COND2]], label %[[SWITCH_CASE_1:.*]] [ +; CHECK-NEXT: i32 1, label %[[MERGE:.*]] +; CHECK-NEXT: i32 2, label %[[MERGE]] +; CHECK-NEXT: i32 3, label %[[MERGE]] ; CHECK-NEXT: ] -; CHECK: switch.case.1: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: if.false: -; CHECK-NEXT: br i1 [[COND3:%.*]], label [[IF_FALSE_1:%.*]], label [[EXIT:%.*]] -; CHECK: if.false.1: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X:%.*]], [[IF_FALSE_1]] ], [ [[Y:%.*]], [[SWITCH_CASE_1]] ], [ [[Y]], [[IF_TRUE]] ], [ [[Y]], [[IF_TRUE]] ], [ [[Y]], [[IF_TRUE]] ] +; CHECK: [[SWITCH_CASE_1]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br i1 [[COND3]], label %[[IF_FALSE_1:.*]], label %[[EXIT:.*]] +; CHECK: [[IF_FALSE_1]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X]], %[[IF_FALSE_1]] ], [ [[Y]], %[[SWITCH_CASE_1]] ], [ [[Y]], %[[IF_TRUE]] ], [ [[Y]], %[[IF_TRUE]] ], [ [[Y]], %[[IF_TRUE]] ] ; CHECK-NEXT: ret i32 [[S]] -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 0 ; entry: @@ -1979,17 +2114,18 @@ exit: ; Negative test: currently we take condition from IDom, but might be willing to expand it in the future. define i32 @select_not_imm_dominating_cond_neg(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @select_not_imm_dominating_cond_neg( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], i32 [[X:%.*]], i32 [[Y:%.*]] +; CHECK-LABEL: define i32 @select_not_imm_dominating_cond_neg( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], i32 [[X]], i32 [[Y]] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -2011,27 +2147,28 @@ exit: ; Shows how we can leverage dominance to eliminate duplicating selects. define i32 @select_dominance_chain(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominance_chain( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_FALSE_1:%.*]] -; CHECK: if.true.1: -; CHECK-NEXT: br label [[MERGE_1:%.*]] -; CHECK: if.false.1: -; CHECK-NEXT: br label [[MERGE_1]] -; CHECK: merge.1: -; CHECK-NEXT: br i1 [[COND]], label [[IF_TRUE_2:%.*]], label [[IF_FALSE_2:%.*]] -; CHECK: if.true.2: -; CHECK-NEXT: br label [[MERGE_2:%.*]] -; CHECK: if.false.2: -; CHECK-NEXT: br label [[MERGE_2]] -; CHECK: merge.2: -; CHECK-NEXT: br i1 [[COND]], label [[IF_TRUE_3:%.*]], label [[IF_FALSE_3:%.*]] -; CHECK: if.true.3: -; CHECK-NEXT: br label [[MERGE_3:%.*]] -; CHECK: if.false.3: -; CHECK-NEXT: br label [[MERGE_3]] -; CHECK: merge.3: -; CHECK-NEXT: [[S_1:%.*]] = phi i32 [ [[Y:%.*]], [[IF_FALSE_3]] ], [ [[X:%.*]], [[IF_TRUE_3]] ] +; CHECK-LABEL: define i32 @select_dominance_chain( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE_1:.*]], label %[[IF_FALSE_1:.*]] +; CHECK: [[IF_TRUE_1]]: +; CHECK-NEXT: br label %[[MERGE_1:.*]] +; CHECK: [[IF_FALSE_1]]: +; CHECK-NEXT: br label %[[MERGE_1]] +; CHECK: [[MERGE_1]]: +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE_2:.*]], label %[[IF_FALSE_2:.*]] +; CHECK: [[IF_TRUE_2]]: +; CHECK-NEXT: br label %[[MERGE_2:.*]] +; CHECK: [[IF_FALSE_2]]: +; CHECK-NEXT: br label %[[MERGE_2]] +; CHECK: [[MERGE_2]]: +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE_3:.*]], label %[[IF_FALSE_3:.*]] +; CHECK: [[IF_TRUE_3]]: +; CHECK-NEXT: br label %[[MERGE_3:.*]] +; CHECK: [[IF_FALSE_3]]: +; CHECK-NEXT: br label %[[MERGE_3]] +; CHECK: [[MERGE_3]]: +; CHECK-NEXT: [[S_1:%.*]] = phi i32 [ [[Y]], %[[IF_FALSE_3]] ], [ [[X]], %[[IF_TRUE_3]] ] ; CHECK-NEXT: [[SUM_2:%.*]] = mul i32 [[S_1]], 3 ; CHECK-NEXT: ret i32 [[SUM_2]] ; @@ -2074,15 +2211,16 @@ merge.3: ; TODO: We can replace select with a Phi and then sink a and b to respective ; branches. define i32 @select_dominating_cond_and_sink(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @select_dominating_cond_and_sink( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[B:%.*]] = mul i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @select_dominating_cond_and_sink( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[B:%.*]] = mul i32 [[X]], [[Y]] ; CHECK-NEXT: [[A:%.*]] = add i32 [[X]], [[Y]] ; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]] ; CHECK-NEXT: ret i32 [[S]] @@ -2104,11 +2242,12 @@ merge: } define i32 @select_dominating_cond_same_labels(i1 %cond) { -; CHECK-LABEL: @select_dominating_cond_same_labels( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[EXIT]] -; CHECK: exit: -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[COND:%.*]], i32 123, i32 456 +; CHECK-LABEL: define i32 @select_dominating_cond_same_labels( +; CHECK-SAME: i1 [[COND:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[EXIT]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[COND]], i32 123, i32 456 ; CHECK-NEXT: ret i32 [[RESULT]] ; entry: @@ -2119,15 +2258,16 @@ exit: } define i32 @select_phi_same_condition(i1 %cond, i32 %x, i32 %y, i32 %z) { -; CHECK-LABEL: @select_phi_same_condition( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X:%.*]], [[IF_TRUE]] ], [ [[Z:%.*]], [[IF_FALSE]] ] +; CHECK-LABEL: define i32 @select_phi_same_condition( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X]], %[[IF_TRUE]] ], [ [[Z]], %[[IF_FALSE]] ] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -2148,17 +2288,18 @@ merge: ; TODO: Replace with phi[a, c] and sink them to respective branches. define i32 @select_phi_same_condition_sink(i1 %cond, i32 %x, i32 %y, i32 %z) { -; CHECK-LABEL: @select_phi_same_condition_sink( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: [[B:%.*]] = mul i32 [[X:%.*]], [[Z:%.*]] -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[B]], [[IF_FALSE]] ] -; CHECK-NEXT: [[A:%.*]] = add i32 [[X]], [[Y:%.*]] +; CHECK-LABEL: define i32 @select_phi_same_condition_sink( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: [[B:%.*]] = mul i32 [[X]], [[Z]] +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[IF_TRUE]] ], [ [[B]], %[[IF_FALSE]] ] +; CHECK-NEXT: [[A:%.*]] = add i32 [[X]], [[Y]] ; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[PHI]] ; CHECK-NEXT: ret i32 [[S]] ; @@ -2183,14 +2324,15 @@ declare i32 @__gxx_personality_v0(...) declare i1 @foo() define i32 @test_invoke_neg(i32 %x, i32 %y) nounwind uwtable ssp personality ptr @__gxx_personality_v0 { -; CHECK-LABEL: @test_invoke_neg( -; CHECK-NEXT: entry: +; CHECK-LABEL: define i32 @test_invoke_neg( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR4:[0-9]+]] personality ptr @__gxx_personality_v0 { +; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[COND:%.*]] = invoke i1 @foo() -; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] -; CHECK: invoke.cont: -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[X:%.*]], i32 [[Y:%.*]] +; CHECK-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD:.*]] +; CHECK: [[INVOKE_CONT]]: +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[X]], i32 [[Y]] ; CHECK-NEXT: ret i32 [[SEL]] -; CHECK: lpad: +; CHECK: [[LPAD]]: ; CHECK-NEXT: [[LP:%.*]] = landingpad { i1, i32 } ; CHECK-NEXT: filter [0 x i1] zeroinitializer ; CHECK-NEXT: unreachable @@ -2212,19 +2354,20 @@ lpad: declare i32 @bar() define i32 @test_invoke_2_neg(i1 %cond, i32 %x, i32 %y) nounwind uwtable ssp personality ptr @__gxx_personality_v0 { -; CHECK-LABEL: @test_invoke_2_neg( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: +; CHECK-LABEL: define i32 @test_invoke_2_neg( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR4]] personality ptr @__gxx_personality_v0 { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: ; CHECK-NEXT: [[RESULT:%.*]] = invoke i32 @bar() -; CHECK-NEXT: to label [[MERGE]] unwind label [[LPAD:%.*]] -; CHECK: merge: -; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[RESULT]], [[IF_FALSE]] ] +; CHECK-NEXT: to label %[[MERGE]] unwind label %[[LPAD:.*]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[IF_TRUE]] ], [ [[RESULT]], %[[IF_FALSE]] ] ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 1, i32 [[PHI]] ; CHECK-NEXT: ret i32 [[SEL]] -; CHECK: lpad: +; CHECK: [[LPAD]]: ; CHECK-NEXT: [[LP:%.*]] = landingpad { i1, i32 } ; CHECK-NEXT: filter [0 x i1] zeroinitializer ; CHECK-NEXT: unreachable @@ -2251,20 +2394,21 @@ lpad: } define i32 @select_phi_same_condition_switch(i1 %cond, i32 %x, i32 %y) { -; CHECK-LABEL: @select_phi_same_condition_switch( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT:%.*]] [ -; CHECK-NEXT: i32 1, label [[MERGE:%.*]] -; CHECK-NEXT: i32 2, label [[MERGE]] +; CHECK-LABEL: define i32 @select_phi_same_condition_switch( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: switch i32 [[X]], label %[[EXIT:.*]] [ +; CHECK-NEXT: i32 1, label %[[MERGE:.*]] +; CHECK-NEXT: i32 2, label %[[MERGE]] ; CHECK-NEXT: ] -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 0 -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X]], [[IF_TRUE]] ], [ [[X]], [[IF_TRUE]] ], [ [[Y:%.*]], [[IF_FALSE]] ] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ [[X]], %[[IF_TRUE]] ], [ [[X]], %[[IF_TRUE]] ], [ [[Y]], %[[IF_FALSE]] ] ; CHECK-NEXT: ret i32 [[S]] ; entry: @@ -2289,21 +2433,22 @@ merge: } define i32 @transit_different_values_through_phi(i1 %cond, i1 %cond2) { -; CHECK-LABEL: @transit_different_values_through_phi( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] -; CHECK: if.true.1: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.true.2: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[S:%.*]] = phi i32 [ 1, [[IF_TRUE_1]] ], [ 2, [[IF_TRUE_2]] ], [ 3, [[IF_FALSE]] ] +; CHECK-LABEL: define i32 @transit_different_values_through_phi( +; CHECK-SAME: i1 [[COND:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br i1 [[COND2]], label %[[IF_TRUE_1:.*]], label %[[IF_TRUE_2:.*]] +; CHECK: [[IF_TRUE_1]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_TRUE_2]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[S:%.*]] = phi i32 [ 1, %[[IF_TRUE_1]] ], [ 2, %[[IF_TRUE_2]] ], [ 3, %[[IF_FALSE]] ] ; CHECK-NEXT: ret i32 [[S]] -; CHECK: exit: +; CHECK: [[EXIT:.*:]] ; CHECK-NEXT: ret i32 0 ; entry: @@ -2331,16 +2476,17 @@ exit: } define i32 @select_phi_degenerate(i1 %cond, i1 %cond2) { -; CHECK-LABEL: @select_phi_degenerate( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP:%.*]], label [[EXIT:%.*]] -; CHECK: loop: -; CHECK-NEXT: [[SELECT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_INC:%.*]], [[LOOP]] ] -; CHECK-NEXT: [[IV_INC]] = add i32 [[SELECT]], 1 -; CHECK-NEXT: br i1 [[COND2:%.*]], label [[LOOP]], label [[EXIT2:%.*]] -; CHECK: exit: +; CHECK-LABEL: define i32 @select_phi_degenerate( +; CHECK-SAME: i1 [[COND:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[COND]], label %[[LOOP:.*]], label %[[EXIT:.*]] +; CHECK: [[LOOP]]: +; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_INC:%.*]], %[[LOOP]] ] +; CHECK-NEXT: [[IV_INC]] = add i32 [[IV]], 1 +; CHECK-NEXT: br i1 [[COND2]], label %[[LOOP]], label %[[EXIT2:.*]] +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 0 -; CHECK: exit2: +; CHECK: [[EXIT2]]: ; CHECK-NEXT: ret i32 [[IV_INC]] ; entry: @@ -2360,17 +2506,18 @@ exit2: } define i32 @test_select_into_phi_not_idom(i1 %cond, i32 %A, i32 %B) { -; CHECK-LABEL: @test_select_into_phi_not_idom( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: ret i32 [[A:%.*]] +; CHECK-LABEL: define i32 @test_select_into_phi_not_idom( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: ret i32 [[A]] ; entry: br i1 %cond, label %if.true, label %if.false @@ -2391,17 +2538,18 @@ exit: } define i32 @test_select_into_phi_not_idom_2(i1 %cond, i32 %A, i32 %B) { -; CHECK-LABEL: @test_select_into_phi_not_idom_2( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: -; CHECK-NEXT: ret i32 [[B:%.*]] +; CHECK-LABEL: define i32 @test_select_into_phi_not_idom_2( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: ret i32 [[B]] ; entry: br i1 %cond, label %if.true, label %if.false @@ -2422,17 +2570,18 @@ exit: } define i32 @test_select_into_phi_not_idom_inverted(i1 %cond, i32 %A, i32 %B) { -; CHECK-LABEL: @test_select_into_phi_not_idom_inverted( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[A:%.*]], [[IF_TRUE]] ], [ [[B:%.*]], [[IF_FALSE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: +; CHECK-LABEL: define i32 @test_select_into_phi_not_idom_inverted( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_FALSE:.*]], label %[[IF_TRUE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[A]], %[[IF_TRUE]] ], [ [[B]], %[[IF_FALSE]] ] +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 [[SEL]] ; entry: @@ -2455,17 +2604,18 @@ exit: } define i32 @test_select_into_phi_not_idom_inverted_2(i1 %cond, i32 %A, i32 %B) { -; CHECK-LABEL: @test_select_into_phi_not_idom_inverted_2( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[A:%.*]], [[IF_TRUE]] ], [ [[B:%.*]], [[IF_FALSE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: +; CHECK-LABEL: define i32 @test_select_into_phi_not_idom_inverted_2( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_FALSE:.*]], label %[[IF_TRUE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[A]], %[[IF_TRUE]] ], [ [[B]], %[[IF_FALSE]] ] +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 [[SEL]] ; entry: @@ -2488,18 +2638,19 @@ exit: } define i32 @test_select_into_phi_not_idom_no_dom_input_1(i1 %cond, i32 %A, i32 %B, ptr %p) { -; CHECK-LABEL: @test_select_into_phi_not_idom_no_dom_input_1( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[P:%.*]], align 4 -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[C]], [[IF_TRUE]] ], [ [[A:%.*]], [[IF_FALSE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: +; CHECK-LABEL: define i32 @test_select_into_phi_not_idom_no_dom_input_1( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[P]], align 4 +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[C]], %[[IF_TRUE]] ], [ [[A]], %[[IF_FALSE]] ] +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 [[SEL]] ; entry: @@ -2522,18 +2673,19 @@ exit: } define i32 @test_select_into_phi_not_idom_no_dom_input_2(i1 %cond, i32 %A, i32 %B, ptr %p) { -; CHECK-LABEL: @test_select_into_phi_not_idom_no_dom_input_2( -; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] -; CHECK: if.true: -; CHECK-NEXT: br label [[MERGE:%.*]] -; CHECK: if.false: -; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[P:%.*]], align 4 -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[B:%.*]], [[IF_TRUE]] ], [ [[C]], [[IF_FALSE]] ] -; CHECK-NEXT: br label [[EXIT:%.*]] -; CHECK: exit: +; CHECK-LABEL: define i32 @test_select_into_phi_not_idom_no_dom_input_2( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[A:%.*]], i32 [[B:%.*]], ptr [[P:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]] +; CHECK: [[IF_TRUE]]: +; CHECK-NEXT: br label %[[MERGE:.*]] +; CHECK: [[IF_FALSE]]: +; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[P]], align 4 +; CHECK-NEXT: br label %[[MERGE]] +; CHECK: [[MERGE]]: +; CHECK-NEXT: [[SEL:%.*]] = phi i32 [ [[B]], %[[IF_TRUE]] ], [ [[C]], %[[IF_FALSE]] ] +; CHECK-NEXT: br label %[[EXIT:.*]] +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 [[SEL]] ; entry: @@ -2560,8 +2712,9 @@ exit: ; https://lists.llvm.org/pipermail/llvm-dev/2016-October/106182.html ; https://reviews.llvm.org/D83360 define i32 @false_undef(i1 %cond, i32 %x) { -; CHECK-LABEL: @false_undef( -; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i32 [[X:%.*]], i32 undef +; CHECK-LABEL: define i32 @false_undef( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]]) { +; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], i32 [[X]], i32 undef ; CHECK-NEXT: ret i32 [[S]] ; %s = select i1 %cond, i32 %x, i32 undef @@ -2569,8 +2722,9 @@ define i32 @false_undef(i1 %cond, i32 %x) { } define i32 @true_undef(i1 %cond, i32 %x) { -; CHECK-LABEL: @true_undef( -; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], i32 undef, i32 [[X:%.*]] +; CHECK-LABEL: define i32 @true_undef( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[X:%.*]]) { +; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], i32 undef, i32 [[X]] ; CHECK-NEXT: ret i32 [[S]] ; %s = select i1 %cond, i32 undef, i32 %x @@ -2578,8 +2732,9 @@ define i32 @true_undef(i1 %cond, i32 %x) { } define <2 x i32> @false_undef_vec(i1 %cond, <2 x i32> %x) { -; CHECK-LABEL: @false_undef_vec( -; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], <2 x i32> [[X:%.*]], <2 x i32> undef +; CHECK-LABEL: define <2 x i32> @false_undef_vec( +; CHECK-SAME: i1 [[COND:%.*]], <2 x i32> [[X:%.*]]) { +; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], <2 x i32> [[X]], <2 x i32> undef ; CHECK-NEXT: ret <2 x i32> [[S]] ; %s = select i1 %cond, <2 x i32> %x, <2 x i32> undef @@ -2587,8 +2742,9 @@ define <2 x i32> @false_undef_vec(i1 %cond, <2 x i32> %x) { } define <2 x i32> @true_undef_vec(i1 %cond, <2 x i32> %x) { -; CHECK-LABEL: @true_undef_vec( -; CHECK-NEXT: [[S:%.*]] = select i1 [[COND:%.*]], <2 x i32> undef, <2 x i32> [[X:%.*]] +; CHECK-LABEL: define <2 x i32> @true_undef_vec( +; CHECK-SAME: i1 [[COND:%.*]], <2 x i32> [[X:%.*]]) { +; CHECK-NEXT: [[S:%.*]] = select i1 [[COND]], <2 x i32> undef, <2 x i32> [[X]] ; CHECK-NEXT: ret <2 x i32> [[S]] ; %s = select i1 %cond, <2 x i32> undef, <2 x i32> %x @@ -2596,8 +2752,9 @@ define <2 x i32> @true_undef_vec(i1 %cond, <2 x i32> %x) { } define i8 @cond_freeze(i8 %x, i8 %y) { -; CHECK-LABEL: @cond_freeze( -; CHECK-NEXT: ret i8 [[Y:%.*]] +; CHECK-LABEL: define i8 @cond_freeze( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: ret i8 [[Y]] ; %cond.fr = freeze i1 undef %s = select i1 %cond.fr, i8 %x, i8 %y @@ -2605,7 +2762,8 @@ define i8 @cond_freeze(i8 %x, i8 %y) { } define i8 @cond_freeze_constant_false_val(i8 %x) { -; CHECK-LABEL: @cond_freeze_constant_false_val( +; CHECK-LABEL: define i8 @cond_freeze_constant_false_val( +; CHECK-SAME: i8 [[X:%.*]]) { ; CHECK-NEXT: ret i8 1 ; %cond.fr = freeze i1 undef @@ -2614,7 +2772,8 @@ define i8 @cond_freeze_constant_false_val(i8 %x) { } define i8 @cond_freeze_constant_true_val(i8 %x) { -; CHECK-LABEL: @cond_freeze_constant_true_val( +; CHECK-LABEL: define i8 @cond_freeze_constant_true_val( +; CHECK-SAME: i8 [[X:%.*]]) { ; CHECK-NEXT: ret i8 1 ; %cond.fr = freeze i1 undef @@ -2623,7 +2782,7 @@ define i8 @cond_freeze_constant_true_val(i8 %x) { } define i8 @cond_freeze_both_arms_constant() { -; CHECK-LABEL: @cond_freeze_both_arms_constant( +; CHECK-LABEL: define i8 @cond_freeze_both_arms_constant() { ; CHECK-NEXT: ret i8 42 ; %cond.fr = freeze i1 undef @@ -2632,7 +2791,8 @@ define i8 @cond_freeze_both_arms_constant() { } define <2 x i8> @cond_freeze_constant_true_val_vec(<2 x i8> %x) { -; CHECK-LABEL: @cond_freeze_constant_true_val_vec( +; CHECK-LABEL: define <2 x i8> @cond_freeze_constant_true_val_vec( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { ; CHECK-NEXT: ret <2 x i8> <i8 1, i8 2> ; %cond.fr = freeze <2 x i1> <i1 undef, i1 undef> @@ -2641,7 +2801,8 @@ define <2 x i8> @cond_freeze_constant_true_val_vec(<2 x i8> %x) { } define <2 x i8> @partial_cond_freeze_constant_true_val_vec(<2 x i8> %x) { -; CHECK-LABEL: @partial_cond_freeze_constant_true_val_vec( +; CHECK-LABEL: define <2 x i8> @partial_cond_freeze_constant_true_val_vec( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { ; CHECK-NEXT: ret <2 x i8> <i8 1, i8 2> ; %cond.fr = freeze <2 x i1> <i1 true, i1 undef> @@ -2650,8 +2811,9 @@ define <2 x i8> @partial_cond_freeze_constant_true_val_vec(<2 x i8> %x) { } define <2 x i8> @partial_cond_freeze_constant_false_val_vec(<2 x i8> %x) { -; CHECK-LABEL: @partial_cond_freeze_constant_false_val_vec( -; CHECK-NEXT: ret <2 x i8> [[X:%.*]] +; CHECK-LABEL: define <2 x i8> @partial_cond_freeze_constant_false_val_vec( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { +; CHECK-NEXT: ret <2 x i8> [[X]] ; %cond.fr = freeze <2 x i1> <i1 true, i1 undef> %s = select <2 x i1> %cond.fr, <2 x i8> %x, <2 x i8> <i8 1, i8 2> @@ -2659,7 +2821,7 @@ define <2 x i8> @partial_cond_freeze_constant_false_val_vec(<2 x i8> %x) { } define <2 x i8> @partial_cond_freeze_both_arms_constant_vec() { -; CHECK-LABEL: @partial_cond_freeze_both_arms_constant_vec( +; CHECK-LABEL: define <2 x i8> @partial_cond_freeze_both_arms_constant_vec() { ; CHECK-NEXT: ret <2 x i8> <i8 42, i8 43> ; %cond.fr = freeze <2 x i1> <i1 false, i1 undef> @@ -2670,8 +2832,9 @@ define <2 x i8> @partial_cond_freeze_both_arms_constant_vec() { declare void @foo2(i8, i8) define void @cond_freeze_multipleuses(i8 %x, i8 %y) { -; CHECK-LABEL: @cond_freeze_multipleuses( -; CHECK-NEXT: call void @foo2(i8 [[Y:%.*]], i8 [[X:%.*]]) +; CHECK-LABEL: define void @cond_freeze_multipleuses( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: call void @foo2(i8 [[Y]], i8 [[X]]) ; CHECK-NEXT: ret void ; %cond.fr = freeze i1 undef @@ -2682,8 +2845,10 @@ define void @cond_freeze_multipleuses(i8 %x, i8 %y) { } define i32 @select_freeze_icmp_eq(i32 %x, i32 %y) { -; CHECK-LABEL: @select_freeze_icmp_eq( -; CHECK-NEXT: ret i32 [[Y:%.*]] +; CHECK-LABEL: define i32 @select_freeze_icmp_eq( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: ret i32 [[Y_FR]] ; %c = icmp eq i32 %x, %y %c.fr = freeze i1 %c @@ -2692,8 +2857,10 @@ define i32 @select_freeze_icmp_eq(i32 %x, i32 %y) { } define i32 @select_freeze_icmp_ne(i32 %x, i32 %y) { -; CHECK-LABEL: @select_freeze_icmp_ne( -; CHECK-NEXT: ret i32 [[X:%.*]] +; CHECK-LABEL: define i32 @select_freeze_icmp_ne( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]] +; CHECK-NEXT: ret i32 [[X_FR]] ; %c = icmp ne i32 %x, %y %c.fr = freeze i1 %c @@ -2702,10 +2869,11 @@ define i32 @select_freeze_icmp_ne(i32 %x, i32 %y) { } define i32 @select_freeze_icmp_else(i32 %x, i32 %y) { -; CHECK-LABEL: @select_freeze_icmp_else( -; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]] -; CHECK-NEXT: [[V:%.*]] = select i1 [[C_FR]], i32 [[X]], i32 [[Y]] +; CHECK-LABEL: define i32 @select_freeze_icmp_else( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]] +; CHECK-NEXT: [[V:%.*]] = call i32 @llvm.umin.i32(i32 [[X_FR]], i32 [[Y_FR]]) ; CHECK-NEXT: ret i32 [[V]] ; %c = icmp ult i32 %x, %y @@ -2717,10 +2885,11 @@ define i32 @select_freeze_icmp_else(i32 %x, i32 %y) { declare void @use_i1_i32(i1, i32) define void @select_freeze_icmp_multuses(i32 %x, i32 %y) { -; CHECK-LABEL: @select_freeze_icmp_multuses( -; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]] -; CHECK-NEXT: [[V:%.*]] = select i1 [[C_FR]], i32 [[X]], i32 [[Y]] +; CHECK-LABEL: define void @select_freeze_icmp_multuses( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[V:%.*]] = freeze i32 [[X]] +; CHECK-NEXT: [[C_FR:%.*]] = icmp ne i32 [[V]], [[Y_FR]] ; CHECK-NEXT: call void @use_i1_i32(i1 [[C_FR]], i32 [[V]]) ; CHECK-NEXT: ret void ; @@ -2732,8 +2901,9 @@ define void @select_freeze_icmp_multuses(i32 %x, i32 %y) { } define i32 @pr47322_more_poisonous_replacement(i32 %arg) { -; CHECK-LABEL: @pr47322_more_poisonous_replacement( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[ARG:%.*]], 0 +; CHECK-LABEL: define i32 @pr47322_more_poisonous_replacement( +; CHECK-SAME: i32 [[ARG:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[ARG]], 0 ; CHECK-NEXT: [[TRAILING:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG]], i1 true) ; CHECK-NEXT: [[SHIFTED:%.*]] = lshr exact i32 [[ARG]], [[TRAILING]] ; CHECK-NEXT: [[R1_SROA_0_1:%.*]] = select i1 [[CMP]], i32 0, i32 [[SHIFTED]] @@ -2747,9 +2917,10 @@ define i32 @pr47322_more_poisonous_replacement(i32 %arg) { } define i8 @select_replacement_add_eq(i8 %x, i8 %y) { -; CHECK-LABEL: @select_replacement_add_eq( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 1 -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 2, i8 [[Y:%.*]] +; CHECK-LABEL: define i8 @select_replacement_add_eq( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], 1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 2, i8 [[Y]] ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp eq i8 %x, 1 @@ -2759,9 +2930,10 @@ define i8 @select_replacement_add_eq(i8 %x, i8 %y) { } define <2 x i8> @select_replacement_add_eq_vec(<2 x i8> %x, <2 x i8> %y) { -; CHECK-LABEL: @select_replacement_add_eq_vec( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], splat (i8 1) -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> splat (i8 2), <2 x i8> [[Y:%.*]] +; CHECK-LABEL: define <2 x i8> @select_replacement_add_eq_vec( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], splat (i8 1) +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> splat (i8 2), <2 x i8> [[Y]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 1, i8 1> @@ -2771,9 +2943,10 @@ define <2 x i8> @select_replacement_add_eq_vec(<2 x i8> %x, <2 x i8> %y) { } define <2 x i8> @select_replacement_add_eq_vec_nonuniform(<2 x i8> %x, <2 x i8> %y) { -; CHECK-LABEL: @select_replacement_add_eq_vec_nonuniform( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 1, i8 2> -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 4, i8 6>, <2 x i8> [[Y:%.*]] +; CHECK-LABEL: define <2 x i8> @select_replacement_add_eq_vec_nonuniform( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], <i8 1, i8 2> +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 4, i8 6>, <2 x i8> [[Y]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 1, i8 2> @@ -2783,9 +2956,10 @@ define <2 x i8> @select_replacement_add_eq_vec_nonuniform(<2 x i8> %x, <2 x i8> } define <2 x i8> @select_replacement_add_eq_vec_poison(<2 x i8> %x, <2 x i8> %y) { -; CHECK-LABEL: @select_replacement_add_eq_vec_poison( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 1, i8 poison> -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 poison>, <2 x i8> [[Y:%.*]] +; CHECK-LABEL: define <2 x i8> @select_replacement_add_eq_vec_poison( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], <i8 1, i8 poison> +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 poison>, <2 x i8> [[Y]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 1, i8 poison> @@ -2795,10 +2969,11 @@ define <2 x i8> @select_replacement_add_eq_vec_poison(<2 x i8> %x, <2 x i8> %y) } define <2 x i8> @select_replacement_add_eq_vec_undef(<2 x i8> %x, <2 x i8> %y) { -; CHECK-LABEL: @select_replacement_add_eq_vec_undef( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 1, i8 undef> +; CHECK-LABEL: define <2 x i8> @select_replacement_add_eq_vec_undef( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], <i8 1, i8 undef> ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], splat (i8 1) -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> [[Y:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> [[Y]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 1, i8 undef> @@ -2808,9 +2983,10 @@ define <2 x i8> @select_replacement_add_eq_vec_undef(<2 x i8> %x, <2 x i8> %y) { } define <2 x i8> @select_replacement_add_eq_vec_undef_okay(<2 x i8> %x, <2 x i8> %y) { -; CHECK-LABEL: @select_replacement_add_eq_vec_undef_okay( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], splat (i8 1) -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 undef>, <2 x i8> [[Y:%.*]] +; CHECK-LABEL: define <2 x i8> @select_replacement_add_eq_vec_undef_okay( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], splat (i8 1) +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 undef>, <2 x i8> [[Y]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 1, i8 1> @@ -2821,10 +2997,11 @@ define <2 x i8> @select_replacement_add_eq_vec_undef_okay(<2 x i8> %x, <2 x i8> define <2 x i8> @select_replacement_add_eq_vec_undef_okay_todo(<2 x i8> %x, <2 x i8> %y) { -; CHECK-LABEL: @select_replacement_add_eq_vec_undef_okay_todo( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 1, i8 undef> +; CHECK-LABEL: define <2 x i8> @select_replacement_add_eq_vec_undef_okay_todo( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], <i8 1, i8 undef> ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], <i8 1, i8 undef> -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> [[Y:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> [[Y]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 1, i8 undef> @@ -2834,9 +3011,10 @@ define <2 x i8> @select_replacement_add_eq_vec_undef_okay_todo(<2 x i8> %x, <2 x } define <2 x i8> @select_replacement_xor_eq_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { -; CHECK-LABEL: @select_replacement_xor_eq_vec( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> zeroinitializer, <2 x i8> [[Z:%.*]] +; CHECK-LABEL: define <2 x i8> @select_replacement_xor_eq_vec( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]], <2 x i8> [[Z:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> zeroinitializer, <2 x i8> [[Z]] ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, %y @@ -2847,10 +3025,11 @@ define <2 x i8> @select_replacement_xor_eq_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8 define i8 @select_replacement_add_ne(i8 %x, i8 %y) { -; CHECK-LABEL: @select_replacement_add_ne( -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], 1 +; CHECK-LABEL: define i8 @select_replacement_add_ne( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], 1 ; CHECK-NEXT: call void @use(i1 [[CMP]]) -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Y:%.*]], i8 2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 2 ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp ne i8 %x, 1 @@ -2861,9 +3040,10 @@ define i8 @select_replacement_add_ne(i8 %x, i8 %y) { } define i8 @select_replacement_add_nuw(i8 %x, i8 %y) { -; CHECK-LABEL: @select_replacement_add_nuw( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 1 -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 2, i8 [[Y:%.*]] +; CHECK-LABEL: define i8 @select_replacement_add_nuw( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], 1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 2, i8 [[Y]] ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp eq i8 %x, 1 @@ -2873,9 +3053,10 @@ define i8 @select_replacement_add_nuw(i8 %x, i8 %y) { } define i8 @select_replacement_sub_noundef(i8 %x, i8 noundef %y, i8 %z) { -; CHECK-LABEL: @select_replacement_sub_noundef( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Z:%.*]] +; CHECK-LABEL: define i8 @select_replacement_sub_noundef( +; CHECK-SAME: i8 [[X:%.*]], i8 noundef [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Z]] ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp eq i8 %x, %y @@ -2885,10 +3066,11 @@ define i8 @select_replacement_sub_noundef(i8 %x, i8 noundef %y, i8 %z) { } define i8 @select_replacement_sub_noundef_but_may_be_poison(i8 %x, i8 noundef %yy, i8 %z) { -; CHECK-LABEL: @select_replacement_sub_noundef_but_may_be_poison( -; CHECK-NEXT: [[Y:%.*]] = shl nuw i8 [[YY:%.*]], 1 -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y]] -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Z:%.*]] +; CHECK-LABEL: define i8 @select_replacement_sub_noundef_but_may_be_poison( +; CHECK-SAME: i8 [[X:%.*]], i8 noundef [[YY:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[Y:%.*]] = shl nuw i8 [[YY]], 1 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Z]] ; CHECK-NEXT: ret i8 [[SEL]] ; %y = shl nuw i8 %yy, 1 @@ -2900,9 +3082,10 @@ define i8 @select_replacement_sub_noundef_but_may_be_poison(i8 %x, i8 noundef %y ; TODO: The transform is also safe without noundef. define i8 @select_replacement_sub(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @select_replacement_sub( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Z:%.*]] +; CHECK-LABEL: define i8 @select_replacement_sub( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Z]] ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp eq i8 %x, %y @@ -2913,12 +3096,13 @@ define i8 @select_replacement_sub(i8 %x, i8 %y, i8 %z) { ; FIXME: This is safe to fold. define i8 @select_replacement_shift_noundef(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @select_replacement_shift_noundef( -; CHECK-NEXT: [[SHR:%.*]] = lshr exact i8 [[X:%.*]], 1 +; CHECK-LABEL: define i8 @select_replacement_shift_noundef( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[SHR:%.*]] = lshr exact i8 [[X]], 1 ; CHECK-NEXT: call void @use_i8(i8 noundef [[SHR]]) -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SHR]], [[Y:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SHR]], [[Y]] ; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[Y]], 1 -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[SHL]], i8 [[Z:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[SHL]], i8 [[Z]] ; CHECK-NEXT: ret i8 [[SEL]] ; %shr = lshr exact i8 %x, 1 @@ -2931,11 +3115,12 @@ define i8 @select_replacement_shift_noundef(i8 %x, i8 %y, i8 %z) { ; TODO: The transform is also safe without noundef. define i8 @select_replacement_shift(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @select_replacement_shift( -; CHECK-NEXT: [[SHR:%.*]] = lshr exact i8 [[X:%.*]], 1 -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SHR]], [[Y:%.*]] +; CHECK-LABEL: define i8 @select_replacement_shift( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[SHR:%.*]] = lshr exact i8 [[X]], 1 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SHR]], [[Y]] ; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[Y]], 1 -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[SHL]], i8 [[Z:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[SHL]], i8 [[Z]] ; CHECK-NEXT: ret i8 [[SEL]] ; %shr = lshr exact i8 %x, 1 @@ -2946,9 +3131,10 @@ define i8 @select_replacement_shift(i8 %x, i8 %y, i8 %z) { } define i8 @select_replacement_loop(i8 %x, i8 %y, i8 %z) { -; CHECK-LABEL: @select_replacement_loop( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[X]], i8 [[Z:%.*]] +; CHECK-LABEL: define i8 @select_replacement_loop( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[X]], i8 [[Z]] ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp eq i8 %x, %y @@ -2957,8 +3143,9 @@ define i8 @select_replacement_loop(i8 %x, i8 %y, i8 %z) { } define i32 @select_replacement_loop2(i32 %arg, i32 %arg2) { -; CHECK-LABEL: @select_replacement_loop2( -; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ARG:%.*]], [[ARG2:%.*]] +; CHECK-LABEL: define i32 @select_replacement_loop2( +; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG2:%.*]]) { +; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ARG]], [[ARG2]] ; CHECK-NEXT: ret i32 [[DIV]] ; %div = udiv i32 %arg, %arg2 @@ -2969,8 +3156,9 @@ define i32 @select_replacement_loop2(i32 %arg, i32 %arg2) { } define i8 @select_replacement_loop3(i32 noundef %x) { -; CHECK-LABEL: @select_replacement_loop3( -; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[X:%.*]] to i8 +; CHECK-LABEL: define i8 @select_replacement_loop3( +; CHECK-SAME: i32 noundef [[X:%.*]]) { +; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[X]] to i8 ; CHECK-NEXT: [[REV:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TRUNC]]) ; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[REV]] to i32 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], [[EXT]] @@ -2986,10 +3174,11 @@ define i8 @select_replacement_loop3(i32 noundef %x) { } define i16 @select_replacement_loop4(i16 noundef %p_12) { -; CHECK-LABEL: @select_replacement_loop4( -; CHECK-NEXT: [[P_12:%.*]] = call i16 @llvm.umin.i16(i16 [[P_13:%.*]], i16 2) -; CHECK-NEXT: [[AND1:%.*]] = and i16 [[P_12]], 1 -; CHECK-NEXT: ret i16 [[AND1]] +; CHECK-LABEL: define i16 @select_replacement_loop4( +; CHECK-SAME: i16 noundef [[P_12:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.umin.i16(i16 [[P_12]], i16 2) +; CHECK-NEXT: [[AND3:%.*]] = and i16 [[TMP1]], 1 +; CHECK-NEXT: ret i16 [[AND3]] ; %cmp1 = icmp ult i16 %p_12, 2 %and1 = and i16 %p_12, 1 @@ -3000,8 +3189,9 @@ define i16 @select_replacement_loop4(i16 noundef %p_12) { } define ptr @select_replacement_gep_inbounds(ptr %base, i64 %offset) { -; CHECK-LABEL: @select_replacement_gep_inbounds( -; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i64 [[OFFSET:%.*]] +; CHECK-LABEL: define ptr @select_replacement_gep_inbounds( +; CHECK-SAME: ptr [[BASE:%.*]], i64 [[OFFSET:%.*]]) { +; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[BASE]], i64 [[OFFSET]] ; CHECK-NEXT: ret ptr [[GEP]] ; %cmp = icmp eq i64 %offset, 0 @@ -3011,8 +3201,9 @@ define ptr @select_replacement_gep_inbounds(ptr %base, i64 %offset) { } define i8 @replace_false_op_eq_shl_or_disjoint(i8 %x) { -; CHECK-LABEL: @replace_false_op_eq_shl_or_disjoint( -; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X:%.*]], 3 +; CHECK-LABEL: define i8 @replace_false_op_eq_shl_or_disjoint( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X]], 3 ; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], [[SHL]] ; CHECK-NEXT: ret i8 [[OR]] ; @@ -3024,8 +3215,9 @@ define i8 @replace_false_op_eq_shl_or_disjoint(i8 %x) { } define i8 @select_or_disjoint_eq(i8 %x, i8 %y) { -; CHECK-LABEL: @select_or_disjoint_eq( -; CHECK-NEXT: [[OR:%.*]] = or i8 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i8 @select_or_disjoint_eq( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], [[Y]] ; CHECK-NEXT: ret i8 [[OR]] ; %cmp = icmp eq i8 %x, %y @@ -3035,7 +3227,8 @@ define i8 @select_or_disjoint_eq(i8 %x, i8 %y) { } define <2 x i1> @partial_true_undef_condval(<2 x i1> %x) { -; CHECK-LABEL: @partial_true_undef_condval( +; CHECK-LABEL: define <2 x i1> @partial_true_undef_condval( +; CHECK-SAME: <2 x i1> [[X:%.*]]) { ; CHECK-NEXT: ret <2 x i1> <i1 true, i1 poison> ; %r = select <2 x i1> <i1 true, i1 poison>, <2 x i1> <i1 true, i1 poison>, <2 x i1> %x @@ -3043,7 +3236,8 @@ define <2 x i1> @partial_true_undef_condval(<2 x i1> %x) { } define <2 x i1> @partial_false_undef_condval(<2 x i1> %x) { -; CHECK-LABEL: @partial_false_undef_condval( +; CHECK-LABEL: define <2 x i1> @partial_false_undef_condval( +; CHECK-SAME: <2 x i1> [[X:%.*]]) { ; CHECK-NEXT: ret <2 x i1> <i1 false, i1 poison> ; %r = select <2 x i1> <i1 false, i1 poison>, <2 x i1> %x, <2 x i1> <i1 false, i1 poison> @@ -3052,9 +3246,10 @@ define <2 x i1> @partial_false_undef_condval(<2 x i1> %x) { ; select (x == 0), 0, x * y --> freeze(y) * x define i32 @mul_select_eq_zero(i32 %x, i32 %y) { -; CHECK-LABEL: @mul_select_eq_zero( -; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul i32 [[X:%.*]], [[Y_FR]] +; CHECK-LABEL: define i32 @mul_select_eq_zero( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[M:%.*]] = mul i32 [[X]], [[Y_FR]] ; CHECK-NEXT: ret i32 [[M]] ; %c = icmp eq i32 %x, 0 @@ -3065,9 +3260,10 @@ define i32 @mul_select_eq_zero(i32 %x, i32 %y) { ; select (y == 0), 0, x * y --> freeze(x) * y define i32 @mul_select_eq_zero_commute(i32 %x, i32 %y) { -; CHECK-LABEL: @mul_select_eq_zero_commute( -; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul i32 [[X_FR]], [[Y:%.*]] +; CHECK-LABEL: define i32 @mul_select_eq_zero_commute( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]] +; CHECK-NEXT: [[M:%.*]] = mul i32 [[X_FR]], [[Y]] ; CHECK-NEXT: ret i32 [[M]] ; %c = icmp eq i32 %y, 0 @@ -3078,9 +3274,10 @@ define i32 @mul_select_eq_zero_commute(i32 %x, i32 %y) { ; Check that mul's flags preserved during the transformation. define i32 @mul_select_eq_zero_copy_flags(i32 %x, i32 %y) { -; CHECK-LABEL: @mul_select_eq_zero_copy_flags( -; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[X:%.*]], [[Y_FR]] +; CHECK-LABEL: define i32 @mul_select_eq_zero_copy_flags( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[X]], [[Y_FR]] ; CHECK-NEXT: ret i32 [[M]] ; %c = icmp eq i32 %x, 0 @@ -3092,9 +3289,10 @@ define i32 @mul_select_eq_zero_copy_flags(i32 %x, i32 %y) { ; Check that the transformation could be applied after condition's inversion. ; select (x != 0), x * y, 0 --> freeze(y) * x define i32 @mul_select_ne_zero(i32 %x, i32 %y) { -; CHECK-LABEL: @mul_select_ne_zero( -; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[X:%.*]], 0 -; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y:%.*]] +; CHECK-LABEL: define i32 @mul_select_ne_zero( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[X]], 0 +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] ; CHECK-NEXT: [[M:%.*]] = mul i32 [[X]], [[Y_FR]] ; CHECK-NEXT: call void @use(i1 [[C]]) ; CHECK-NEXT: ret i32 [[M]] @@ -3110,9 +3308,10 @@ define i32 @mul_select_ne_zero(i32 %x, i32 %y) { ; an expression could be folded into mul as if there was a 0 instead of undef. ; select (x == 0), undef, x * y --> freeze(y) * x define i32 @mul_select_eq_zero_sel_undef(i32 %x, i32 %y) { -; CHECK-LABEL: @mul_select_eq_zero_sel_undef( -; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul i32 [[X:%.*]], [[Y_FR]] +; CHECK-LABEL: define i32 @mul_select_eq_zero_sel_undef( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[M:%.*]] = mul i32 [[X]], [[Y_FR]] ; CHECK-NEXT: ret i32 [[M]] ; %c = icmp eq i32 %x, 0 @@ -3124,9 +3323,10 @@ define i32 @mul_select_eq_zero_sel_undef(i32 %x, i32 %y) { ; Check that the transformation is applied disregard to a number ; of expression's users. define i32 @mul_select_eq_zero_multiple_users(i32 %x, i32 %y) { -; CHECK-LABEL: @mul_select_eq_zero_multiple_users( -; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul i32 [[X:%.*]], [[Y_FR]] +; CHECK-LABEL: define i32 @mul_select_eq_zero_multiple_users( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT: [[M:%.*]] = mul i32 [[X]], [[Y_FR]] ; CHECK-NEXT: call void @use_i32(i32 [[M]]) ; CHECK-NEXT: call void @use_i32(i32 [[M]]) ; CHECK-NEXT: call void @use_i32(i32 [[M]]) @@ -3144,9 +3344,10 @@ define i32 @mul_select_eq_zero_multiple_users(i32 %x, i32 %y) { ; Negative test: select's condition is unrelated to multiplied values, ; so the transformation should not be applied. define i32 @mul_select_eq_zero_unrelated_condition(i32 %x, i32 %y, i32 %z) { -; CHECK-LABEL: @mul_select_eq_zero_unrelated_condition( -; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[Z:%.*]], 0 -; CHECK-NEXT: [[M:%.*]] = mul i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @mul_select_eq_zero_unrelated_condition( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[Z]], 0 +; CHECK-NEXT: [[M:%.*]] = mul i32 [[X]], [[Y]] ; CHECK-NEXT: [[R:%.*]] = select i1 [[C]], i32 0, i32 [[M]] ; CHECK-NEXT: ret i32 [[R]] ; @@ -3158,9 +3359,10 @@ define i32 @mul_select_eq_zero_unrelated_condition(i32 %x, i32 %y, i32 %z) { ; select (<k x elt> x == 0), <k x elt> 0, <k x elt> x * y --> freeze(y) * x define <4 x i32> @mul_select_eq_zero_vector(<4 x i32> %x, <4 x i32> %y) { -; CHECK-LABEL: @mul_select_eq_zero_vector( -; CHECK-NEXT: [[Y_FR:%.*]] = freeze <4 x i32> [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul <4 x i32> [[X:%.*]], [[Y_FR]] +; CHECK-LABEL: define <4 x i32> @mul_select_eq_zero_vector( +; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze <4 x i32> [[Y]] +; CHECK-NEXT: [[M:%.*]] = mul <4 x i32> [[X]], [[Y_FR]] ; CHECK-NEXT: ret <4 x i32> [[M]] ; %c = icmp eq <4 x i32> %x, zeroinitializer @@ -3173,9 +3375,10 @@ define <4 x i32> @mul_select_eq_zero_vector(<4 x i32> %x, <4 x i32> %y) { ; is a vector consisting of zeros and poisons. ; select (<k x elt> x == {0, poison, ...}), <k x elt> 0, <k x elt> x * y --> freeze(y) * x define <2 x i32> @mul_select_eq_poison_vector(<2 x i32> %x, <2 x i32> %y) { -; CHECK-LABEL: @mul_select_eq_poison_vector( -; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i32> [[X:%.*]], <i32 0, i32 poison> -; CHECK-NEXT: [[M:%.*]] = mul <2 x i32> [[X]], [[Y:%.*]] +; CHECK-LABEL: define <2 x i32> @mul_select_eq_poison_vector( +; CHECK-SAME: <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i32> [[X]], <i32 0, i32 poison> +; CHECK-NEXT: [[M:%.*]] = mul <2 x i32> [[X]], [[Y]] ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C]], <2 x i32> <i32 0, i32 42>, <2 x i32> [[M]] ; CHECK-NEXT: ret <2 x i32> [[R]] ; @@ -3189,9 +3392,10 @@ define <2 x i32> @mul_select_eq_poison_vector(<2 x i32> %x, <2 x i32> %y) { ; is a vector consisting of zeros and poisons. ; select (<k x elt> x == 0), <k x elt> {0, poison, ...}, <k x elt> x * y --> freeze(y) * x define <2 x i32> @mul_select_eq_zero_sel_poison_vector(<2 x i32> %x, <2 x i32> %y) { -; CHECK-LABEL: @mul_select_eq_zero_sel_poison_vector( -; CHECK-NEXT: [[Y_FR:%.*]] = freeze <2 x i32> [[Y:%.*]] -; CHECK-NEXT: [[M:%.*]] = mul <2 x i32> [[X:%.*]], [[Y_FR]] +; CHECK-LABEL: define <2 x i32> @mul_select_eq_zero_sel_poison_vector( +; CHECK-SAME: <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]]) { +; CHECK-NEXT: [[Y_FR:%.*]] = freeze <2 x i32> [[Y]] +; CHECK-NEXT: [[M:%.*]] = mul <2 x i32> [[X]], [[Y_FR]] ; CHECK-NEXT: ret <2 x i32> [[M]] ; %c = icmp eq <2 x i32> %x, zeroinitializer @@ -3203,9 +3407,10 @@ define <2 x i32> @mul_select_eq_zero_sel_poison_vector(<2 x i32> %x, <2 x i32> % ; Negative test: select should not be folded into mul because ; condition's operand and select's operand do not merge into zero vector. define <2 x i32> @mul_select_eq_poison_vector_not_merging_to_zero(<2 x i32> %x, <2 x i32> %y) { -; CHECK-LABEL: @mul_select_eq_poison_vector_not_merging_to_zero( -; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i32> [[X:%.*]], <i32 0, i32 poison> -; CHECK-NEXT: [[M:%.*]] = mul <2 x i32> [[X]], [[Y:%.*]] +; CHECK-LABEL: define <2 x i32> @mul_select_eq_poison_vector_not_merging_to_zero( +; CHECK-SAME: <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i32> [[X]], <i32 0, i32 poison> +; CHECK-NEXT: [[M:%.*]] = mul <2 x i32> [[X]], [[Y]] ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C]], <2 x i32> <i32 1, i32 0>, <2 x i32> [[M]] ; CHECK-NEXT: ret <2 x i32> [[R]] ; @@ -3216,8 +3421,9 @@ define <2 x i32> @mul_select_eq_poison_vector_not_merging_to_zero(<2 x i32> %x, } define i8 @ne0_is_all_ones(i8 %x) { -; CHECK-LABEL: @ne0_is_all_ones( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i8 [[X:%.*]], 0 +; CHECK-LABEL: define i8 @ne0_is_all_ones( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i8 [[X]], 0 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[TMP1]] to i8 ; CHECK-NEXT: ret i8 [[R]] ; @@ -3228,8 +3434,9 @@ define i8 @ne0_is_all_ones(i8 %x) { } define i8 @ne0_is_all_ones_use1(i8 %x) { -; CHECK-LABEL: @ne0_is_all_ones_use1( -; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X:%.*]] +; CHECK-LABEL: define i8 @ne0_is_all_ones_use1( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X]] ; CHECK-NEXT: call void @use_i8(i8 [[NEGX]]) ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i8 [[X]], 0 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[TMP1]] to i8 @@ -3245,8 +3452,9 @@ define i8 @ne0_is_all_ones_use1(i8 %x) { ; negative test define i8 @ne0_is_all_ones_use2(i8 %x) { -; CHECK-LABEL: @ne0_is_all_ones_use2( -; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X:%.*]] +; CHECK-LABEL: define i8 @ne0_is_all_ones_use2( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X]] ; CHECK-NEXT: [[UGT1:%.*]] = icmp ugt i8 [[X]], 1 ; CHECK-NEXT: call void @use(i1 [[UGT1]]) ; CHECK-NEXT: [[R:%.*]] = select i1 [[UGT1]], i8 -1, i8 [[NEGX]] @@ -3262,8 +3470,9 @@ define i8 @ne0_is_all_ones_use2(i8 %x) { ; negative test define i8 @ne0_is_all_ones_wrong_pred(i8 %x) { -; CHECK-LABEL: @ne0_is_all_ones_wrong_pred( -; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X:%.*]] +; CHECK-LABEL: define i8 @ne0_is_all_ones_wrong_pred( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X]] ; CHECK-NEXT: [[UGT1:%.*]] = icmp sgt i8 [[X]], 2 ; CHECK-NEXT: [[R:%.*]] = select i1 [[UGT1]], i8 -1, i8 [[NEGX]] ; CHECK-NEXT: ret i8 [[R]] @@ -3277,8 +3486,9 @@ define i8 @ne0_is_all_ones_wrong_pred(i8 %x) { ; negative test define i8 @ne0_is_all_ones_wrong_cmp(i8 %x) { -; CHECK-LABEL: @ne0_is_all_ones_wrong_cmp( -; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X:%.*]] +; CHECK-LABEL: define i8 @ne0_is_all_ones_wrong_cmp( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X]] ; CHECK-NEXT: [[UGT1:%.*]] = icmp ugt i8 [[X]], 2 ; CHECK-NEXT: [[R:%.*]] = select i1 [[UGT1]], i8 -1, i8 [[NEGX]] ; CHECK-NEXT: ret i8 [[R]] @@ -3292,8 +3502,9 @@ define i8 @ne0_is_all_ones_wrong_cmp(i8 %x) { ; negative test define i8 @ne0_is_all_ones_wrong_sel(i8 %x) { -; CHECK-LABEL: @ne0_is_all_ones_wrong_sel( -; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X:%.*]] +; CHECK-LABEL: define i8 @ne0_is_all_ones_wrong_sel( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X]] ; CHECK-NEXT: [[UGT1:%.*]] = icmp ugt i8 [[X]], 2 ; CHECK-NEXT: [[R:%.*]] = select i1 [[UGT1]], i8 1, i8 [[NEGX]] ; CHECK-NEXT: ret i8 [[R]] @@ -3305,8 +3516,9 @@ define i8 @ne0_is_all_ones_wrong_sel(i8 %x) { } define <2 x i8> @ne0_is_all_ones_swap_vec(<2 x i8> %x) { -; CHECK-LABEL: @ne0_is_all_ones_swap_vec( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer +; CHECK-LABEL: define <2 x i8> @ne0_is_all_ones_swap_vec( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[X]], zeroinitializer ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i8> ; CHECK-NEXT: ret <2 x i8> [[R]] ; @@ -3317,8 +3529,9 @@ define <2 x i8> @ne0_is_all_ones_swap_vec(<2 x i8> %x) { } define <2 x i8> @ne0_is_all_ones_swap_vec_poison(<2 x i8> %x) { -; CHECK-LABEL: @ne0_is_all_ones_swap_vec_poison( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer +; CHECK-LABEL: define <2 x i8> @ne0_is_all_ones_swap_vec_poison( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[X]], zeroinitializer ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i8> ; CHECK-NEXT: ret <2 x i8> [[R]] ; @@ -3329,8 +3542,9 @@ define <2 x i8> @ne0_is_all_ones_swap_vec_poison(<2 x i8> %x) { } define i64 @udiv_of_select_constexpr(i1 %c, i64 %x) { -; CHECK-LABEL: @udiv_of_select_constexpr( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 [[X:%.*]], i64 ptrtoint (ptr @glbl to i64) +; CHECK-LABEL: define i64 @udiv_of_select_constexpr( +; CHECK-SAME: i1 [[C:%.*]], i64 [[X:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[X]], i64 ptrtoint (ptr @glbl to i64) ; CHECK-NEXT: [[OP:%.*]] = udiv i64 [[SEL]], 3 ; CHECK-NEXT: ret i64 [[OP]] ; @@ -3340,8 +3554,9 @@ define i64 @udiv_of_select_constexpr(i1 %c, i64 %x) { } define i64 @udiv_of_select_constexpr_commuted(i1 %c, i64 %x) { -; CHECK-LABEL: @udiv_of_select_constexpr_commuted( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 ptrtoint (ptr @glbl to i64), i64 [[X:%.*]] +; CHECK-LABEL: define i64 @udiv_of_select_constexpr_commuted( +; CHECK-SAME: i1 [[C:%.*]], i64 [[X:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 ptrtoint (ptr @glbl to i64), i64 [[X]] ; CHECK-NEXT: [[OP:%.*]] = udiv i64 [[SEL]], 3 ; CHECK-NEXT: ret i64 [[OP]] ; @@ -3356,8 +3571,9 @@ declare void @use_i32(i32) declare i32 @llvm.cttz.i32(i32, i1 immarg) define i32 @select_cond_zext_cond(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_zext_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 1, i32 [[B:%.*]] +; CHECK-LABEL: define i32 @select_cond_zext_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 1, i32 [[B]] ; CHECK-NEXT: ret i32 [[SEL]] ; %zext = zext i1 %cond to i32 @@ -3366,8 +3582,9 @@ define i32 @select_cond_zext_cond(i1 %cond, i32 %b) { } define <2 x i32> @select_cond_zext_cond_vec(<2 x i1> %cond, <2 x i32> %b) { -; CHECK-LABEL: @select_cond_zext_cond_vec( -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i32> splat (i32 1), <2 x i32> [[B:%.*]] +; CHECK-LABEL: define <2 x i32> @select_cond_zext_cond_vec( +; CHECK-SAME: <2 x i1> [[COND:%.*]], <2 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND]], <2 x i32> splat (i32 1), <2 x i32> [[B]] ; CHECK-NEXT: ret <2 x i32> [[SEL]] ; %zext = zext <2 x i1> %cond to <2 x i32> @@ -3376,8 +3593,9 @@ define <2 x i32> @select_cond_zext_cond_vec(<2 x i1> %cond, <2 x i32> %b) { } define i32 @select_cond_sext_cond(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_sext_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 -1, i32 [[B:%.*]] +; CHECK-LABEL: define i32 @select_cond_sext_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 -1, i32 [[B]] ; CHECK-NEXT: ret i32 [[SEL]] ; %sext = sext i1 %cond to i32 @@ -3386,8 +3604,9 @@ define i32 @select_cond_sext_cond(i1 %cond, i32 %b) { } define <2 x i32> @select_cond_sext_cond_vec(<2 x i1> %cond, <2 x i32> %b) { -; CHECK-LABEL: @select_cond_sext_cond_vec( -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i32> splat (i32 -1), <2 x i32> [[B:%.*]] +; CHECK-LABEL: define <2 x i32> @select_cond_sext_cond_vec( +; CHECK-SAME: <2 x i1> [[COND:%.*]], <2 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND]], <2 x i32> splat (i32 -1), <2 x i32> [[B]] ; CHECK-NEXT: ret <2 x i32> [[SEL]] ; %sext = sext <2 x i1> %cond to <2 x i32> @@ -3396,8 +3615,9 @@ define <2 x i32> @select_cond_sext_cond_vec(<2 x i1> %cond, <2 x i32> %b) { } define i32 @select_cond_val_zext_cond(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_val_zext_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 [[B:%.*]], i32 0 +; CHECK-LABEL: define i32 @select_cond_val_zext_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[B]], i32 0 ; CHECK-NEXT: ret i32 [[SEL]] ; %zext = zext i1 %cond to i32 @@ -3406,8 +3626,9 @@ define i32 @select_cond_val_zext_cond(i1 %cond, i32 %b) { } define <2 x i32> @select_cond_val_zext_cond_vec(<2 x i1> %cond, <2 x i32> %b) { -; CHECK-LABEL: @select_cond_val_zext_cond_vec( -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i32> [[B:%.*]], <2 x i32> zeroinitializer +; CHECK-LABEL: define <2 x i32> @select_cond_val_zext_cond_vec( +; CHECK-SAME: <2 x i1> [[COND:%.*]], <2 x i32> [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND]], <2 x i32> [[B]], <2 x i32> zeroinitializer ; CHECK-NEXT: ret <2 x i32> [[SEL]] ; %zext = zext <2 x i1> %cond to <2 x i32> @@ -3416,8 +3637,9 @@ define <2 x i32> @select_cond_val_zext_cond_vec(<2 x i1> %cond, <2 x i32> %b) { } define i32 @select_cond_val_sext_cond(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_val_sext_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 [[B:%.*]], i32 0 +; CHECK-LABEL: define i32 @select_cond_val_sext_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[B]], i32 0 ; CHECK-NEXT: ret i32 [[SEL]] ; %sext = sext i1 %cond to i32 @@ -3426,8 +3648,9 @@ define i32 @select_cond_val_sext_cond(i1 %cond, i32 %b) { } define i32 @select_cond_zext_not_cond_val(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_zext_not_cond_val( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 0, i32 [[B:%.*]] +; CHECK-LABEL: define i32 @select_cond_zext_not_cond_val( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 0, i32 [[B]] ; CHECK-NEXT: ret i32 [[SEL]] ; %not_cond = xor i1 %cond, true @@ -3437,8 +3660,9 @@ define i32 @select_cond_zext_not_cond_val(i1 %cond, i32 %b) { } define i32 @select_cond_sext_not_cond_val(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_sext_not_cond_val( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 0, i32 [[B:%.*]] +; CHECK-LABEL: define i32 @select_cond_sext_not_cond_val( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 0, i32 [[B]] ; CHECK-NEXT: ret i32 [[SEL]] ; %not_cond = xor i1 %cond, true @@ -3449,8 +3673,9 @@ define i32 @select_cond_sext_not_cond_val(i1 %cond, i32 %b) { define i32 @select_cond_val_zext_not_cond(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_val_zext_not_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 [[B:%.*]], i32 1 +; CHECK-LABEL: define i32 @select_cond_val_zext_not_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[B]], i32 1 ; CHECK-NEXT: ret i32 [[SEL]] ; %not_cond = xor i1 %cond, true @@ -3460,8 +3685,9 @@ define i32 @select_cond_val_zext_not_cond(i1 %cond, i32 %b) { } define i32 @select_cond_val_sext_not_cond(i1 %cond, i32 %b) { -; CHECK-LABEL: @select_cond_val_sext_not_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i32 [[B:%.*]], i32 -1 +; CHECK-LABEL: define i32 @select_cond_val_sext_not_cond( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], i32 [[B]], i32 -1 ; CHECK-NEXT: ret i32 [[SEL]] ; %not_cond = xor i1 %cond, true @@ -3471,7 +3697,8 @@ define i32 @select_cond_val_sext_not_cond(i1 %cond, i32 %b) { } define i32 @select_cond_not_cond_cond1(i1 %cond) { -; CHECK-LABEL: @select_cond_not_cond_cond1( +; CHECK-LABEL: define i32 @select_cond_not_cond_cond1( +; CHECK-SAME: i1 [[COND:%.*]]) { ; CHECK-NEXT: ret i32 0 ; %z = zext i1 %cond to i32 @@ -3482,7 +3709,8 @@ define i32 @select_cond_not_cond_cond1(i1 %cond) { } define i32 @select_cond_not_cond_cond2(i1 %cond) { -; CHECK-LABEL: @select_cond_not_cond_cond2( +; CHECK-LABEL: define i32 @select_cond_not_cond_cond2( +; CHECK-SAME: i1 [[COND:%.*]]) { ; CHECK-NEXT: ret i32 0 ; %z = sext i1 %cond to i32 @@ -3495,9 +3723,10 @@ define i32 @select_cond_not_cond_cond2(i1 %cond) { ; This previously crashed due to Constant::getUniqueInteger not handling ; scalable vector splat ConstantExprs. define <vscale x 2 x i32> @and_constant_select_svec(<vscale x 2 x i32> %x, <vscale x 2 x i1> %cond) { -; CHECK-LABEL: @and_constant_select_svec( -; CHECK-NEXT: [[A:%.*]] = and <vscale x 2 x i32> [[X:%.*]], splat (i32 1) -; CHECK-NEXT: [[B:%.*]] = select <vscale x 2 x i1> [[COND:%.*]], <vscale x 2 x i32> [[A]], <vscale x 2 x i32> [[X]] +; CHECK-LABEL: define <vscale x 2 x i32> @and_constant_select_svec( +; CHECK-SAME: <vscale x 2 x i32> [[X:%.*]], <vscale x 2 x i1> [[COND:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = and <vscale x 2 x i32> [[X]], splat (i32 1) +; CHECK-NEXT: [[B:%.*]] = select <vscale x 2 x i1> [[COND]], <vscale x 2 x i32> [[A]], <vscale x 2 x i32> [[X]] ; CHECK-NEXT: ret <vscale x 2 x i32> [[B]] ; %a = and <vscale x 2 x i32> %x, splat (i32 1) @@ -3506,8 +3735,9 @@ define <vscale x 2 x i32> @and_constant_select_svec(<vscale x 2 x i32> %x, <vsca } define <vscale x 2 x i32> @scalable_sign_bits(<vscale x 2 x i8> %x) { -; CHECK-LABEL: @scalable_sign_bits( -; CHECK-NEXT: [[A:%.*]] = sext <vscale x 2 x i8> [[X:%.*]] to <vscale x 2 x i32> +; CHECK-LABEL: define <vscale x 2 x i32> @scalable_sign_bits( +; CHECK-SAME: <vscale x 2 x i8> [[X:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = sext <vscale x 2 x i8> [[X]] to <vscale x 2 x i32> ; CHECK-NEXT: [[B:%.*]] = shl nsw <vscale x 2 x i32> [[A]], splat (i32 16) ; CHECK-NEXT: ret <vscale x 2 x i32> [[B]] ; @@ -3517,8 +3747,9 @@ define <vscale x 2 x i32> @scalable_sign_bits(<vscale x 2 x i8> %x) { } define <vscale x 2 x i1> @scalable_non_zero(<vscale x 2 x i32> %x) { -; CHECK-LABEL: @scalable_non_zero( -; CHECK-NEXT: [[CMP:%.*]] = icmp ult <vscale x 2 x i32> [[X:%.*]], splat (i32 56) +; CHECK-LABEL: define <vscale x 2 x i1> @scalable_non_zero( +; CHECK-SAME: <vscale x 2 x i32> [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <vscale x 2 x i32> [[X]], splat (i32 56) ; CHECK-NEXT: ret <vscale x 2 x i1> [[CMP]] ; %a = or <vscale x 2 x i32> %x, splat (i32 1) @@ -3528,8 +3759,9 @@ define <vscale x 2 x i1> @scalable_non_zero(<vscale x 2 x i32> %x) { } define i32 @clamp_umin(i32 %x) { -; CHECK-LABEL: @clamp_umin( -; CHECK-NEXT: [[SEL:%.*]] = call i32 @llvm.umax.i32(i32 [[X:%.*]], i32 1) +; CHECK-LABEL: define i32 @clamp_umin( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1) ; CHECK-NEXT: ret i32 [[SEL]] ; %cmp = icmp eq i32 %x, 0 @@ -3538,8 +3770,9 @@ define i32 @clamp_umin(i32 %x) { } define i32 @clamp_umin_use(i32 %x) { -; CHECK-LABEL: @clamp_umin_use( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0 +; CHECK-LABEL: define i32 @clamp_umin_use( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 0 ; CHECK-NEXT: call void @use1(i1 [[CMP]]) ; CHECK-NEXT: [[SEL:%.*]] = call i32 @llvm.umax.i32(i32 [[X]], i32 1) ; CHECK-NEXT: ret i32 [[SEL]] @@ -3553,8 +3786,9 @@ define i32 @clamp_umin_use(i32 %x) { ; negative test - wrong cmp constant define i32 @not_clamp_umin1(i32 %x) { -; CHECK-LABEL: @not_clamp_umin1( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 2 +; CHECK-LABEL: define i32 @not_clamp_umin1( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 2 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 1, i32 [[X]] ; CHECK-NEXT: ret i32 [[SEL]] ; @@ -3566,8 +3800,9 @@ define i32 @not_clamp_umin1(i32 %x) { ; negative test - wrong select constant define i32 @not_clamp_umin2(i32 %x) { -; CHECK-LABEL: @not_clamp_umin2( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0 +; CHECK-LABEL: define i32 @not_clamp_umin2( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 0 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 -1, i32 [[X]] ; CHECK-NEXT: ret i32 [[SEL]] ; @@ -3577,8 +3812,9 @@ define i32 @not_clamp_umin2(i32 %x) { } define <2 x i8> @clamp_umaxval(<2 x i8> %x) { -; CHECK-LABEL: @clamp_umaxval( -; CHECK-NEXT: [[SEL:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> splat (i8 -2)) +; CHECK-LABEL: define <2 x i8> @clamp_umaxval( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X]], <2 x i8> splat (i8 -2)) ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 255, i8 255> @@ -3589,8 +3825,9 @@ define <2 x i8> @clamp_umaxval(<2 x i8> %x) { ; negative test - wrong cmp constant define i8 @not_clamp_umax1(i8 %x) { -; CHECK-LABEL: @not_clamp_umax1( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -3 +; CHECK-LABEL: define i8 @not_clamp_umax1( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], -3 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 -2, i8 [[X]] ; CHECK-NEXT: ret i8 [[SEL]] ; @@ -3602,8 +3839,9 @@ define i8 @not_clamp_umax1(i8 %x) { ; negative test - wrong select constant define i8 @not_clamp_umax2(i8 %x) { -; CHECK-LABEL: @not_clamp_umax2( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1 +; CHECK-LABEL: define i8 @not_clamp_umax2( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], -1 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 1, i8 [[X]] ; CHECK-NEXT: ret i8 [[SEL]] ; @@ -3613,8 +3851,9 @@ define i8 @not_clamp_umax2(i8 %x) { } define i8 @clamp_smin(i8 %x) { -; CHECK-LABEL: @clamp_smin( -; CHECK-NEXT: [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 -127) +; CHECK-LABEL: define i8 @clamp_smin( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 -127) ; CHECK-NEXT: ret i8 [[SEL]] ; %cmp = icmp eq i8 %x, -128 @@ -3623,8 +3862,9 @@ define i8 @clamp_smin(i8 %x) { } define i8 @clamp_smin_use(i8 %x) { -; CHECK-LABEL: @clamp_smin_use( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-LABEL: define i8 @clamp_smin_use( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], -128 ; CHECK-NEXT: call void @use1(i1 [[CMP]]) ; CHECK-NEXT: [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 -127) ; CHECK-NEXT: ret i8 [[SEL]] @@ -3638,8 +3878,9 @@ define i8 @clamp_smin_use(i8 %x) { ; negative test - wrong cmp constant define i8 @not_clamp_smin1(i8 %x) { -; CHECK-LABEL: @not_clamp_smin1( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127 +; CHECK-LABEL: define i8 @not_clamp_smin1( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], 127 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 -127, i8 [[X]] ; CHECK-NEXT: ret i8 [[SEL]] ; @@ -3651,8 +3892,9 @@ define i8 @not_clamp_smin1(i8 %x) { ; negative test - wrong select constant define i8 @not_clamp_smin2(i8 %x) { -; CHECK-LABEL: @not_clamp_smin2( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-LABEL: define i8 @not_clamp_smin2( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], -128 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 -1, i8 [[X]] ; CHECK-NEXT: ret i8 [[SEL]] ; @@ -3662,8 +3904,9 @@ define i8 @not_clamp_smin2(i8 %x) { } define <2 x i8> @clamp_smaxval(<2 x i8> %x) { -; CHECK-LABEL: @clamp_smaxval( -; CHECK-NEXT: [[SEL:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> splat (i8 126)) +; CHECK-LABEL: define <2 x i8> @clamp_smaxval( +; CHECK-SAME: <2 x i8> [[X:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[X]], <2 x i8> splat (i8 126)) ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %cmp = icmp eq <2 x i8> %x, <i8 127, i8 127> @@ -3674,8 +3917,9 @@ define <2 x i8> @clamp_smaxval(<2 x i8> %x) { ; negative test - wrong cmp constant define i8 @not_clamp_smax1(i8 %x) { -; CHECK-LABEL: @not_clamp_smax1( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-LABEL: define i8 @not_clamp_smax1( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], -128 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 126, i8 [[X]] ; CHECK-NEXT: ret i8 [[SEL]] ; @@ -3687,8 +3931,9 @@ define i8 @not_clamp_smax1(i8 %x) { ; negative test - wrong select constant define i8 @not_clamp_smax2(i8 %x) { -; CHECK-LABEL: @not_clamp_smax2( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 127 +; CHECK-LABEL: define i8 @not_clamp_smax2( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], 127 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 125, i8 [[X]] ; CHECK-NEXT: ret i8 [[SEL]] ; @@ -3699,8 +3944,9 @@ define i8 @not_clamp_smax2(i8 %x) { ; Used to infinite loop. define i32 @pr61361(i32 %arg) { -; CHECK-LABEL: @pr61361( -; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[ARG:%.*]], 0 +; CHECK-LABEL: define i32 @pr61361( +; CHECK-SAME: i32 [[ARG:%.*]]) { +; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[ARG]], 0 ; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i32 16777215, i32 0 ; CHECK-NEXT: ret i32 [[SEL2]] ; @@ -3713,18 +3959,18 @@ define i32 @pr61361(i32 %arg) { } define i32 @pr62088() { -; CHECK-LABEL: @pr62088( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[LOOP:%.*]] -; CHECK: loop: -; CHECK-NEXT: [[NOT2:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ -2, [[LOOP]] ] -; CHECK-NEXT: [[H_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[LOOP]] ] +; CHECK-LABEL: define i32 @pr62088() { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br label %[[LOOP:.*]] +; CHECK: [[LOOP]]: +; CHECK-NEXT: [[NOT2:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ -2, %[[LOOP]] ] +; CHECK-NEXT: [[H_0:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ] ; CHECK-NEXT: [[XOR:%.*]] = or disjoint i32 [[H_0]], [[NOT2]] ; CHECK-NEXT: [[SUB5:%.*]] = sub i32 -1824888657, [[XOR]] ; CHECK-NEXT: [[XOR6:%.*]] = xor i32 [[SUB5]], -1260914025 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[XOR6]], 824855120 -; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]] -; CHECK: exit: +; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]] +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret i32 [[H_0]] ; entry: @@ -3759,9 +4005,10 @@ exit: ; X&Y==C?X|Y:X^Y, X&Y==C?X^Y:X|Y ; TODO: X&Y==0 could imply no_common_bit to TrueValue define i32 @src_and_eq_0_or_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_and_eq_0_or_xor( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_0_or_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] @@ -3779,9 +4026,10 @@ entry: ; TODO: X&Y==0 could imply no_common_bit to TrueValue define i32 @src_and_eq_0_xor_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_and_eq_0_xor_or( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_0_xor_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] @@ -3799,9 +4047,10 @@ entry: ; TODO: X&Y==-1 could imply all_common_bit to TrueValue define i32 @src_and_eq_neg1_or_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_and_eq_neg1_or_xor( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_neg1_or_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], -1 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[XOR]] @@ -3818,9 +4067,10 @@ entry: ; TODO: X&Y==-1 could imply all_common_bit to TrueValue define i32 @src_and_eq_neg1_xor_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_and_eq_neg1_xor_or( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_neg1_xor_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], -1 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 0, i32 [[OR]] @@ -3836,10 +4086,11 @@ entry: } define i32 @src_and_eq_C_or_xororC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_and_eq_C_or_xororC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_C_or_xororC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR1:%.*]] = or i32 [[XOR]], [[C]] @@ -3857,10 +4108,11 @@ entry: } define i32 @src_and_eq_C_or_xorxorC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_and_eq_C_or_xorxorC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_C_or_xorxorC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[XOR]], [[C]] @@ -3878,10 +4130,11 @@ entry: } define i32 @src_and_eq_C_xor_OrAndNotC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_and_eq_C_xor_OrAndNotC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_C_xor_OrAndNotC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[C]], -1 @@ -3901,10 +4154,11 @@ entry: } define <2 x i32> @src_and_eq_C_xor_OrAndNotC_vec_poison(<2 x i32> %0, <2 x i32> %1, <2 x i32> %2) { -; CHECK-LABEL: @src_and_eq_C_xor_OrAndNotC_vec_poison( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[TMP1:%.*]], [[TMP0:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[AND]], [[TMP2:%.*]] +; CHECK-LABEL: define <2 x i32> @src_and_eq_C_xor_OrAndNotC_vec_poison( +; CHECK-SAME: <2 x i32> [[TMP0:%.*]], <2 x i32> [[TMP1:%.*]], <2 x i32> [[TMP2:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[TMP1]], [[TMP0]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[AND]], [[TMP2]] ; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i32> [[TMP1]], [[TMP0]] ; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[TMP1]], [[TMP0]] ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i32> [[TMP2]], <i32 -1, i32 poison> @@ -3924,10 +4178,11 @@ entry: } define i32 @src_and_eq_C_xor_orxorC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_and_eq_C_xor_orxorC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_and_eq_C_xor_orxorC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[C]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[OR]], [[C]] @@ -3948,9 +4203,10 @@ entry: ; X|Y==C?X&Y:X^Y, X|Y==C?X^Y:X&Y ; TODO: X|Y==0 could imply no_common_bit to TrueValue define i32 @src_or_eq_0_and_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_or_eq_0_and_xor( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_0_and_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: ret i32 [[XOR]] ; entry: @@ -3964,9 +4220,10 @@ entry: ; TODO: X|Y==0 could imply no_common_bit to TrueValue define i32 @src_or_eq_0_xor_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_or_eq_0_xor_and( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_0_xor_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: ret i32 [[AND]] ; entry: @@ -3979,9 +4236,10 @@ entry: } define i32 @src_or_eq_neg1_and_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_or_eq_neg1_and_xor( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_neg1_and_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], -1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[TMP0:%.*]] = xor i32 [[X]], [[Y]] @@ -4000,9 +4258,10 @@ entry: } define i32 @src_or_eq_neg1_xor_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_or_eq_neg1_xor_and( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_neg1_xor_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], -1 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] @@ -4021,10 +4280,11 @@ entry: } define i32 @src_or_eq_C_and_xorC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_or_eq_C_and_xorC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_C_and_xorC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[XOR]], [[C]] @@ -4042,10 +4302,11 @@ entry: } define i32 @src_or_eq_C_and_andnotxorC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_or_eq_C_and_andnotxorC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_C_and_andnotxorC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[TMP0:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[TMP0]], -1 @@ -4065,10 +4326,11 @@ entry: } define i32 @src_or_eq_C_xor_xorandC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_or_eq_C_xor_xorandC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_C_xor_xorandC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[AND]], [[C]] @@ -4086,10 +4348,11 @@ entry: } define i32 @src_or_eq_C_xor_andnotandC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_or_eq_C_xor_andnotandC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_or_eq_C_xor_andnotandC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], [[C]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[AND]], -1 @@ -4111,9 +4374,10 @@ entry: ; https://alive2.llvm.org/ce/z/c6oXi4 ; X^Y==C?X&Y:X|Y, X^Y==C?X|Y:X&Y define i32 @src_xor_eq_neg1_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_xor_eq_neg1_and( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_xor_eq_neg1_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], -1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] @@ -4133,9 +4397,10 @@ entry: ; TODO: X^Y==-1 could imply no_common_bit to TrueValue define i32 @src_xor_eq_neg1_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_xor_eq_neg1_or( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] +; CHECK-LABEL: define i32 @src_xor_eq_neg1_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], -1 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[OR]], i32 -1 @@ -4150,10 +4415,11 @@ entry: } define i32 @src_xor_eq_C_and_xororC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_xor_eq_C_and_xororC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_xor_eq_C_and_xororC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[OR]], [[C]] @@ -4171,10 +4437,11 @@ entry: } define i32 @src_xor_eq_C_and_andornotC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_xor_eq_C_and_andornotC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_xor_eq_C_and_andornotC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[C]], -1 @@ -4194,10 +4461,11 @@ entry: } define i32 @src_xor_eq_C_or_xorandC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_xor_eq_C_or_xorandC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_xor_eq_C_or_xorandC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[AND]], [[C]] @@ -4215,10 +4483,11 @@ entry: } define i32 @src_xor_eq_C_or_orandC(i32 %x, i32 %y, i32 %c) { -; CHECK-LABEL: @src_xor_eq_C_or_orandC( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C:%.*]] +; CHECK-LABEL: define i32 @src_xor_eq_C_or_orandC( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y]], [[X]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[XOR]], [[C]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y]], [[X]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y]], [[X]] ; CHECK-NEXT: [[OR1:%.*]] = or i32 [[AND]], [[C]] @@ -4238,8 +4507,9 @@ entry: ; Select icmp and/or/xor ; NO TRANSFORMED - select condition is compare with not 0 define i32 @src_select_and_min_positive_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_and_min_positive_int( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_and_min_positive_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 1 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4255,8 +4525,9 @@ define i32 @src_select_and_min_positive_int(i32 %x, i32 %y) { } define i32 @src_select_and_max_positive_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_and_max_positive_int( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_and_max_positive_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 2147483647 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4272,8 +4543,9 @@ define i32 @src_select_and_max_positive_int(i32 %x, i32 %y) { } define i32 @src_select_and_min_negative_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_and_min_negative_int( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_and_min_negative_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], -2147483648 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4289,8 +4561,9 @@ define i32 @src_select_and_min_negative_int(i32 %x, i32 %y) { } define i32 @src_select_or_min_positive_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_or_min_positive_int( -; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_or_min_positive_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR0:%.*]] = icmp eq i32 [[OR]], 1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] @@ -4306,8 +4579,9 @@ define i32 @src_select_or_min_positive_int(i32 %x, i32 %y) { } define i32 @src_select_or_max_positive_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_or_max_positive_int( -; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_or_max_positive_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR0:%.*]] = icmp eq i32 [[OR]], 2147483647 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] @@ -4323,8 +4597,9 @@ define i32 @src_select_or_max_positive_int(i32 %x, i32 %y) { } define i32 @src_select_or_min_negative_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_or_min_negative_int( -; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_or_min_negative_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR0:%.*]] = icmp eq i32 [[OR]], -2147483648 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] @@ -4340,8 +4615,9 @@ define i32 @src_select_or_min_negative_int(i32 %x, i32 %y) { } define i32 @src_select_or_max_negative_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_or_max_negative_int( -; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_or_max_negative_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR0:%.*]] = icmp eq i32 [[OR]], -1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] @@ -4357,8 +4633,9 @@ define i32 @src_select_or_max_negative_int(i32 %x, i32 %y) { } define i32 @src_select_xor_min_positive_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_xor_min_positive_int( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_xor_min_positive_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], 1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4374,8 +4651,9 @@ define i32 @src_select_xor_min_positive_int(i32 %x, i32 %y) { } define i32 @src_select_xor_max_positive_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_xor_max_positive_int( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_xor_max_positive_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], 2147483647 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4391,8 +4669,9 @@ define i32 @src_select_xor_max_positive_int(i32 %x, i32 %y) { } define i32 @src_select_xor_min_negative_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_xor_min_negative_int( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_xor_min_negative_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], -2147483648 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4408,8 +4687,9 @@ define i32 @src_select_xor_min_negative_int(i32 %x, i32 %y) { } define i32 @src_select_xor_max_negative_int(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_xor_max_negative_int( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_xor_max_negative_int( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[XOR]], -1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] @@ -4428,8 +4708,9 @@ define i32 @src_select_xor_max_negative_int(i32 %x, i32 %y) { ; https://alive2.llvm.org/ce/z/BVgrJ- ; NO TRANSFORMED - not supported define i32 @src_no_trans_select_and_eq0_and_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_and_eq0_and_or( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_and_eq0_and_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 0 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 0, i32 [[OR]] @@ -4443,8 +4724,9 @@ define i32 @src_no_trans_select_and_eq0_and_or(i32 %x, i32 %y) { } define i32 @src_no_trans_select_and_eq0_and_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_and_eq0_and_xor( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_and_eq0_and_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 0 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 0, i32 [[XOR]] @@ -4458,8 +4740,9 @@ define i32 @src_no_trans_select_and_eq0_and_xor(i32 %x, i32 %y) { } define i32 @src_no_trans_select_and_eq0_or_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_and_eq0_or_and( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_and_eq0_or_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 0 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 [[OR]], i32 [[AND]] @@ -4473,8 +4756,9 @@ define i32 @src_no_trans_select_and_eq0_or_and(i32 %x, i32 %y) { } define i32 @src_no_trans_select_and_eq0_xor_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_and_eq0_xor_and( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_and_eq0_xor_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 0 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 [[XOR]], i32 [[AND]] @@ -4488,8 +4772,9 @@ define i32 @src_no_trans_select_and_eq0_xor_and(i32 %x, i32 %y) { } define i32 @src_no_trans_select_or_eq0_or_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_or_eq0_or_and( -; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_or_eq0_or_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[AND]] ; %or = or i32 %x, %y @@ -4500,8 +4785,9 @@ define i32 @src_no_trans_select_or_eq0_or_and(i32 %x, i32 %y) { } define i32 @src_no_trans_select_or_eq0_or_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_or_eq0_or_xor( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_or_eq0_or_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[XOR]] ; %or = or i32 %x, %y @@ -4512,8 +4798,9 @@ define i32 @src_no_trans_select_or_eq0_or_xor(i32 %x, i32 %y) { } define i32 @src_no_trans_select_or_eq0_and_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_or_eq0_and_or( -; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_or_eq0_and_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[OR]] ; %or = or i32 %x, %y @@ -4524,8 +4811,9 @@ define i32 @src_no_trans_select_or_eq0_and_or(i32 %x, i32 %y) { } define i32 @src_no_trans_select_or_eq0_xor_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_or_eq0_xor_or( -; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_or_eq0_xor_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[OR]] ; %or = or i32 %x, %y @@ -4536,8 +4824,9 @@ define i32 @src_no_trans_select_or_eq0_xor_or(i32 %x, i32 %y) { } define i32 @src_no_trans_select_and_ne0_xor_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_and_ne0_xor_or( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_and_ne0_xor_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[XOR]] ; %or = or i32 %x, %y @@ -4548,8 +4837,9 @@ define i32 @src_no_trans_select_and_ne0_xor_or(i32 %x, i32 %y) { } define i32 @src_no_trans_select_xor_eq0_xor_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_xor_eq0_xor_and( -; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_xor_eq0_xor_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 0, i32 [[AND]] ; CHECK-NEXT: ret i32 [[COND]] @@ -4562,8 +4852,9 @@ define i32 @src_no_trans_select_xor_eq0_xor_and(i32 %x, i32 %y) { } define i32 @src_no_trans_select_xor_eq0_xor_or(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_xor_eq0_xor_or( -; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_xor_eq0_xor_or( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 0, i32 [[OR]] ; CHECK-NEXT: ret i32 [[COND]] @@ -4576,8 +4867,9 @@ define i32 @src_no_trans_select_xor_eq0_xor_or(i32 %x, i32 %y) { } define i32 @src_no_trans_select_xor_eq0_and_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_xor_eq0_and_xor( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_xor_eq0_and_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X]], [[Y]] ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[AND]], i32 [[XOR]] @@ -4592,8 +4884,9 @@ define i32 @src_no_trans_select_xor_eq0_and_xor(i32 %x, i32 %y) { ; https://alive2.llvm.org/ce/z/SBe8ei define i32 @src_no_trans_select_xor_eq0_or_xor(i32 %x, i32 %y) { -; CHECK-LABEL: @src_no_trans_select_xor_eq0_or_xor( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_no_trans_select_xor_eq0_or_xor( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X]], [[Y]] ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 [[OR]], i32 [[XOR]] @@ -4609,8 +4902,9 @@ define i32 @src_no_trans_select_xor_eq0_or_xor(i32 %x, i32 %y) { ; (X == C) ? X : Y -> (X == C) ? C : Y ; Fixed #77553 define i32 @src_select_xxory_eq0_xorxy_y(i32 %x, i32 %y) { -; CHECK-LABEL: @src_select_xxory_eq0_xorxy_y( -; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_select_xxory_eq0_xorxy_y( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR0:%.*]] = icmp eq i32 [[X]], [[Y]] ; CHECK-NEXT: [[COND:%.*]] = select i1 [[XOR0]], i32 0, i32 [[Y]] ; CHECK-NEXT: ret i32 [[COND]] ; @@ -4621,9 +4915,10 @@ define i32 @src_select_xxory_eq0_xorxy_y(i32 %x, i32 %y) { } define i32 @sequence_select_with_same_cond_false(i1 %c1, i1 %c2){ -; CHECK-LABEL: @sequence_select_with_same_cond_false( -; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 666, i32 45 -; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1:%.*]], i32 789, i32 [[S2]] +; CHECK-LABEL: define i32 @sequence_select_with_same_cond_false( +; CHECK-SAME: i1 [[C1:%.*]], i1 [[C2:%.*]]) { +; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2]], i32 666, i32 45 +; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1]], i32 789, i32 [[S2]] ; CHECK-NEXT: ret i32 [[S3]] ; %s1 = select i1 %c1, i32 23, i32 45 @@ -4633,9 +4928,10 @@ define i32 @sequence_select_with_same_cond_false(i1 %c1, i1 %c2){ } define i32 @sequence_select_with_same_cond_true(i1 %c1, i1 %c2){ -; CHECK-LABEL: @sequence_select_with_same_cond_true( -; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 45, i32 666 -; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1:%.*]], i32 [[S2]], i32 789 +; CHECK-LABEL: define i32 @sequence_select_with_same_cond_true( +; CHECK-SAME: i1 [[C1:%.*]], i1 [[C2:%.*]]) { +; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2]], i32 45, i32 666 +; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1]], i32 [[S2]], i32 789 ; CHECK-NEXT: ret i32 [[S3]] ; %s1 = select i1 %c1, i32 45, i32 23 @@ -4645,9 +4941,10 @@ define i32 @sequence_select_with_same_cond_true(i1 %c1, i1 %c2){ } define double @sequence_select_with_same_cond_double(double %a, i1 %c1, i1 %c2, double %r1, double %r2){ -; CHECK-LABEL: @sequence_select_with_same_cond_double( -; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1:%.*]], double 1.000000e+00, double 0.000000e+00 -; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], double [[S1]], double 2.000000e+00 +; CHECK-LABEL: define double @sequence_select_with_same_cond_double( +; CHECK-SAME: double [[A:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]], double [[R1:%.*]], double [[R2:%.*]]) { +; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1]], double 1.000000e+00, double 0.000000e+00 +; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2]], double [[S1]], double 2.000000e+00 ; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1]], double [[S2]], double 3.000000e+00 ; CHECK-NEXT: ret double [[S3]] ; @@ -4660,10 +4957,11 @@ define double @sequence_select_with_same_cond_double(double %a, i1 %c1, i1 %c2, declare void @use32(i32) define i32 @sequence_select_with_same_cond_extra_use(i1 %c1, i1 %c2){ -; CHECK-LABEL: @sequence_select_with_same_cond_extra_use( -; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1:%.*]], i32 23, i32 45 +; CHECK-LABEL: define i32 @sequence_select_with_same_cond_extra_use( +; CHECK-SAME: i1 [[C1:%.*]], i1 [[C2:%.*]]) { +; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1]], i32 23, i32 45 ; CHECK-NEXT: call void @use32(i32 [[S1]]) -; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 666, i32 [[S1]] +; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2]], i32 666, i32 [[S1]] ; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1]], i32 789, i32 [[S2]] ; CHECK-NEXT: ret i32 [[S3]] ; @@ -4675,9 +4973,10 @@ define i32 @sequence_select_with_same_cond_extra_use(i1 %c1, i1 %c2){ } define i8 @test_replace_freeze_multiuse(i1 %x, i8 %y) { -; CHECK-LABEL: @test_replace_freeze_multiuse( -; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[X:%.*]] to i8 -; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 [[EXT]], [[Y:%.*]] +; CHECK-LABEL: define i8 @test_replace_freeze_multiuse( +; CHECK-SAME: i1 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[X]] to i8 +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 [[EXT]], [[Y]] ; CHECK-NEXT: [[SHL_FR:%.*]] = freeze i8 [[SHL]] ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X]], i8 0, i8 [[SHL_FR]] ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[SHL_FR]], [[SEL]] @@ -4692,9 +4991,10 @@ define i8 @test_replace_freeze_multiuse(i1 %x, i8 %y) { } define i8 @test_replace_freeze_oneuse(i1 %x, i8 %y) { -; CHECK-LABEL: @test_replace_freeze_oneuse( -; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[X:%.*]] to i8 -; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 [[EXT]], [[Y:%.*]] +; CHECK-LABEL: define i8 @test_replace_freeze_oneuse( +; CHECK-SAME: i1 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[X]] to i8 +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 [[EXT]], [[Y]] ; CHECK-NEXT: [[SHL_FR:%.*]] = freeze i8 [[SHL]] ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X]], i8 0, i8 [[SHL_FR]] ; CHECK-NEXT: ret i8 [[SEL]] @@ -4707,8 +5007,9 @@ define i8 @test_replace_freeze_oneuse(i1 %x, i8 %y) { } define i8 @select_knownbits_simplify(i8 noundef %x) { -; CHECK-LABEL: @select_knownbits_simplify( -; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X:%.*]], 1 +; CHECK-LABEL: define i8 @select_knownbits_simplify( +; CHECK-SAME: i8 noundef [[X:%.*]]) { +; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X]], 1 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X_LO]], 0 ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -2 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[AND]], i8 0 @@ -4722,8 +5023,9 @@ define i8 @select_knownbits_simplify(i8 noundef %x) { } define i8 @select_knownbits_simplify_nested(i8 noundef %x) { -; CHECK-LABEL: @select_knownbits_simplify_nested( -; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X:%.*]], 1 +; CHECK-LABEL: define i8 @select_knownbits_simplify_nested( +; CHECK-SAME: i8 noundef [[X:%.*]]) { +; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X]], 1 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X_LO]], 0 ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -2 ; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[AND]], [[AND]] @@ -4739,8 +5041,9 @@ define i8 @select_knownbits_simplify_nested(i8 noundef %x) { } define i8 @select_knownbits_simplify_missing_noundef(i8 %x) { -; CHECK-LABEL: @select_knownbits_simplify_missing_noundef( -; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X:%.*]], 1 +; CHECK-LABEL: define i8 @select_knownbits_simplify_missing_noundef( +; CHECK-SAME: i8 [[X:%.*]]) { +; CHECK-NEXT: [[X_LO:%.*]] = and i8 [[X]], 1 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X_LO]], 0 ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -2 ; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[AND]], i8 0 @@ -4757,8 +5060,9 @@ define i8 @select_knownbits_simplify_missing_noundef(i8 %x) { ; Make sure we don't replace %ptr with @g_ext, which may cause the load to trigger UB. define i32 @pr99436(ptr align 4 dereferenceable(4) %ptr) { -; CHECK-LABEL: @pr99436( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[PTR:%.*]], @g_ext +; CHECK-LABEL: define i32 @pr99436( +; CHECK-SAME: ptr align 4 dereferenceable(4) [[PTR:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[PTR]], @g_ext ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[PTR]], align 4 ; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0 ; CHECK-NEXT: ret i32 [[RET]] @@ -4770,9 +5074,10 @@ define i32 @pr99436(ptr align 4 dereferenceable(4) %ptr) { } define i8 @sel_trunc_simplify(i1 %c, i8 %x, i16 %y) { -; CHECK-LABEL: @sel_trunc_simplify( -; CHECK-NEXT: [[TMP1:%.*]] = trunc i16 [[Y:%.*]] to i8 -; CHECK-NEXT: [[TRUNC:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] +; CHECK-LABEL: define i8 @sel_trunc_simplify( +; CHECK-SAME: i1 [[C:%.*]], i8 [[X:%.*]], i16 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = trunc i16 [[Y]] to i8 +; CHECK-NEXT: [[TRUNC:%.*]] = select i1 [[C]], i8 [[X]], i8 [[TMP1]] ; CHECK-NEXT: ret i8 [[TRUNC]] ; %x.ext = zext i8 %x to i16 @@ -4782,10 +5087,11 @@ define i8 @sel_trunc_simplify(i1 %c, i8 %x, i16 %y) { } define i32 @sel_umin_simplify(i1 %c, i32 %x, i16 %y) { -; CHECK-LABEL: @sel_umin_simplify( -; CHECK-NEXT: [[ARG2_EXT:%.*]] = zext i16 [[ARG2:%.*]] to i32 -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 [[ARG2_EXT]]) -; CHECK-NEXT: [[RES:%.*]] = select i1 [[C:%.*]], i32 [[TMP1]], i32 0 +; CHECK-LABEL: define i32 @sel_umin_simplify( +; CHECK-SAME: i1 [[C:%.*]], i32 [[X:%.*]], i16 [[Y:%.*]]) { +; CHECK-NEXT: [[Y_EXT:%.*]] = zext i16 [[Y]] to i32 +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umin.i32(i32 [[X]], i32 [[Y_EXT]]) +; CHECK-NEXT: [[RES:%.*]] = select i1 [[C]], i32 [[TMP1]], i32 0 ; CHECK-NEXT: ret i32 [[RES]] ; %sel = select i1 %c, i32 %x, i32 0 @@ -4795,9 +5101,10 @@ define i32 @sel_umin_simplify(i1 %c, i32 %x, i16 %y) { } define i32 @sel_extractvalue_simplify(i1 %c, { i32, i32 } %agg1, i32 %x, i32 %y) { -; CHECK-LABEL: @sel_extractvalue_simplify( -; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i32 } [[AGG1:%.*]], 1 -; CHECK-NEXT: [[RES:%.*]] = select i1 [[C:%.*]], i32 [[TMP1]], i32 [[Y:%.*]] +; CHECK-LABEL: define i32 @sel_extractvalue_simplify( +; CHECK-SAME: i1 [[C:%.*]], { i32, i32 } [[AGG1:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i32 } [[AGG1]], 1 +; CHECK-NEXT: [[RES:%.*]] = select i1 [[C]], i32 [[TMP1]], i32 [[Y]] ; CHECK-NEXT: ret i32 [[RES]] ; %agg2.0 = insertvalue { i32, i32 } poison, i32 %x, 0 @@ -4808,9 +5115,10 @@ define i32 @sel_extractvalue_simplify(i1 %c, { i32, i32 } %agg1, i32 %x, i32 %y) } define i1 @replace_select_cond_true(i1 %cond, i32 %v1, i32 %v2, i32 %v3) { -; CHECK-LABEL: @replace_select_cond_true( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SEL:%.*]], [[V2:%.*]] -; CHECK-NEXT: [[AND:%.*]] = select i1 [[COND:%.*]], i1 [[CMP]], i1 false +; CHECK-LABEL: define i1 @replace_select_cond_true( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[V1:%.*]], i32 [[V2:%.*]], i32 [[V3:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V1]], [[V2]] +; CHECK-NEXT: [[AND:%.*]] = select i1 [[COND]], i1 [[CMP]], i1 false ; CHECK-NEXT: ret i1 [[AND]] ; %sel = select i1 %cond, i32 %v1, i32 %v3 @@ -4820,9 +5128,10 @@ define i1 @replace_select_cond_true(i1 %cond, i32 %v1, i32 %v2, i32 %v3) { } define i1 @replace_select_cond_false(i1 %cond, i32 %v1, i32 %v2, i32 %v3) { -; CHECK-LABEL: @replace_select_cond_false( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SEL:%.*]], [[V2:%.*]] -; CHECK-NEXT: [[OR:%.*]] = select i1 [[COND:%.*]], i1 true, i1 [[CMP]] +; CHECK-LABEL: define i1 @replace_select_cond_false( +; CHECK-SAME: i1 [[COND:%.*]], i32 [[V1:%.*]], i32 [[V2:%.*]], i32 [[V3:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V3]], [[V2]] +; CHECK-NEXT: [[OR:%.*]] = select i1 [[COND]], i1 true, i1 [[CMP]] ; CHECK-NEXT: ret i1 [[OR]] ; %sel = select i1 %cond, i32 %v1, i32 %v3 @@ -4832,9 +5141,10 @@ define i1 @replace_select_cond_false(i1 %cond, i32 %v1, i32 %v2, i32 %v3) { } define i32 @replace_and_cond(i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @replace_and_cond( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND:%.*]], i32 3, i32 2 -; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1:%.*]], i32 [[SEL]], i32 1 +; CHECK-LABEL: define i32 @replace_and_cond( +; CHECK-SAME: i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND2]], i32 3, i32 2 +; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1 ; CHECK-NEXT: ret i32 [[MUX]] ; %and = and i1 %cond1, %cond2 @@ -4844,9 +5154,10 @@ define i32 @replace_and_cond(i1 %cond1, i1 %cond2) { } define <2 x i32> @replace_and_cond_vec(<2 x i1> %cond1, <2 x i1> %cond2) { -; CHECK-LABEL: @replace_and_cond_vec( -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND2:%.*]], <2 x i32> splat (i32 3), <2 x i32> splat (i32 2) -; CHECK-NEXT: [[MUX:%.*]] = select <2 x i1> [[COND1:%.*]], <2 x i32> [[SEL]], <2 x i32> splat (i32 1) +; CHECK-LABEL: define <2 x i32> @replace_and_cond_vec( +; CHECK-SAME: <2 x i1> [[COND1:%.*]], <2 x i1> [[COND2:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND2]], <2 x i32> splat (i32 3), <2 x i32> splat (i32 2) +; CHECK-NEXT: [[MUX:%.*]] = select <2 x i1> [[COND1]], <2 x i32> [[SEL]], <2 x i32> splat (i32 1) ; CHECK-NEXT: ret <2 x i32> [[MUX]] ; %and = and <2 x i1> %cond1, %cond2 @@ -4857,8 +5168,9 @@ define <2 x i32> @replace_and_cond_vec(<2 x i1> %cond1, <2 x i1> %cond2) { ; TODO: We can still replace the use of %and with %cond2 define i32 @replace_and_cond_multiuse1(i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @replace_and_cond_multiuse1( -; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]] +; CHECK-LABEL: define i32 @replace_and_cond_multiuse1( +; CHECK-SAME: i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1]], [[COND2]] ; CHECK-NEXT: call void @use(i1 [[AND]]) ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2 ; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1 @@ -4872,8 +5184,9 @@ define i32 @replace_and_cond_multiuse1(i1 %cond1, i1 %cond2) { } define i32 @replace_and_cond_multiuse2(i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @replace_and_cond_multiuse2( -; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]] +; CHECK-LABEL: define i32 @replace_and_cond_multiuse2( +; CHECK-SAME: i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1]], [[COND2]] ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2 ; CHECK-NEXT: call void @use32(i32 [[SEL]]) ; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1 @@ -4887,8 +5200,9 @@ define i32 @replace_and_cond_multiuse2(i1 %cond1, i1 %cond2) { } define i32 @src_simplify_2x_at_once_and(i32 %x, i32 %y) { -; CHECK-LABEL: @src_simplify_2x_at_once_and( -; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] +; CHECK-LABEL: define i32 @src_simplify_2x_at_once_and( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] ; CHECK-NEXT: ret i32 [[XOR]] ; %and = and i32 %x, %y @@ -4900,8 +5214,9 @@ define i32 @src_simplify_2x_at_once_and(i32 %x, i32 %y) { } define void @select_freeze_poison_parameter(ptr noundef %addr.src, ptr %addr.tgt, i1 %cond) { -; CHECK-LABEL: @select_freeze_poison_parameter( -; CHECK-NEXT: store ptr [[ADDR_SRC:%.*]], ptr [[ADDR_TGT:%.*]], align 8 +; CHECK-LABEL: define void @select_freeze_poison_parameter( +; CHECK-SAME: ptr noundef [[ADDR_SRC:%.*]], ptr [[ADDR_TGT:%.*]], i1 [[COND:%.*]]) { +; CHECK-NEXT: store ptr [[ADDR_SRC]], ptr [[ADDR_TGT]], align 8 ; CHECK-NEXT: ret void ; %freeze = freeze ptr poison @@ -4911,9 +5226,10 @@ define void @select_freeze_poison_parameter(ptr noundef %addr.src, ptr %addr.tgt } define i8 @select_freeze_poison_different_parameters(i8 noundef %x, i8 noundef %y, i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @select_freeze_poison_different_parameters( -; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[COND1:%.*]], i8 [[X:%.*]], i8 0 -; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[COND2:%.*]], i8 [[Y:%.*]], i8 0 +; CHECK-LABEL: define i8 @select_freeze_poison_different_parameters( +; CHECK-SAME: i8 noundef [[X:%.*]], i8 noundef [[Y:%.*]], i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[COND1]], i8 [[X]], i8 0 +; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[COND2]], i8 [[Y]], i8 0 ; CHECK-NEXT: [[CONJ:%.*]] = and i8 [[SEL1]], [[SEL2]] ; CHECK-NEXT: ret i8 [[CONJ]] ; @@ -4925,7 +5241,8 @@ define i8 @select_freeze_poison_different_parameters(i8 noundef %x, i8 noundef % } define i8 @select_or_freeze_poison_parameter(i8 noundef %x, i1 %cond1) { -; CHECK-LABEL: @select_or_freeze_poison_parameter( +; CHECK-LABEL: define i8 @select_or_freeze_poison_parameter( +; CHECK-SAME: i8 noundef [[X:%.*]], i1 [[COND1:%.*]]) { ; CHECK-NEXT: ret i8 -1 ; %freeze = freeze i8 poison @@ -4936,8 +5253,9 @@ define i8 @select_or_freeze_poison_parameter(i8 noundef %x, i1 %cond1) { } define i8 @selects_freeze_poison_parameter(i8 noundef %x, i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @selects_freeze_poison_parameter( -; CHECK-NEXT: ret i8 [[X:%.*]] +; CHECK-LABEL: define i8 @selects_freeze_poison_parameter( +; CHECK-SAME: i8 noundef [[X:%.*]], i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: ret i8 [[X]] ; %freeze = freeze i8 poison %sel1 = select i1 %cond1, i8 %x, i8 %freeze @@ -4949,8 +5267,9 @@ define i8 @selects_freeze_poison_parameter(i8 noundef %x, i1 %cond1, i1 %cond2) @glb = global ptr null define void @select_freeze_poison_global(ptr %addr.tgt, i1 %cond) { -; CHECK-LABEL: @select_freeze_poison_global( -; CHECK-NEXT: store ptr @glb, ptr [[ADDR_TGT:%.*]], align 8 +; CHECK-LABEL: define void @select_freeze_poison_global( +; CHECK-SAME: ptr [[ADDR_TGT:%.*]], i1 [[COND:%.*]]) { +; CHECK-NEXT: store ptr @glb, ptr [[ADDR_TGT]], align 8 ; CHECK-NEXT: ret void ; %freeze = freeze ptr poison @@ -4960,8 +5279,9 @@ define void @select_freeze_poison_global(ptr %addr.tgt, i1 %cond) { } define void @select_freeze_poison_constant(ptr %addr.tgt, i1 %cond) { -; CHECK-LABEL: @select_freeze_poison_constant( -; CHECK-NEXT: store i32 72, ptr [[ADDR_TGT:%.*]], align 4 +; CHECK-LABEL: define void @select_freeze_poison_constant( +; CHECK-SAME: ptr [[ADDR_TGT:%.*]], i1 [[COND:%.*]]) { +; CHECK-NEXT: store i32 72, ptr [[ADDR_TGT]], align 4 ; CHECK-NEXT: ret void ; %freeze = freeze i32 poison @@ -4971,8 +5291,9 @@ define void @select_freeze_poison_constant(ptr %addr.tgt, i1 %cond) { } define <2 x i8> @select_freeze_poison_mask_vector(i1 %cond, <2 x i8> noundef %y) { -; CHECK-LABEL: @select_freeze_poison_mask_vector( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], <2 x i8> [[Y:%.*]], <2 x i8> zeroinitializer +; CHECK-LABEL: define <2 x i8> @select_freeze_poison_mask_vector( +; CHECK-SAME: i1 [[COND:%.*]], <2 x i8> noundef [[Y:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], <2 x i8> [[Y]], <2 x i8> zeroinitializer ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %freeze = freeze <2 x i8> <i8 0, i8 poison> @@ -4981,10 +5302,11 @@ define <2 x i8> @select_freeze_poison_mask_vector(i1 %cond, <2 x i8> noundef %y) } define <2 x i8> @selects_freeze_poison_mask_vector(<2 x i8> noundef %x, i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @selects_freeze_poison_mask_vector( -; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND1:%.*]], i1 [[COND2:%.*]], i1 false -; CHECK-NEXT: [[X:%.*]] = select i1 [[TMP1]], <2 x i8> [[X1:%.*]], <2 x i8> zeroinitializer -; CHECK-NEXT: ret <2 x i8> [[X]] +; CHECK-LABEL: define <2 x i8> @selects_freeze_poison_mask_vector( +; CHECK-SAME: <2 x i8> noundef [[X:%.*]], i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND1]], i1 [[COND2]], i1 false +; CHECK-NEXT: [[CONJ:%.*]] = select i1 [[TMP1]], <2 x i8> [[X]], <2 x i8> zeroinitializer +; CHECK-NEXT: ret <2 x i8> [[CONJ]] ; %freeze = freeze <2 x i8> <i8 0, i8 poison> %sel1 = select i1 %cond1, <2 x i8> %x, <2 x i8> %freeze @@ -4994,8 +5316,9 @@ define <2 x i8> @selects_freeze_poison_mask_vector(<2 x i8> noundef %x, i1 %cond } define <2 x i8> @select_freeze_poison_splat_vector(i1 %cond, <2 x i8> noundef %y) { -; CHECK-LABEL: @select_freeze_poison_splat_vector( -; CHECK-NEXT: ret <2 x i8> [[Y:%.*]] +; CHECK-LABEL: define <2 x i8> @select_freeze_poison_splat_vector( +; CHECK-SAME: i1 [[COND:%.*]], <2 x i8> noundef [[Y:%.*]]) { +; CHECK-NEXT: ret <2 x i8> [[Y]] ; %freeze = freeze <2 x i8> <i8 poison, i8 poison> %sel = select i1 %cond, <2 x i8> %y, <2 x i8> %freeze @@ -5003,8 +5326,9 @@ define <2 x i8> @select_freeze_poison_splat_vector(i1 %cond, <2 x i8> noundef %y } define <2 x i8> @selects_freeze_poison_splat_vector(<2 x i8> noundef %x, i1 %cond1, i1 %cond2) { -; CHECK-LABEL: @selects_freeze_poison_splat_vector( -; CHECK-NEXT: ret <2 x i8> [[X:%.*]] +; CHECK-LABEL: define <2 x i8> @selects_freeze_poison_splat_vector( +; CHECK-SAME: <2 x i8> noundef [[X:%.*]], i1 [[COND1:%.*]], i1 [[COND2:%.*]]) { +; CHECK-NEXT: ret <2 x i8> [[X]] ; %freeze = freeze <2 x i8> <i8 poison, i8 poison> %sel1 = select i1 %cond1, <2 x i8> %x, <2 x i8> %freeze @@ -5014,8 +5338,9 @@ define <2 x i8> @selects_freeze_poison_splat_vector(<2 x i8> noundef %x, i1 %con } define <2 x i8> @select_freeze_constant_vector(i1 %cond, <2 x i8> noundef %y) { -; CHECK-LABEL: @select_freeze_constant_vector( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], <2 x i8> [[Y:%.*]], <2 x i8> zeroinitializer +; CHECK-LABEL: define <2 x i8> @select_freeze_constant_vector( +; CHECK-SAME: i1 [[COND:%.*]], <2 x i8> noundef [[Y:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], <2 x i8> [[Y]], <2 x i8> zeroinitializer ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %freeze = freeze <2 x i8> <i8 0, i8 0> @@ -5024,8 +5349,9 @@ define <2 x i8> @select_freeze_constant_vector(i1 %cond, <2 x i8> noundef %y) { } define <2 x i8> @select_freeze_constant_expression_vector_add(i1 %cond, <2 x i8> noundef %y) { -; CHECK-LABEL: @select_freeze_constant_expression_vector_add( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], <2 x i8> [[Y:%.*]], <2 x i8> splat (i8 3) +; CHECK-LABEL: define <2 x i8> @select_freeze_constant_expression_vector_add( +; CHECK-SAME: i1 [[COND:%.*]], <2 x i8> noundef [[Y:%.*]]) { +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], <2 x i8> [[Y]], <2 x i8> splat (i8 3) ; CHECK-NEXT: ret <2 x i8> [[SEL]] ; %freeze = freeze <2 x i8> <i8 poison, i8 add (i8 1, i8 2)> @@ -5037,9 +5363,10 @@ define <2 x i8> @select_freeze_constant_expression_vector_add(i1 %cond, <2 x i8> @glb.struct.1 = global %struct.1 {i32 1, i32 2} define <2 x ptr> @select_freeze_constant_expression_vector_gep(i1 %cond, <2 x ptr> noundef %y) { -; CHECK-LABEL: @select_freeze_constant_expression_vector_gep( +; CHECK-LABEL: define <2 x ptr> @select_freeze_constant_expression_vector_gep( +; CHECK-SAME: i1 [[COND:%.*]], <2 x ptr> noundef [[Y:%.*]]) { ; CHECK-NEXT: [[FREEZE:%.*]] = freeze <2 x ptr> <ptr poison, ptr getelementptr inbounds nuw (i8, ptr @glb.struct.1, i64 800)> -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], <2 x ptr> [[Y:%.*]], <2 x ptr> [[FREEZE]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], <2 x ptr> [[Y]], <2 x ptr> [[FREEZE]] ; CHECK-NEXT: ret <2 x ptr> [[SEL]] ; %freeze = freeze <2 x ptr> <ptr poison, ptr getelementptr inbounds (%struct.1, ptr @glb.struct.1, i64 100)> @@ -5048,24 +5375,25 @@ define <2 x ptr> @select_freeze_constant_expression_vector_gep(i1 %cond, <2 x pt } define void @no_fold_masked_min_loop(ptr nocapture readonly %vals, ptr nocapture readonly %masks, ptr nocapture %out, i64 %n) { -; CHECK-LABEL: @no_fold_masked_min_loop( -; CHECK-NEXT: entry: -; CHECK-NEXT: br label [[LOOP:%.*]] -; CHECK: loop: -; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[NEXT_INDEX:%.*]], [[LOOP]] ] -; CHECK-NEXT: [[ACC:%.*]] = phi i8 [ -1, [[ENTRY]] ], [ [[RES:%.*]], [[LOOP]] ] -; CHECK-NEXT: [[VAL_PTR:%.*]] = getelementptr inbounds i8, ptr [[VALS:%.*]], i64 [[INDEX]] -; CHECK-NEXT: [[MASK_PTR:%.*]] = getelementptr inbounds i8, ptr [[MASKS:%.*]], i64 [[INDEX]] +; CHECK-LABEL: define void @no_fold_masked_min_loop( +; CHECK-SAME: ptr readonly captures(none) [[VALS:%.*]], ptr readonly captures(none) [[MASKS:%.*]], ptr captures(none) [[OUT:%.*]], i64 [[N:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br label %[[LOOP:.*]] +; CHECK: [[LOOP]]: +; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[NEXT_INDEX:%.*]], %[[LOOP]] ] +; CHECK-NEXT: [[ACC:%.*]] = phi i8 [ -1, %[[ENTRY]] ], [ [[RES:%.*]], %[[LOOP]] ] +; CHECK-NEXT: [[VAL_PTR:%.*]] = getelementptr inbounds i8, ptr [[VALS]], i64 [[INDEX]] +; CHECK-NEXT: [[MASK_PTR:%.*]] = getelementptr inbounds i8, ptr [[MASKS]], i64 [[INDEX]] ; CHECK-NEXT: [[VAL:%.*]] = load i8, ptr [[VAL_PTR]], align 1 ; CHECK-NEXT: [[MASK:%.*]] = load i8, ptr [[MASK_PTR]], align 1 ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[MASK]], 0 ; CHECK-NEXT: [[MASKED_VAL:%.*]] = select i1 [[COND]], i8 [[VAL]], i8 -1 ; CHECK-NEXT: [[RES]] = call i8 @llvm.umin.i8(i8 [[ACC]], i8 [[MASKED_VAL]]) ; CHECK-NEXT: [[NEXT_INDEX]] = add i64 [[INDEX]], 1 -; CHECK-NEXT: [[DONE:%.*]] = icmp eq i64 [[NEXT_INDEX]], [[N:%.*]] -; CHECK-NEXT: br i1 [[DONE]], label [[EXIT:%.*]], label [[LOOP]] -; CHECK: exit: -; CHECK-NEXT: store i8 [[RES]], ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: [[DONE:%.*]] = icmp eq i64 [[NEXT_INDEX]], [[N]] +; CHECK-NEXT: br i1 [[DONE]], label %[[EXIT:.*]], label %[[LOOP]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: store i8 [[RES]], ptr [[OUT]], align 1 ; CHECK-NEXT: ret void ; entry: |
