mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 14:10:55 +00:00
CodeGen: Fix SelectionDAGISel::LowerArguments for sret addr space
SelectionDAGISel::LowerArguments assumes sret addr space is 0, which is not true for amdgcn---amdgiz target. This patch fixes that. Differential Revision: https://reviews.llvm.org/D40255 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319630 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fec09ca00e
commit
8b47f7bedd
@ -1472,7 +1472,9 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
|
||||
// Leave Outs empty so that LowerReturn won't try to load return
|
||||
// registers the usual way.
|
||||
SmallVector<EVT, 1> PtrValueVTs;
|
||||
ComputeValueVTs(TLI, DL, PointerType::getUnqual(F->getReturnType()),
|
||||
ComputeValueVTs(TLI, DL,
|
||||
F->getReturnType()->getPointerTo(
|
||||
DAG.getDataLayout().getAllocaAddrSpace()),
|
||||
PtrValueVTs);
|
||||
|
||||
SDValue RetPtr = DAG.getCopyFromReg(DAG.getEntryNode(), getCurSDLoc(),
|
||||
@ -1489,10 +1491,10 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
|
||||
// An aggregate return value cannot wrap around the address space, so
|
||||
// offsets to its parts don't wrap either.
|
||||
SDValue Ptr = DAG.getObjectPtrOffset(getCurSDLoc(), RetPtr, Offsets[i]);
|
||||
Chains[i] = DAG.getStore(Chain, getCurSDLoc(),
|
||||
SDValue(RetOp.getNode(), RetOp.getResNo() + i),
|
||||
// FIXME: better loc info would be nice.
|
||||
Ptr, MachinePointerInfo());
|
||||
Chains[i] = DAG.getStore(
|
||||
Chain, getCurSDLoc(), SDValue(RetOp.getNode(), RetOp.getResNo() + i),
|
||||
// FIXME: better loc info would be nice.
|
||||
Ptr, MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()));
|
||||
}
|
||||
|
||||
Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(),
|
||||
@ -8595,7 +8597,9 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
// Put in an sret pointer parameter before all the other parameters.
|
||||
SmallVector<EVT, 1> ValueVTs;
|
||||
ComputeValueVTs(*TLI, DAG.getDataLayout(),
|
||||
PointerType::getUnqual(F.getReturnType()), ValueVTs);
|
||||
F.getReturnType()->getPointerTo(
|
||||
DAG.getDataLayout().getAllocaAddrSpace()),
|
||||
ValueVTs);
|
||||
|
||||
// NOTE: Assuming that a pointer will never break down to more than one VT
|
||||
// or one register.
|
||||
@ -8749,7 +8753,9 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
// from the sret argument into it.
|
||||
SmallVector<EVT, 1> ValueVTs;
|
||||
ComputeValueVTs(*TLI, DAG.getDataLayout(),
|
||||
PointerType::getUnqual(F.getReturnType()), ValueVTs);
|
||||
F.getReturnType()->getPointerTo(
|
||||
DAG.getDataLayout().getAllocaAddrSpace()),
|
||||
ValueVTs);
|
||||
MVT VT = ValueVTs[0].getSimpleVT();
|
||||
MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
|
||||
Optional<ISD::NodeType> AssertOp = None;
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc -march=amdgcn -mcpu=hawaii -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89 %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,GFX9 %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=hawaii -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89 %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=gfx900 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,GFX9 %s
|
||||
|
||||
; GCN-LABEL: {{^}}i1_func_void:
|
||||
; GCN: buffer_load_ubyte v0, off
|
||||
@ -376,13 +376,13 @@ define {i8, i32} @struct_i8_i32_func_void() #0 {
|
||||
; GCN: buffer_load_dword [[VAL1:v[0-9]+]]
|
||||
; GCN: buffer_store_byte [[VAL0]], v0, s[0:3], s4 offen{{$}}
|
||||
; GCN: buffer_store_dword [[VAL1]], v0, s[0:3], s4 offen offset:4{{$}}
|
||||
define void @void_func_sret_struct_i8_i32({ i8, i32 }* sret %arg0) #0 {
|
||||
define void @void_func_sret_struct_i8_i32({ i8, i32 } addrspace(5)* sret %arg0) #0 {
|
||||
%val0 = load volatile i8, i8 addrspace(1)* undef
|
||||
%val1 = load volatile i32, i32 addrspace(1)* undef
|
||||
%gep0 = getelementptr inbounds { i8, i32 }, { i8, i32 }* %arg0, i32 0, i32 0
|
||||
%gep1 = getelementptr inbounds { i8, i32 }, { i8, i32 }* %arg0, i32 0, i32 1
|
||||
store i8 %val0, i8* %gep0
|
||||
store i32 %val1, i32* %gep1
|
||||
%gep0 = getelementptr inbounds { i8, i32 }, { i8, i32 } addrspace(5)* %arg0, i32 0, i32 0
|
||||
%gep1 = getelementptr inbounds { i8, i32 }, { i8, i32 } addrspace(5)* %arg0, i32 0, i32 1
|
||||
store i8 %val0, i8 addrspace(5)* %gep0
|
||||
store i32 %val1, i32 addrspace(5)* %gep1
|
||||
ret void
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user