diff options
author | Sanjay Patel <spatel@rotateright.com> | 2019-07-11 13:44:29 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2019-07-11 13:44:29 +0000 |
commit | 3487791fea9fc636e7807d52e816944f03cf1908 (patch) | |
tree | 514101f0dc673c1179caa29b8d56b2143a9d65b5 /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | |
parent | 7e27d86afb2d28d638b60866640f8cf16aeb29c8 (diff) | |
download | bcm5719-llvm-3487791fea9fc636e7807d52e816944f03cf1908.tar.gz bcm5719-llvm-3487791fea9fc636e7807d52e816944f03cf1908.zip |
[InstCombine] don't move FP negation out of a constant expression
-(X * ConstExpr) becomes X * (-ConstExpr), so don't reverse that
and infinite loop.
llvm-svn: 365774
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index a9e3e5f00f6..73172877d9e 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -374,11 +374,13 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) { return BinaryOperator::CreateFMulFMF(X, ConstantExpr::getFNeg(C), &I); // Sink negation: -X * Y --> -(X * Y) - if (match(Op0, m_OneUse(m_FNeg(m_Value(X))))) + // But don't transform constant expressions because there's an inverse fold. + if (match(Op0, m_OneUse(m_FNeg(m_Value(X)))) && !isa<ConstantExpr>(Op0)) return BinaryOperator::CreateFNegFMF(Builder.CreateFMulFMF(X, Op1, &I), &I); // Sink negation: Y * -X --> -(X * Y) - if (match(Op1, m_OneUse(m_FNeg(m_Value(X))))) + // But don't transform constant expressions because there's an inverse fold. + if (match(Op1, m_OneUse(m_FNeg(m_Value(X)))) && !isa<ConstantExpr>(Op1)) return BinaryOperator::CreateFNegFMF(Builder.CreateFMulFMF(X, Op0, &I), &I); // fabs(X) * fabs(X) -> X * X |