[llvm] [VectorCombine] Propagate profile metadata when combining selects (PR #217690)

Benjamin Maxwell via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 20 10:05:28 PDT 2026


https://github.com/MacDue updated https://github.com/llvm/llvm-project/pull/217690

>From e2c43bdfe29745143439306ff7f544214e3daaa8 Mon Sep 17 00:00:00 2001
From: Benjamin Maxwell <benjamin.maxwell at arm.com>
Date: Thu, 20 Aug 2026 16:33:42 +0000
Subject: [PATCH 1/2] [VectorCombine] Propagate profile metadata when combining
 selects

Note: In foldDeinterleaveInterleavePair when the condition is scalar all
instructions within a step have the same condition, so propagating from
NarrowInst works.
---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 6 ++++--
 llvm/utils/profcheck-xfail.txt                  | 1 -
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index dfe3070cfe87c..49c2148ebd914 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -33,6 +33,7 @@
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/PatternMatch.h"
+#include "llvm/IR/ProfDataUtils.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/KnownBits.h"
 #include "llvm/Support/MathExtras.h"
@@ -6092,8 +6093,9 @@ bool VectorCombine::foldDeinterleaveInterleavePair(Instruction &I) {
       return Builder.CreateCmp(Cmp->getPredicate(), NewOperands[0],
                                NewOperands[1]);
     if (isa<SelectInst>(NarrowInst))
-      return Builder.CreateSelect(NewOperands[0], NewOperands[1],
-                                  NewOperands[2]);
+      return Builder.CreateSelect(
+          NewOperands[0], NewOperands[1], NewOperands[2], /*Name=*/"",
+          ProfcheckDisableMetadataFixes ? nullptr : NarrowInst);
     if (isa<FreezeInst>(NarrowInst))
       return Builder.CreateFreeze(NewOperands[0]);
     if (auto *II = dyn_cast<IntrinsicInst>(NarrowInst))
diff --git a/llvm/utils/profcheck-xfail.txt b/llvm/utils/profcheck-xfail.txt
index 8f5b1fdbea76b..0e90386d0ffd3 100644
--- a/llvm/utils/profcheck-xfail.txt
+++ b/llvm/utils/profcheck-xfail.txt
@@ -125,5 +125,4 @@ Transforms/TailCallElim/inf-recursion.ll
 Transforms/Util/control-flow-hub-finalize-same-succ-crash.ll
 Transforms/Util/libcalls-opt-remarks.ll
 Transforms/Util/lowerswitch.ll
-Transforms/VectorCombine/deinterleave-interleave-pairs.ll
 tools/opt/mtune.ll

>From e52264450c6bcaa5cd98e9c0c991b7373b7dffdd Mon Sep 17 00:00:00 2001
From: Benjamin Maxwell <benjamin.maxwell at arm.com>
Date: Thu, 20 Aug 2026 17:05:11 +0000
Subject: [PATCH 2/2] Add prof meta

---
 .../VectorCombine/deinterleave-interleave-pairs.ll     | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/llvm/test/Transforms/VectorCombine/deinterleave-interleave-pairs.ll b/llvm/test/Transforms/VectorCombine/deinterleave-interleave-pairs.ll
index 1ffe6bac7308f..e3c542e900fe0 100644
--- a/llvm/test/Transforms/VectorCombine/deinterleave-interleave-pairs.ll
+++ b/llvm/test/Transforms/VectorCombine/deinterleave-interleave-pairs.ll
@@ -397,7 +397,7 @@ define <4 x i32> @deinterleave2_select_scalar_condition_interleave2(
 ; CHECK-LABEL: define <4 x i32> @deinterleave2_select_scalar_condition_interleave2(
 ; CHECK-SAME: <4 x i32> [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) {
 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X]], [[Y]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[COND]], <4 x i32> [[V]], <4 x i32> splat (i32 7)
+; CHECK-NEXT:    [[R:%.*]] = select i1 [[COND]], <4 x i32> [[V]], <4 x i32> splat (i32 7), !prof [[PROF1:![0-9]+]]
 ; CHECK-NEXT:    ret <4 x i32> [[R]]
 ;
   <4 x i32> %v, i32 %x, i32 %y) {
@@ -405,8 +405,8 @@ define <4 x i32> @deinterleave2_select_scalar_condition_interleave2(
   %d = call { <2 x i32>, <2 x i32> } @llvm.vector.deinterleave2.v4i32(<4 x i32> %v)
   %f0 = extractvalue { <2 x i32>, <2 x i32> } %d, 0
   %f1 = extractvalue { <2 x i32>, <2 x i32> } %d, 1
-  %u0 = select i1 %cond, <2 x i32> %f0, <2 x i32> splat (i32 7)
-  %u1 = select i1 %cond, <2 x i32> %f1, <2 x i32> splat (i32 7)
+  %u0 = select i1 %cond, <2 x i32> %f0, <2 x i32> splat (i32 7), !prof !1
+  %u1 = select i1 %cond, <2 x i32> %f1, <2 x i32> splat (i32 7), !prof !1
   %r = call <4 x i32> @llvm.vector.interleave2.v4i32(<2 x i32> %u0, <2 x i32> %u1)
   ret <4 x i32> %r
 }
@@ -712,6 +712,10 @@ else:
   ret <vscale x 16 x i16> zeroinitializer
 }
 
+!0 = !{!"function_entry_count", i64 1000}
+!1 = !{!"branch_weights", i32 2, i32 3}
+
 ;.
 ; CHECK: [[META0]] = !{float 2.500000e+00}
+; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}
 ;.



More information about the llvm-commits mailing list