diff options
author | Chris Lattner <sabre@nondot.org> | 2004-04-13 19:28:52 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-04-13 19:28:52 +0000 |
commit | ca52d0468e0681329937856e8f5298a00cca7069 (patch) | |
tree | 8888b222e45f1d670163c7892688edd536f5c88f /llvm/lib/Transforms/Utils/Local.cpp | |
parent | 7dacdb6f13100b17ad53b1dc06fd7b78bb66d3fd (diff) | |
download | bcm5719-llvm-ca52d0468e0681329937856e8f5298a00cca7069.tar.gz bcm5719-llvm-ca52d0468e0681329937856e8f5298a00cca7069.zip |
Add a simple call constant propagation interface.
llvm-svn: 12919
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index c54765b4278..29132c06809 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -57,6 +57,18 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I) { // If we reach here, all incoming values are the same constant. return Result; + } else if (CallInst *CI = dyn_cast<CallInst>(I)) { + if (Function *F = CI->getCalledFunction()) + if (canConstantFoldCallTo(F)) { + std::vector<Constant*> Args; + for (unsigned i = 1, e = CI->getNumOperands(); i != e; ++i) + if (Constant *Op = dyn_cast<Constant>(CI->getOperand(i))) + Args.push_back(Op); + else + return 0; + return ConstantFoldCall(F, Args); + } + return 0; } Constant *Op0 = 0, *Op1 = 0; @@ -216,6 +228,45 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB) { return false; } +/// canConstantFoldCallTo - Return true if its even possible to fold a call to +/// the specified function. +bool llvm::canConstantFoldCallTo(Function *F) { + const std::string &Name = F->getName(); + return Name == "sin" || Name == "cos" || Name == "tan" || Name == "sqrt"; +} + +/// ConstantFoldCall - Attempt to constant fold a call to the specified function +/// with the specified arguments, returning null if unsuccessful. +Constant *llvm::ConstantFoldCall(Function *F, + const std::vector<Constant*> &Operands) { + const std::string &Name = F->getName(); + const Type *Ty = F->getReturnType(); + + if (Name == "sin") { + if (Operands.size() == 1) + if (ConstantFP *CFP = dyn_cast<ConstantFP>(Operands[0])) + return ConstantFP::get(Ty, sin(CFP->getValue())); + + } else if (Name == "cos") { + if (Operands.size() == 1) + if (ConstantFP *CFP = dyn_cast<ConstantFP>(Operands[0])) + return ConstantFP::get(Ty, cos(CFP->getValue())); + + } else if (Name == "tan") { + if (Operands.size() == 1) + if (ConstantFP *CFP = dyn_cast<ConstantFP>(Operands[0])) + return ConstantFP::get(Ty, tan(CFP->getValue())); + + } else if (Name == "sqrt") { + if (Operands.size() == 1) + if (ConstantFP *CFP = dyn_cast<ConstantFP>(Operands[0])) + if (CFP->getValue() >= 0) + return ConstantFP::get(Ty, sqrt(CFP->getValue())); + } + return 0; +} + + //===----------------------------------------------------------------------===// |