[llvm-branch-commits] [llvm] InstCombine: Propagate profile metadata in mul(select) folding (PR #179752)
Snehasish Kumar via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Feb 4 16:48:59 PST 2026
https://github.com/snehasish updated https://github.com/llvm/llvm-project/pull/179752
>From b2cdda515db603b82ccf562924f8d4f2e0ac9a2e Mon Sep 17 00:00:00 2001
From: Snehasish Kumar <snehasishk at google.com>
Date: Tue, 3 Feb 2026 04:02:08 +0000
Subject: [PATCH] InstCombine: Propagate profile metadata in mul(select)
folding
---
.../InstCombine/InstCombineMulDivRem.cpp | 58 ++++++++++++++++---
llvm/test/Transforms/InstCombine/fmul.ll | 8 ++-
llvm/utils/profcheck-xfail.txt | 1 -
3 files changed, 55 insertions(+), 12 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index d3ce1cd13dcb2..ffb7337286e17 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -115,7 +115,17 @@ static Value *foldMulSelectToNegate(BinaryOperator &I,
m_Value(OtherOp)))) {
bool HasAnyNoWrap = I.hasNoSignedWrap() || I.hasNoUnsignedWrap();
Value *Neg = Builder.CreateNeg(OtherOp, "", HasAnyNoWrap);
- return Builder.CreateSelect(Cond, OtherOp, Neg);
+ Value *Res = Builder.CreateSelect(Cond, OtherOp, Neg);
+ if (!ProfcheckDisableMetadataFixes) {
+ Value *Sel =
+ match(I.getOperand(0), m_Select(m_Value(), m_One(), m_AllOnes()))
+ ? I.getOperand(0)
+ : I.getOperand(1);
+ if (auto *ResI = dyn_cast<Instruction>(Res))
+ if (auto *SelI = dyn_cast<Instruction>(Sel))
+ ResI->copyMetadata(*SelI);
+ }
+ return Res;
}
// mul (select Cond, -1, 1), OtherOp --> select Cond, -OtherOp, OtherOp
// mul OtherOp, (select Cond, -1, 1) --> select Cond, -OtherOp, OtherOp
@@ -123,24 +133,56 @@ static Value *foldMulSelectToNegate(BinaryOperator &I,
m_Value(OtherOp)))) {
bool HasAnyNoWrap = I.hasNoSignedWrap() || I.hasNoUnsignedWrap();
Value *Neg = Builder.CreateNeg(OtherOp, "", HasAnyNoWrap);
- return Builder.CreateSelect(Cond, Neg, OtherOp);
+ Value *Res = Builder.CreateSelect(Cond, Neg, OtherOp);
+ if (!ProfcheckDisableMetadataFixes) {
+ Value *Sel =
+ match(I.getOperand(0), m_Select(m_Value(), m_AllOnes(), m_One()))
+ ? I.getOperand(0)
+ : I.getOperand(1);
+ if (auto *ResI = dyn_cast<Instruction>(Res))
+ if (auto *SelI = dyn_cast<Instruction>(Sel))
+ ResI->copyMetadata(*SelI);
+ }
+ return Res;
}
// fmul (select Cond, 1.0, -1.0), OtherOp --> select Cond, OtherOp, -OtherOp
// fmul OtherOp, (select Cond, 1.0, -1.0) --> select Cond, OtherOp, -OtherOp
if (match(&I, m_c_FMul(m_OneUse(m_Select(m_Value(Cond), m_SpecificFP(1.0),
m_SpecificFP(-1.0))),
- m_Value(OtherOp))))
- return Builder.CreateSelectFMF(Cond, OtherOp,
- Builder.CreateFNegFMF(OtherOp, &I), &I);
+ m_Value(OtherOp)))) {
+ Value *Res = Builder.CreateSelectFMF(Cond, OtherOp,
+ Builder.CreateFNegFMF(OtherOp, &I), &I);
+ if (!ProfcheckDisableMetadataFixes) {
+ Value *Sel = match(I.getOperand(0), m_Select(m_Value(), m_SpecificFP(1.0),
+ m_SpecificFP(-1.0)))
+ ? I.getOperand(0)
+ : I.getOperand(1);
+ if (auto *ResI = dyn_cast<Instruction>(Res))
+ if (auto *SelI = dyn_cast<Instruction>(Sel))
+ ResI->copyMetadata(*SelI);
+ }
+ return Res;
+ }
// fmul (select Cond, -1.0, 1.0), OtherOp --> select Cond, -OtherOp, OtherOp
// fmul OtherOp, (select Cond, -1.0, 1.0) --> select Cond, -OtherOp, OtherOp
if (match(&I, m_c_FMul(m_OneUse(m_Select(m_Value(Cond), m_SpecificFP(-1.0),
m_SpecificFP(1.0))),
- m_Value(OtherOp))))
- return Builder.CreateSelectFMF(Cond, Builder.CreateFNegFMF(OtherOp, &I),
- OtherOp, &I);
+ m_Value(OtherOp)))) {
+ Value *Res = Builder.CreateSelectFMF(
+ Cond, Builder.CreateFNegFMF(OtherOp, &I), OtherOp, &I);
+ if (!ProfcheckDisableMetadataFixes) {
+ Value *Sel = match(I.getOperand(0), m_Select(m_Value(), m_SpecificFP(-1.0),
+ m_SpecificFP(1.0)))
+ ? I.getOperand(0)
+ : I.getOperand(1);
+ if (auto *ResI = dyn_cast<Instruction>(Res))
+ if (auto *SelI = dyn_cast<Instruction>(Sel))
+ ResI->copyMetadata(*SelI);
+ }
+ return Res;
+ }
return nullptr;
}
diff --git a/llvm/test/Transforms/InstCombine/fmul.ll b/llvm/test/Transforms/InstCombine/fmul.ll
index 3cbf7090a13b8..9c7f07ff2094e 100644
--- a/llvm/test/Transforms/InstCombine/fmul.ll
+++ b/llvm/test/Transforms/InstCombine/fmul.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: --check-globals smart
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
; RUN: opt -S -passes=instcombine -use-constant-fp-for-fixed-length-splat < %s | FileCheck %s
@@ -1141,13 +1141,13 @@ define double @fmul_negated_constant_expression(double %x) {
ret double %r
}
-define float @negate_if_true(float %x, i1 %cond) {
+define float @negate_if_true(float %x, i1 %cond) !prof !0 {
; CHECK-LABEL: @negate_if_true(
; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[X:%.*]]
; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], float [[TMP1]], float [[X]]
; CHECK-NEXT: ret float [[R]]
;
- %sel = select i1 %cond, float -1.0, float 1.0
+ %sel = select i1 %cond, float -1.0, float 1.0, !prof !1
%r = fmul float %sel, %x
ret float %r
}
@@ -1408,3 +1408,5 @@ entry:
%ret = fmul <3 x float> %a, <float -0.0, float 0.0, float poison>
ret <3 x float> %ret
}
+!0 = !{!"function_entry_count", i64 1000}
+!1 = !{!"branch_weights", i32 10, i32 20}
diff --git a/llvm/utils/profcheck-xfail.txt b/llvm/utils/profcheck-xfail.txt
index 8ce717df3e958..251ad6984f1dc 100644
--- a/llvm/utils/profcheck-xfail.txt
+++ b/llvm/utils/profcheck-xfail.txt
@@ -219,7 +219,6 @@ Transforms/InstCombine/div.ll
Transforms/InstCombine/div-shift.ll
Transforms/InstCombine/fcmp-select.ll
Transforms/InstCombine/ffs-i16.ll
-Transforms/InstCombine/fmul.ll
Transforms/InstCombine/fneg.ll
Transforms/InstCombine/intrinsic-select.ll
Transforms/InstCombine/ldexp-ext.ll
More information about the llvm-branch-commits
mailing list