forked from OSchip/llvm-project
parent
ce65c060e7
commit
0bd147da17
|
@ -683,31 +683,19 @@ static void UpdateCallGraphAfterInlining(CallSite CS,
|
|||
static void HandleByValArgumentInit(Value *Dst, Value *Src, Module *M,
|
||||
BasicBlock *InsertBlock,
|
||||
InlineFunctionInfo &IFI) {
|
||||
LLVMContext &Context = Src->getContext();
|
||||
Type *VoidPtrTy = Type::getInt8PtrTy(Context);
|
||||
Type *AggTy = cast<PointerType>(Src->getType())->getElementType();
|
||||
Type *Tys[3] = { VoidPtrTy, VoidPtrTy, Type::getInt64Ty(Context) };
|
||||
Function *MemCpyFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
|
||||
IRBuilder<> builder(InsertBlock->begin());
|
||||
Value *DstCast = builder.CreateBitCast(Dst, VoidPtrTy, "tmp");
|
||||
Value *SrcCast = builder.CreateBitCast(Src, VoidPtrTy, "tmp");
|
||||
IRBuilder<> Builder(InsertBlock->begin());
|
||||
|
||||
Value *Size;
|
||||
if (IFI.DL == nullptr)
|
||||
Size = ConstantExpr::getSizeOf(AggTy);
|
||||
else
|
||||
Size = ConstantInt::get(Type::getInt64Ty(Context),
|
||||
IFI.DL->getTypeStoreSize(AggTy));
|
||||
Size = Builder.getInt64(IFI.DL->getTypeStoreSize(AggTy));
|
||||
|
||||
// Always generate a memcpy of alignment 1 here because we don't know
|
||||
// the alignment of the src pointer. Other optimizations can infer
|
||||
// better alignment.
|
||||
Value *CallArgs[] = {
|
||||
DstCast, SrcCast, Size,
|
||||
ConstantInt::get(Type::getInt32Ty(Context), 1),
|
||||
ConstantInt::getFalse(Context) // isVolatile
|
||||
};
|
||||
builder.CreateCall(MemCpyFn, CallArgs);
|
||||
Builder.CreateMemCpy(Dst, Src, Size, /*Align=*/1);
|
||||
}
|
||||
|
||||
/// HandleByValArgument - When inlining a call site that has a byval argument,
|
||||
|
|
Loading…
Reference in New Issue