From 7f7a0f2f83c741908407a16c1c4f6a671b6b6081 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Mon, 3 Oct 2022 17:36:55 -0400 Subject: [PATCH] [InstSimplify] reduce code duplication for fmul folds; NFC This is a modification of the earlier attempt from: 7b7940f9da80 For fma callers, we only want to swap a 0.0 or 1.0 constant. --- llvm/lib/Analysis/InstructionSimplify.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index c7a1656..786ed03 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -5325,22 +5325,18 @@ static Value *simplifyFMAFMul(Value *Op0, Value *Op1, FastMathFlags FMF, if (!isDefaultFPEnvironment(ExBehavior, Rounding)) return nullptr; - // fmul X, 1.0 ==> X + // Canonicalize special constants as operand 1. + if (match(Op0, m_FPOne()) || match(Op0, m_AnyZeroFP())) + std::swap(Op0, Op1); + + // X * 1.0 --> X if (match(Op1, m_FPOne())) return Op0; - // fmul 1.0, X ==> X - if (match(Op0, m_FPOne())) - return Op1; - - // fmul nnan nsz X, 0 ==> 0 + // X * 0.0 --> 0.0 (with nnan and nsz) if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op1, m_AnyZeroFP())) return ConstantFP::getNullValue(Op0->getType()); - // fmul nnan nsz 0, X ==> 0 - if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op0, m_AnyZeroFP())) - return ConstantFP::getNullValue(Op1->getType()); - // sqrt(X) * sqrt(X) --> X, if we can: // 1. Remove the intermediate rounding (reassociate). // 2. Ignore non-zero negative numbers because sqrt would produce NAN. -- 2.7.4