diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index c7a16562b901fc..786ed03d476aa4 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.