diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-08-22 16:41:23 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-08-22 16:41:23 +0000 |
commit | 0e6c98669661347727fa13414e7046afaad565bd (patch) | |
tree | 6b88ad1e92ef861458f52560732c15f5f402e71f /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | 5117674f55a7d9f4359cf1ad9f1591db9997b231 (diff) | |
download | bcm5719-llvm-0e6c98669661347727fa13414e7046afaad565bd.tar.gz bcm5719-llvm-0e6c98669661347727fa13414e7046afaad565bd.zip |
InstCombine: sub nsw %x, C -> add nsw %x, -C if C isn't INT_MIN
We can preserve nsw during this transform if -C won't overflow.
llvm-svn: 216269
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index e7e6cdd63d1..600e09433cc 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1539,6 +1539,9 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { "Expected a subtraction operator!"); if (BO->hasNoSignedWrap() && I.hasNoSignedWrap()) Res->setHasNoSignedWrap(true); + } else { + if (cast<Constant>(Op1)->isNotMinSignedValue() && I.hasNoSignedWrap()) + Res->setHasNoSignedWrap(true); } return Res; @@ -1629,7 +1632,7 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { // 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() && !C->isOneValue()) + C->isNotMinSignedValue() && !C->isOneValue()) return BinaryOperator::CreateSDiv(X, ConstantExpr::getNeg(C)); // 0 - (X << Y) -> (-X << Y) when X is freely negatable. |