[llvm] [Scalar] Resolve FIXME: No Lowering of FNeg to FMul unless it is safe (PR #85252)

via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 14 08:44:03 PDT 2024


https://github.com/AtariDreams created https://github.com/llvm/llvm-project/pull/85252

Or association flags are specified.

>From b3e293f36469b9b82f86084488df10de276c1f47 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Thu, 14 Mar 2024 11:43:14 -0400
Subject: [PATCH] [Scalar] Resolve FIXME: No Lowering of FNeg to FMul unless it
 is safe or flags are specified

---
 llvm/lib/Transforms/Scalar/Reassociate.cpp | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp
index d91320863e241d..f44608624cf3df 100644
--- a/llvm/lib/Transforms/Scalar/Reassociate.cpp
+++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp
@@ -287,11 +287,17 @@ static Instruction *CreateNeg(Value *S1, const Twine &Name,
 static BinaryOperator *LowerNegateToMultiply(Instruction *Neg) {
   assert((isa<UnaryOperator>(Neg) || isa<BinaryOperator>(Neg)) &&
          "Expected a Negate!");
-  // FIXME: It's not safe to lower a unary FNeg into a FMul by -1.0.
   unsigned OpNo = isa<BinaryOperator>(Neg) ? 1 : 0;
   Type *Ty = Neg->getType();
-  Constant *NegOne = Ty->isIntOrIntVectorTy() ?
-    ConstantInt::getAllOnesValue(Ty) : ConstantFP::get(Ty, -1.0);
+
+  // Only lower to FMul if the operation is not a unary FNeg or Neg has the
+  // correct flags.
+  if (Ty->isFloatingPointTy() && isa<UnaryOperator>(Neg) &&
+      !hasFPAssociativeFlags(Neg))
+    return nullptr;
+
+  Constant *NegOne = Ty->isIntOrIntVectorTy() ? ConstantInt::getAllOnesValue(Ty)
+                                              : ConstantFP::get(Ty, -1.0);
 
   BinaryOperator *Res =
       CreateMul(Neg->getOperand(OpNo), NegOne, "", Neg->getIterator(), Neg);



More information about the llvm-commits mailing list