[llvm] [ProfCheck][Matrix] Propagate profile information for selects (PR #181248)
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 13 09:13:25 PST 2026
https://github.com/boomanaiden154 updated https://github.com/llvm/llvm-project/pull/181248
>From ce3ded917d0a0dd4283fe66e68bfa34cb57acd40 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 12 Feb 2026 21:44:00 +0000
Subject: [PATCH 1/6] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
---
.../lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp | 3 ++-
.../test/Transforms/LowerMatrixIntrinsics/select.ll | 13 +++++++++----
llvm/utils/profcheck-xfail.txt | 1 -
3 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
index ecf295dc75c3a..73cdbd52b910d 100644
--- a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -2468,7 +2468,8 @@ class LowerMatrixIntrinsics {
}
for (auto [CV, AV, BV] : llvm::zip_equal(CondV, A.vectors(), B.vectors()))
- Result.addVector(Builder.CreateSelect(CV, AV, BV));
+ Result.addVector(
+ Builder.CreateSelectWithUnknownProfile(CV, AV, BV, DEBUG_TYPE));
return Result.addNumComputeOps(getNumOps(Result.getVectorTy()) *
Result.getNumVectors());
diff --git a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
index bd97915759aac..724ee6467b5bf 100644
--- a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
+++ b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
@@ -1,7 +1,7 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
; RUN: opt -passes='lower-matrix-intrinsics' -S < %s | FileCheck %s
-define void @select_2x2_bot(i1 %cond, ptr %lhs, ptr %rhs, ptr %out) {
+define void @select_2x2_bot(i1 %cond, ptr %lhs, ptr %rhs, ptr %out) !prof !0 {
; CHECK-LABEL: @select_2x2_bot(
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x float>, ptr [[LHS:%.*]], align 16
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr float, ptr [[LHS]], i64 2
@@ -9,8 +9,8 @@ define void @select_2x2_bot(i1 %cond, ptr %lhs, ptr %rhs, ptr %out) {
; CHECK-NEXT: [[COL_LOAD2:%.*]] = load <2 x float>, ptr [[RHS:%.*]], align 16
; CHECK-NEXT: [[VEC_GEP3:%.*]] = getelementptr float, ptr [[RHS]], i64 2
; CHECK-NEXT: [[COL_LOAD4:%.*]] = load <2 x float>, ptr [[VEC_GEP3]], align 8
-; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND:%.*]], <2 x float> [[COL_LOAD]], <2 x float> [[COL_LOAD2]]
-; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[COND]], <2 x float> [[COL_LOAD1]], <2 x float> [[COL_LOAD4]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND:%.*]], <2 x float> [[COL_LOAD]], <2 x float> [[COL_LOAD2]], !prof [[PROF1:![0-9]+]]
+; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[COND]], <2 x float> [[COL_LOAD1]], <2 x float> [[COL_LOAD4]], !prof [[PROF1]]
; CHECK-NEXT: store <2 x float> [[TMP1]], ptr [[OUT:%.*]], align 4
; CHECK-NEXT: [[VEC_GEP5:%.*]] = getelementptr float, ptr [[OUT]], i64 2
; CHECK-NEXT: store <2 x float> [[TMP2]], ptr [[VEC_GEP5]], align 4
@@ -205,3 +205,8 @@ define void @select_2x2_vcond_shape5(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
store <4 x float> %op, ptr %out
ret void
}
+
+!0 = !{!"function_entry_count", i64 1000}
+;.
+; CHECK: [[PROF1]] = !{!"unknown", !"lower-matrix-intrinsics"}
+;.
diff --git a/llvm/utils/profcheck-xfail.txt b/llvm/utils/profcheck-xfail.txt
index 454f3d8f8fe00..63b1cf9696c65 100644
--- a/llvm/utils/profcheck-xfail.txt
+++ b/llvm/utils/profcheck-xfail.txt
@@ -190,7 +190,6 @@ Transforms/LowerMatrixIntrinsics/multiply-fused-loops.ll
Transforms/LowerMatrixIntrinsics/multiply-fused-loops-large-matrixes.ll
Transforms/LowerMatrixIntrinsics/multiply-fused-multiple-blocks.ll
Transforms/LowerMatrixIntrinsics/multiply-fused-volatile.ll
-Transforms/LowerMatrixIntrinsics/select.ll
Transforms/LowerSwitch/2003-05-01-PHIProblem.ll
Transforms/LowerSwitch/2004-03-13-SwitchIsDefaultCrash.ll
Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll
>From 8f1ff22e3195e37079feb7f11f597900c472c9cb Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 12 Feb 2026 22:21:38 +0000
Subject: [PATCH 2/6] feedback
Created using spr 1.3.7
---
llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp | 4 +++-
llvm/test/Transforms/LowerMatrixIntrinsics/select.ll | 9 +++++----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
index 73cdbd52b910d..149493e7cffbe 100644
--- a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -2459,17 +2459,19 @@ class LowerMatrixIntrinsics {
MatrixTy B = getMatrix(OpB, Shape, Builder);
SmallVector<Value*> CondV;
+ Instruction* MDFrom = nullptr;
if (isa<FixedVectorType>(Cond->getType())) {
MatrixTy C = getMatrix(Cond, Shape, Builder);
llvm::copy(C.vectors(), std::back_inserter(CondV));
} else {
CondV.resize(A.getNumVectors());
llvm::fill(CondV, Cond);
+ MDFrom = Inst;
}
for (auto [CV, AV, BV] : llvm::zip_equal(CondV, A.vectors(), B.vectors()))
Result.addVector(
- Builder.CreateSelectWithUnknownProfile(CV, AV, BV, DEBUG_TYPE));
+ Builder.CreateSelect(CV, AV, BV, "", MDFrom));
return Result.addNumComputeOps(getNumOps(Result.getVectorTy()) *
Result.getNumVectors());
diff --git a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
index 724ee6467b5bf..9ff22879c2412 100644
--- a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
+++ b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
@@ -18,7 +18,7 @@ define void @select_2x2_bot(i1 %cond, ptr %lhs, ptr %rhs, ptr %out) !prof !0 {
;
%lhsv = load <4 x float>, ptr %lhs
%rhsv = load <4 x float>, ptr %rhs
- %op = select i1 %cond, <4 x float> %lhsv, <4 x float> %rhsv
+ %op = select i1 %cond, <4 x float> %lhsv, <4 x float> %rhsv, !prof !1
call void @llvm.matrix.column.major.store(<4 x float> %op, ptr %out, i64 2, i1 false, i32 2, i32 2)
ret void
}
@@ -67,7 +67,7 @@ define void @select_2x2_rhs(i1 %cond, ptr %lhs, ptr %rhs, ptr %out) {
ret void
}
-define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
+define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) !prof !0 {
; CHECK-LABEL: @select_2x2_vcond_shape1(
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x float>, ptr [[LHS:%.*]], align 16
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr float, ptr [[LHS]], i64 2
@@ -88,7 +88,7 @@ define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
%lhsv = load <4 x float>, ptr %lhs
%condv = load <4 x i1>, ptr %cond
%rhsv = call <4 x float> @llvm.matrix.column.major.load(ptr %rhs, i64 2, i1 false, i32 2, i32 2)
- %op = select <4 x i1> %condv, <4 x float> %lhsv, <4 x float> %rhsv
+ %op = select <4 x i1> %condv, <4 x float> %lhsv, <4 x float> %rhsv, !prof !1
store <4 x float> %op, ptr %out
ret void
}
@@ -207,6 +207,7 @@ define void @select_2x2_vcond_shape5(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
}
!0 = !{!"function_entry_count", i64 1000}
+!1 = !{!"branch_weights", i32 2, i32 3}
;.
-; CHECK: [[PROF1]] = !{!"unknown", !"lower-matrix-intrinsics"}
+; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}
;.
>From a7224b699b13ad956e1a1c40a0694807ebec779f Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 12 Feb 2026 22:25:04 +0000
Subject: [PATCH 3/6] fix
Created using spr 1.3.7
---
llvm/test/Transforms/LowerMatrixIntrinsics/select.ll | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
index 9ff22879c2412..73ac5f8b78704 100644
--- a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
+++ b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
@@ -67,7 +67,7 @@ define void @select_2x2_rhs(i1 %cond, ptr %lhs, ptr %rhs, ptr %out) {
ret void
}
-define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) !prof !0 {
+define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
; CHECK-LABEL: @select_2x2_vcond_shape1(
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x float>, ptr [[LHS:%.*]], align 16
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr float, ptr [[LHS]], i64 2
@@ -88,7 +88,7 @@ define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) !p
%lhsv = load <4 x float>, ptr %lhs
%condv = load <4 x i1>, ptr %cond
%rhsv = call <4 x float> @llvm.matrix.column.major.load(ptr %rhs, i64 2, i1 false, i32 2, i32 2)
- %op = select <4 x i1> %condv, <4 x float> %lhsv, <4 x float> %rhsv, !prof !1
+ %op = select <4 x i1> %condv, <4 x float> %lhsv, <4 x float> %rhsv
store <4 x float> %op, ptr %out
ret void
}
>From 7f6368cd522bc8b0287de61666da1c3f10688c94 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 12 Feb 2026 22:27:46 +0000
Subject: [PATCH 4/6] formatting
Created using spr 1.3.7
---
llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
index 149493e7cffbe..053f1d99274ae 100644
--- a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -2459,7 +2459,7 @@ class LowerMatrixIntrinsics {
MatrixTy B = getMatrix(OpB, Shape, Builder);
SmallVector<Value*> CondV;
- Instruction* MDFrom = nullptr;
+ Instruction *MDFrom = nullptr;
if (isa<FixedVectorType>(Cond->getType())) {
MatrixTy C = getMatrix(Cond, Shape, Builder);
llvm::copy(C.vectors(), std::back_inserter(CondV));
@@ -2470,8 +2470,7 @@ class LowerMatrixIntrinsics {
}
for (auto [CV, AV, BV] : llvm::zip_equal(CondV, A.vectors(), B.vectors()))
- Result.addVector(
- Builder.CreateSelect(CV, AV, BV, "", MDFrom));
+ Result.addVector(Builder.CreateSelect(CV, AV, BV, "", MDFrom));
return Result.addNumComputeOps(getNumOps(Result.getVectorTy()) *
Result.getNumVectors());
>From f4b3c944ce9c1dfc64c5184de66fa93881db5fae Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Fri, 13 Feb 2026 02:28:32 +0000
Subject: [PATCH 5/6] use flag
Created using spr 1.3.7
---
llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
index 053f1d99274ae..93167c04e3142 100644
--- a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -104,6 +104,10 @@ static cl::opt<unsigned> SplitMatmulRemainderOverThreshold(
"in the inner loop of matmul"),
cl::init(0));
+namespace llvm {
+extern cl::opt<bool> ProfcheckDisableMetadataFixes;
+} // end namespace llvm
+
/// Helper function to either return Scope, if it is a subprogram or the
/// attached subprogram for a local scope.
static DISubprogram *getSubprogram(DIScope *Scope) {
@@ -2466,7 +2470,8 @@ class LowerMatrixIntrinsics {
} else {
CondV.resize(A.getNumVectors());
llvm::fill(CondV, Cond);
- MDFrom = Inst;
+ if (!ProfcheckDisableMetadataFixes)
+ MDFrom = Inst;
}
for (auto [CV, AV, BV] : llvm::zip_equal(CondV, A.vectors(), B.vectors()))
>From 07ee67991a264294ceb0ff47130574837cff99be Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Fri, 13 Feb 2026 17:13:11 +0000
Subject: [PATCH 6/6] feedback
Created using spr 1.3.7
---
llvm/test/Transforms/LowerMatrixIntrinsics/select.ll | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
index 73ac5f8b78704..cb073ba1888fb 100644
--- a/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
+++ b/llvm/test/Transforms/LowerMatrixIntrinsics/select.ll
@@ -93,7 +93,7 @@ define void @select_2x2_vcond_shape1(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
ret void
}
-define void @select_2x2_vcond_shape2(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
+define void @select_2x2_vcond_shape2(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) !prof !0 {
; CHECK-LABEL: @select_2x2_vcond_shape2(
; CHECK-NEXT: [[COL_LOAD:%.*]] = load <2 x float>, ptr [[LHS:%.*]], align 16
; CHECK-NEXT: [[VEC_GEP:%.*]] = getelementptr float, ptr [[LHS]], i64 2
@@ -114,7 +114,7 @@ define void @select_2x2_vcond_shape2(ptr %cond, ptr %lhs, ptr %rhs, ptr %out) {
%lhsv = load <4 x float>, ptr %lhs
%condv = call <4 x i1> @llvm.matrix.column.major.load(ptr %cond, i64 2, i1 false, i32 2, i32 2)
%rhsv = call <4 x float> @llvm.matrix.column.major.load(ptr %rhs, i64 2, i1 false, i32 2, i32 2)
- %op = select <4 x i1> %condv, <4 x float> %lhsv, <4 x float> %rhsv
+ %op = select <4 x i1> %condv, <4 x float> %lhsv, <4 x float> %rhsv, !prof !1
store <4 x float> %op, ptr %out
ret void
}
More information about the llvm-commits
mailing list