diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-04-13 19:43:54 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-04-13 19:43:54 +0000 | 
| commit | ff9362a8da0074636b5f269fd5085fd28081cf74 (patch) | |
| tree | 2f87e598618b1771c94a4ea6d1c064aa4b8661f3 /llvm/lib/Transforms | |
| parent | 9d42084081bec1f7ec77ebab932d09ee0d1ccff1 (diff) | |
| download | bcm5719-llvm-ff9362a8da0074636b5f269fd5085fd28081cf74.tar.gz bcm5719-llvm-ff9362a8da0074636b5f269fd5085fd28081cf74.zip | |
Add SCCP support for constant folding calls, implementing:
test/Regression/Transforms/SCCP/calltest.ll
llvm-svn: 12921
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 34 | 
1 files changed, 33 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 8d550b82797..38a403b1a5d 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -29,6 +29,7 @@  #include "llvm/Pass.h"  #include "llvm/Type.h"  #include "llvm/Support/InstVisitor.h" +#include "llvm/Transforms/Utils/Local.h"  #include "Support/Debug.h"  #include "Support/Statistic.h"  #include "Support/STLExtras.h" @@ -220,7 +221,7 @@ private:    void visitStoreInst     (Instruction &I) { /*returns void*/ }    void visitLoadInst      (LoadInst &I);    void visitGetElementPtrInst(GetElementPtrInst &I); -  void visitCallInst      (Instruction &I) { markOverdefined(&I); } +  void visitCallInst      (CallInst &I);    void visitInvokeInst    (TerminatorInst &I) {      if (I.getType() != Type::VoidTy) markOverdefined(&I);      visitTerminatorInst(I); @@ -777,3 +778,34 @@ void SCCP::visitLoadInst(LoadInst &I) {    // Bail out.    markOverdefined(IV, &I);  } + +void SCCP::visitCallInst(CallInst &I) { +  InstVal &IV = ValueState[&I]; +  if (IV.isOverdefined()) return; + +  Function *F = I.getCalledFunction(); +  if (F == 0 || !canConstantFoldCallTo(F)) { +    markOverdefined(IV, &I); +    return; +  } + +  std::vector<Constant*> Operands; +  Operands.reserve(I.getNumOperands()-1); + +  for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) { +    InstVal &State = getValueState(I.getOperand(i)); +    if (State.isUndefined()) +      return;  // Operands are not resolved yet... +    else if (State.isOverdefined()) { +      markOverdefined(IV, &I); +      return; +    } +    assert(State.isConstant() && "Unknown state!"); +    Operands.push_back(State.getConstant()); +  } + +  if (Constant *C = ConstantFoldCall(F, Operands)) +    markConstant(IV, &I, C); +  else +    markOverdefined(IV, &I); +} | 

