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

Reply via email to