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 <[email protected]> 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 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
