+ case Instruction::Call: {
+ assert(!isa<Function>(I->getOperand(0)));
+
+ // If this is a function pointer, we can convert the return type if we can
+ // convert the source function pointer.
+ //
+ const PointerType *PT = cast<PointerType>(I->getOperand(0)->getType());
+ const FunctionType *FT = cast<FunctionType>(PT->getElementType());
+ std::vector<const Type *> ArgTys(FT->getParamTypes().begin(),
+ FT->getParamTypes().end());
+ const FunctionType *NewTy =
+ FunctionType::get(Ty, ArgTys, FT->isVarArg());
+ const PointerType *NewPTy = PointerType::get(NewTy);
+
+ Res = new CallInst(Constant::getNullValue(NewPTy),
+ std::vector<Value*>(I->op_begin()+1, I->op_end()),
+ Name);
+ VMC.ExprMap[I] = Res;
+ Res->setOperand(0, ConvertExpressionToType(I->getOperand(0), NewPTy, VMC));
+ break;
+ }