diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-05-22 03:56:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-05-22 03:56:46 +0000 |
commit | 15032581573db3c995ad53600cf6bcc6f6eb4ee0 (patch) | |
tree | c473f8bc37cc0be258e00fdcf80935173f1987c1 /llvm/lib/Transforms/InstCombine | |
parent | 5189559905af399b60d1d30ef19fdcfa0d1c201b (diff) | |
download | bcm5719-llvm-15032581573db3c995ad53600cf6bcc6f6eb4ee0.tar.gz bcm5719-llvm-15032581573db3c995ad53600cf6bcc6f6eb4ee0.zip |
[InstSimplify] Handle some overflow intrinsics in InstSimplify
This change does a few things:
- Move some InstCombine transforms to InstSimplify
- Run SimplifyCall from within InstCombine::visitCallInst
- Teach InstSimplify to fold [us]mul_with_overflow(X, undef) to 0.
llvm-svn: 237995
Diffstat (limited to 'llvm/lib/Transforms/InstCombine')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 12 |
2 files changed, 6 insertions, 12 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 3b925eda16b..e83b9dd36ae 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -13,6 +13,7 @@ #include "InstCombineInternal.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/Dominators.h" @@ -323,6 +324,11 @@ static Value *SimplifyX86vperm2(const IntrinsicInst &II, /// the heavy lifting. /// Instruction *InstCombiner::visitCallInst(CallInst &CI) { + auto Args = CI.arg_operands(); + if (Value *V = SimplifyCall(CI.getCalledValue(), Args.begin(), Args.end(), DL, + TLI, DT, AC)) + return ReplaceInstUsesWith(CI, V); + if (isFreeCall(&CI, TLI)) return visitFree(CI); diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 09ab16511e7..2dafa58d305 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -2139,10 +2139,6 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS, } // FALL THROUGH uadd into sadd case OCF_SIGNED_ADD: { - // X + undef -> undef - if (isa<UndefValue>(RHS)) - return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false); - // X + 0 -> {X, false} if (match(RHS, m_Zero())) return SetResult(LHS, Builder->getFalse(), false); @@ -2157,14 +2153,6 @@ 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>(RHS)) - return SetResult(RHS, UndefValue::get(Builder->getInt1Ty()), false); - // X - 0 -> {X, false} if (match(RHS, m_Zero())) return SetResult(LHS, Builder->getFalse(), false); |