diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2012-12-28 14:23:29 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2012-12-28 14:23:29 +0000 |
commit | e949aa1c91132094a9073c82a8aef729fa8c9eca (patch) | |
tree | a94456b93a2b3d12296e4564cffa817508acdd5a /lib/Analysis/InstructionSimplify.cpp | |
parent | c98bd9f1a79adffe73acd337b6f7f9afa6bae078 (diff) | |
download | external_llvm-e949aa1c91132094a9073c82a8aef729fa8c9eca.zip external_llvm-e949aa1c91132094a9073c82a8aef729fa8c9eca.tar.gz external_llvm-e949aa1c91132094a9073c82a8aef729fa8c9eca.tar.bz2 |
Teach instsimplify to use the constant folder where appropriate for
constant folding calls. Add the initial tests for this which show that
now instsimplify can simplify blindingly obvious code patterns expressed
with both intrinsics and library calls.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171194 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/InstructionSimplify.cpp')
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index f0696f0..e1207f1 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -2870,32 +2870,53 @@ Value *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, } template <typename IterTy> -static Value *SimplifyCall(Value *F, IterTy ArgBegin, IterTy ArgEnd, +static Value *SimplifyIntrinsic(Intrinsic::ID IID, IterTy ArgBegin, IterTy ArgEnd, + const Query &Q, unsigned MaxRecurse) { +} + +template <typename IterTy> +static Value *SimplifyCall(Value *V, IterTy ArgBegin, IterTy ArgEnd, const Query &Q, unsigned MaxRecurse) { - Type *Ty = F->getType(); + Type *Ty = V->getType(); if (PointerType *PTy = dyn_cast<PointerType>(Ty)) Ty = PTy->getElementType(); FunctionType *FTy = cast<FunctionType>(Ty); // call undef -> undef - if (isa<UndefValue>(F)) + if (isa<UndefValue>(V)) return UndefValue::get(FTy->getReturnType()); - return 0; + Function *F = dyn_cast<Function>(V); + if (!F) + return 0; + + if (!canConstantFoldCallTo(F)) + return 0; + + SmallVector<Constant *, 4> ConstantArgs; + ConstantArgs.reserve(ArgEnd - ArgBegin); + for (IterTy I = ArgBegin, E = ArgEnd; I != E; ++I) { + Constant *C = dyn_cast<Constant>(*I); + if (!C) + return 0; + ConstantArgs.push_back(C); + } + + return ConstantFoldCall(F, ConstantArgs, Q.TLI); } -Value *llvm::SimplifyCall(Value *F, User::op_iterator ArgBegin, +Value *llvm::SimplifyCall(Value *V, User::op_iterator ArgBegin, User::op_iterator ArgEnd, const DataLayout *TD, const TargetLibraryInfo *TLI, const DominatorTree *DT) { - return ::SimplifyCall(F, ArgBegin, ArgEnd, Query(TD, TLI, DT), + return ::SimplifyCall(V, ArgBegin, ArgEnd, Query(TD, TLI, DT), RecursionLimit); } -Value *llvm::SimplifyCall(Value *F, ArrayRef<Value *> Args, +Value *llvm::SimplifyCall(Value *V, ArrayRef<Value *> Args, const DataLayout *TD, const TargetLibraryInfo *TLI, const DominatorTree *DT) { - return ::SimplifyCall(F, Args.begin(), Args.end(), Query(TD, TLI, DT), + return ::SimplifyCall(V, Args.begin(), Args.end(), Query(TD, TLI, DT), RecursionLimit); } |