diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-07-02 06:07:09 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-07-02 06:07:09 +0000 |
commit | bdeef602e9916ed0b3da64646b91a199adef01e2 (patch) | |
tree | 93214298bb15484298ea6d955989e7a9dd6c1cee /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | 92e87349e0a14e00458b2c1199dbad156d56703a (diff) | |
download | llvm-bdeef602e9916ed0b3da64646b91a199adef01e2.zip llvm-bdeef602e9916ed0b3da64646b91a199adef01e2.tar.gz llvm-bdeef602e9916ed0b3da64646b91a199adef01e2.tar.bz2 |
InstCombine: Don't turn -(x/INT_MIN) -> x/INT_MIN
It is not safe to negate the smallest signed integer, doing so yields
the same number back.
This fixes PR20186.
llvm-svn: 212164
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index f8d7e0e..c18ed2d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1553,9 +1553,9 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { return BinaryOperator::CreateAnd(Op0, Builder->CreateNot(Y, Y->getName() + ".not")); - // 0 - (X sdiv C) -> (X sdiv -C) - if (match(Op1, m_SDiv(m_Value(X), m_Constant(C))) && - match(Op0, m_Zero())) + // 0 - (X sdiv C) -> (X sdiv -C) provided the negation doesn't overflow. + if (match(Op1, m_SDiv(m_Value(X), m_Constant(C))) && match(Op0, m_Zero()) && + !C->isMinSignedValue()) return BinaryOperator::CreateSDiv(X, ConstantExpr::getNeg(C)); // 0 - (X << Y) -> (-X << Y) when X is freely negatable. |