summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-05-21 23:04:21 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-05-21 23:04:21 +0000
commit27e89ba24c60a917b4db63844db500c307014e50 (patch)
tree0ed0fba052f770aec13653c259aeaca19a008e99 /llvm/lib/Transforms
parenteb31b68cefd5ab38ba61ac11c73108a5e344272d (diff)
downloadbcm5719-llvm-27e89ba24c60a917b4db63844db500c307014e50.tar.gz
bcm5719-llvm-27e89ba24c60a917b4db63844db500c307014e50.zip
[InstCombine] X - 0 is equal to X, not undef
A refactoring made @llvm.ssub.with.overflow.i32(i32 %X, i32 0) transform into undef instead of %X. This fixes PR23624. llvm-svn: 237968
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp48
1 files changed, 21 insertions, 27 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index e979d76c1d0..09ab16511e7 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -2141,13 +2141,11 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS,
case OCF_SIGNED_ADD: {
// X + undef -> undef
if (isa<UndefValue>(RHS))
- return SetResult(UndefValue::get(RHS->getType()),
- UndefValue::get(Builder->getInt1Ty()), false);
+ return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false);
- if (ConstantInt *ConstRHS = dyn_cast<ConstantInt>(RHS))
- // X + 0 -> {X, false}
- if (ConstRHS->isZero())
- return SetResult(LHS, Builder->getFalse(), false);
+ // X + 0 -> {X, false}
+ if (match(RHS, m_Zero()))
+ return SetResult(LHS, Builder->getFalse(), false);
// We can strength reduce this signed add into a regular add if we can prove
// that it will never overflow.
@@ -2160,16 +2158,16 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS,
case OCF_UNSIGNED_SUB:
case OCF_SIGNED_SUB: {
// undef - X -> undef
+ if (isa<UndefValue>(LHS))
+ return SetResult(LHS, UndefValue::get(Builder->getInt1Ty()), false);
+
// X - undef -> undef
- if (isa<UndefValue>(LHS) || isa<UndefValue>(RHS))
- return SetResult(UndefValue::get(LHS->getType()),
- UndefValue::get(Builder->getInt1Ty()), false);
+ if (isa<UndefValue>(RHS))
+ return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false);
- if (ConstantInt *ConstRHS = dyn_cast<ConstantInt>(RHS))
- // X - 0 -> {X, false}
- if (ConstRHS->isZero())
- return SetResult(UndefValue::get(LHS->getType()), Builder->getFalse(),
- false);
+ // X - 0 -> {X, false}
+ if (match(RHS, m_Zero()))
+ return SetResult(LHS, Builder->getFalse(), false);
if (OCF == OCF_SIGNED_SUB) {
if (WillNotOverflowSignedSub(LHS, RHS, OrigI))
@@ -2194,19 +2192,15 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS,
case OCF_SIGNED_MUL:
// X * undef -> undef
if (isa<UndefValue>(RHS))
- return SetResult(UndefValue::get(LHS->getType()),
- UndefValue::get(Builder->getInt1Ty()), false);
-
- if (ConstantInt *RHSI = dyn_cast<ConstantInt>(RHS)) {
- // X * 0 -> {0, false}
- if (RHSI->isZero())
- return SetResult(Constant::getNullValue(RHS->getType()),
- Builder->getFalse(), false);
-
- // X * 1 -> {X, false}
- if (RHSI->equalsInt(1))
- return SetResult(LHS, Builder->getFalse(), false);
- }
+ return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false);
+
+ // X * 0 -> {0, false}
+ if (match(RHS, m_Zero()))
+ return SetResult(RHS, Builder->getFalse(), false);
+
+ // X * 1 -> {X, false}
+ if (match(RHS, m_One()))
+ return SetResult(LHS, Builder->getFalse(), false);
if (OCF == OCF_SIGNED_MUL)
if (WillNotOverflowSignedMul(LHS, RHS, OrigI))
OpenPOWER on IntegriCloud