diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-05-21 23:04:21 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-05-21 23:04:21 +0000 |
commit | 27e89ba24c60a917b4db63844db500c307014e50 (patch) | |
tree | 0ed0fba052f770aec13653c259aeaca19a008e99 /llvm/lib/Transforms | |
parent | eb31b68cefd5ab38ba61ac11c73108a5e344272d (diff) | |
download | bcm5719-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.cpp | 48 |
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)) |