Skip to content

Commit 83ec93f

Browse files
committed
fix byval arguments in tail calls
1 parent 9b5a321 commit 83ec93f

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

llvm/lib/Target/X86/X86ISelLoweringCall.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,6 +2493,10 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
24932493
// would clobber.
24942494
Chain = DAG.getStackArgumentTokenFactor(Chain);
24952495

2496+
if (ByValTempChain)
2497+
Chain =
2498+
DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chain, ByValTempChain);
2499+
24962500
SmallVector<SDValue, 8> MemOpChains2;
24972501
SDValue FIN;
24982502
int FI = 0;
@@ -2536,12 +2540,12 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
25362540
NeedsStackCopy = !isTailCall;
25372541
}
25382542

2539-
SDValue Source = DAG.getIntPtrConstant(VA.getLocMemOffset(), dl);
2540-
Source = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
2541-
ByValSrc, Source);
2543+
auto PtrVT = getPointerTy(DAG.getDataLayout());
2544+
SDValue DstAddr = DAG.getFrameIndex(FI, PtrVT);
25422545

2543-
MemOpChains2.push_back(
2544-
CreateCopyOfByValArgument(Source, FIN, Chain, Flags, DAG, dl));
2546+
// Copy the struct contents from ByValSrc to DstAddr.
2547+
MemOpChains2.push_back(CreateCopyOfByValArgument(
2548+
ByValSrc, DstAddr, Chain, Flags, DAG, dl));
25452549
} else {
25462550
// Store relative to framepointer.
25472551
MemOpChains2.push_back(DAG.getStore(

0 commit comments

Comments
 (0)