forked from OSchip/llvm-project
				
			Add support for external calls that we know how to constant fold. This implements
ctor-list-opt.ll:CTOR8 llvm-svn: 23465
This commit is contained in:
		
							parent
							
								
									1f1fd227fb
								
							
						
					
					
						commit
						3d27e7f27f
					
				| 
						 | 
				
			
			@ -1451,20 +1451,29 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,
 | 
			
		|||
      Function *Callee = dyn_cast<Function>(getVal(Values, CI->getOperand(0)));
 | 
			
		||||
      if (!Callee) return false;  // Cannot resolve.
 | 
			
		||||
 | 
			
		||||
      if (Callee->isExternal() || Callee->getFunctionType()->isVarArg()) {
 | 
			
		||||
        return false;  // TODO: Constant fold calls.
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      std::vector<Constant*> Formals;
 | 
			
		||||
      for (unsigned i = 1, e = CI->getNumOperands(); i != e; ++i)
 | 
			
		||||
        Formals.push_back(getVal(Values, CI->getOperand(i)));
 | 
			
		||||
      Constant *RetVal;
 | 
			
		||||
      
 | 
			
		||||
      // Execute the call, if successful, use the return value.
 | 
			
		||||
      if (!EvaluateFunction(Callee, RetVal, Formals, CallStack,
 | 
			
		||||
                            MutatedMemory, AllocaTmps))
 | 
			
		||||
        return false;
 | 
			
		||||
      InstResult = RetVal;
 | 
			
		||||
      if (Callee->isExternal()) {
 | 
			
		||||
        // If this is a function we can constant fold, do it.
 | 
			
		||||
        if (Constant *C = ConstantFoldCall(Callee, Formals)) {
 | 
			
		||||
          InstResult = C;
 | 
			
		||||
        } else {
 | 
			
		||||
          return false;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        if (Callee->getFunctionType()->isVarArg())
 | 
			
		||||
          return false;
 | 
			
		||||
        
 | 
			
		||||
        Constant *RetVal;
 | 
			
		||||
        
 | 
			
		||||
        // Execute the call, if successful, use the return value.
 | 
			
		||||
        if (!EvaluateFunction(Callee, RetVal, Formals, CallStack,
 | 
			
		||||
                              MutatedMemory, AllocaTmps))
 | 
			
		||||
          return false;
 | 
			
		||||
        InstResult = RetVal;
 | 
			
		||||
      }
 | 
			
		||||
    } else if (TerminatorInst *TI = dyn_cast<TerminatorInst>(CurInst)) {
 | 
			
		||||
      BasicBlock *NewBB = 0;
 | 
			
		||||
      if (BranchInst *BI = dyn_cast<BranchInst>(CurInst)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue