summaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/InstCombine/select.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/InstCombine/select.ll')
-rw-r--r--llvm/test/Transforms/InstCombine/select.ll2438
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: