summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-07-02 06:42:13 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-07-02 06:42:13 +0000
commitf28e2a4282c586ab41f39c177ca9bebc9244c53f (patch)
tree1a69867fb73c64ada122852a375d355c7705e60d /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
parentc1bedac3bdeadec448266cf372c2437e8e3692b8 (diff)
downloadbcm5719-llvm-f28e2a4282c586ab41f39c177ca9bebc9244c53f.tar.gz
bcm5719-llvm-f28e2a4282c586ab41f39c177ca9bebc9244c53f.zip
InstCombine: Optimize x/INT_MIN to x==INT_MIN
The result of x/INT_MIN is either 0 or 1, we can just use an icmp instead. llvm-svn: 212167
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 497c0b49ab3..6c6e7d81516 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -993,6 +993,10 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
}
if (Constant *RHS = dyn_cast<Constant>(Op1)) {
+ // X/INT_MIN -> X == INT_MIN
+ if (RHS->isMinSignedValue())
+ return new ZExtInst(Builder->CreateICmpEQ(Op0, Op1), I.getType());
+
// -X/C --> X/-C provided the negation doesn't overflow.
if (SubOperator *Sub = dyn_cast<SubOperator>(Op0))
if (match(Sub->getOperand(0), m_Zero()) && Sub->hasNoSignedWrap())
OpenPOWER on IntegriCloud