diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index c7a16562b901..96b665e1c1f1 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 constant as operand 1. + if (match(Op0, m_ImmConstant())) + 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. diff --git a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll index be84594e7202..1ba4045a4e30 100644 --- a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll +++ b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll @@ -161,9 +161,9 @@ define <2 x float> @fadd_x_n0_vec_undef_elt(<2 x float> %a) { ret <2 x float> %ret } -; fmul X, 1.0 ==> X -define double @fmul_X_1(double %a) { -; CHECK-LABEL: @fmul_X_1( +; fmul 1.0, X ==> X +define double @fmul_1_X(double %a) { +; CHECK-LABEL: @fmul_1_X( ; CHECK-NEXT: ret double [[A:%.*]] ; %b = fmul double 1.0, %a