diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -2696,7 +2696,7 @@ Value *VariantOp = nullptr, *InvariantOp = nullptr; if (!match(&I, m_FMul(m_Value(VariantOp), m_Value(InvariantOp))) || - !I.hasAllowReassoc()) + !I.hasAllowReassoc() || !I.hasNoSignedZeros()) return false; if (L.isLoopInvariant(VariantOp)) std::swap(VariantOp, InvariantOp); @@ -2711,7 +2711,7 @@ Worklist.push_back(VariantBinOp); while (!Worklist.empty()) { BinaryOperator *BO = Worklist.pop_back_val(); - if (!BO->hasOneUse() || !BO->hasAllowReassoc()) + if (!BO->hasOneUse() || !BO->hasAllowReassoc() || !BO->hasNoSignedZeros()) return false; BinaryOperator *Op0, *Op1; if (match(BO, m_FAdd(m_BinOp(Op0), m_BinOp(Op1)))) {