diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-09-13 12:14:31 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-09-13 12:14:31 +0000 |
commit | ff987ac6ea5a0d45d85e5da5161eb6945d27d421 (patch) | |
tree | 2ddfa2c0bf4e64204beb9902ed1a25a445aa2070 /llvm/lib/Target | |
parent | 842cda631238e295f0e2e78893459a3d42de1067 (diff) | |
download | bcm5719-llvm-ff987ac6ea5a0d45d85e5da5161eb6945d27d421.tar.gz bcm5719-llvm-ff987ac6ea5a0d45d85e5da5161eb6945d27d421.zip |
AMDGPU: Fix not preserving alignent in call setups
If an argument was passed on the stack, this
was using the default alignment.
I'm not sure there's an observable change from this. This
was observable due to bugs in expansion of unaligned
loads and stores, but since that is fixed I don't think
this matters much.
llvm-svn: 342133
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index ccb0072022e..733cff7acfe 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -2518,12 +2518,17 @@ SDValue SITargetLowering::LowerCall(CallLoweringInfo &CLI, int32_t Offset = LocMemOffset; SDValue PtrOff = DAG.getConstant(Offset, DL, PtrVT); + unsigned Align = 0; if (IsTailCall) { ISD::ArgFlagsTy Flags = Outs[realArgIdx].Flags; unsigned OpSize = Flags.isByVal() ? Flags.getByValSize() : VA.getValVT().getStoreSize(); + // FIXME: We can have better than the minimum byval required alignment. + Align = Flags.isByVal() ? Flags.getByValAlign() : + MinAlign(Subtarget->getStackAlignment(), Offset); + Offset = Offset + FPDiff; int FI = MFI.CreateFixedObject(OpSize, Offset, true); @@ -2541,6 +2546,7 @@ SDValue SITargetLowering::LowerCall(CallLoweringInfo &CLI, } else { DstAddr = PtrOff; DstInfo = MachinePointerInfo::getStack(MF, LocMemOffset); + Align = MinAlign(Subtarget->getStackAlignment(), LocMemOffset); } if (Outs[i].Flags.isByVal()) { @@ -2555,7 +2561,7 @@ SDValue SITargetLowering::LowerCall(CallLoweringInfo &CLI, MemOpChains.push_back(Cpy); } else { - SDValue Store = DAG.getStore(Chain, DL, Arg, DstAddr, DstInfo); + SDValue Store = DAG.getStore(Chain, DL, Arg, DstAddr, DstInfo, Align); MemOpChains.push_back(Store); } } |