mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-09 13:33:17 +00:00
Do not change the type of a ByVal argument to a
type of a different size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50121 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f30752cbcc
commit
63e7eb4e12
@ -8748,16 +8748,29 @@ Instruction *InstCombiner::visitCallSite(CallSite CS) {
|
|||||||
const PointerType *PTy = cast<PointerType>(Callee->getType());
|
const PointerType *PTy = cast<PointerType>(Callee->getType());
|
||||||
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
|
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
|
||||||
if (FTy->isVarArg()) {
|
if (FTy->isVarArg()) {
|
||||||
|
int ix = FTy->getNumParams() + (isa<InvokeInst>(Callee) ? 3 : 1);
|
||||||
// See if we can optimize any arguments passed through the varargs area of
|
// See if we can optimize any arguments passed through the varargs area of
|
||||||
// the call.
|
// the call.
|
||||||
for (CallSite::arg_iterator I = CS.arg_begin()+FTy->getNumParams(),
|
for (CallSite::arg_iterator I = CS.arg_begin()+FTy->getNumParams(),
|
||||||
E = CS.arg_end(); I != E; ++I)
|
E = CS.arg_end(); I != E; ++I, ++ix)
|
||||||
if (CastInst *CI = dyn_cast<CastInst>(*I)) {
|
if (CastInst *CI = dyn_cast<CastInst>(*I)) {
|
||||||
// If this cast does not effect the value passed through the varargs
|
// If this cast does not affect the value passed through the varargs
|
||||||
// area, we can eliminate the use of the cast.
|
// area, we can eliminate the use of the cast.
|
||||||
Value *Op = CI->getOperand(0);
|
const PointerType* SrcPTy, *DstPTy;
|
||||||
if (CI->isLosslessCast()) {
|
if (CI->isLosslessCast()) {
|
||||||
*I = Op;
|
// The size of ByVal arguments is derived from the type, so we
|
||||||
|
// can't change to a type with a different size. If the size were
|
||||||
|
// passed explicitly we could avoid this check.
|
||||||
|
if (CS.paramHasAttr(ix, ParamAttr::ByVal) &&
|
||||||
|
(SrcPTy = cast<PointerType>(CI->getOperand(0)->getType())) &&
|
||||||
|
(DstPTy = cast<PointerType>(CI->getType()))) {
|
||||||
|
const Type* SrcTy = SrcPTy->getElementType();
|
||||||
|
const Type* DstTy = DstPTy->getElementType();
|
||||||
|
if (!SrcTy->isSized() || !DstTy->isSized() ||
|
||||||
|
TD->getABITypeSize(SrcTy) != TD->getABITypeSize(DstTy))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*I = CI->getOperand(0);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user