AMDGPU/SI: Remove hack for selecting < 32-bit loads to MUBUF instructions

Summary:
The isGlobalLoad() query was returning true for constant address space loads
with memory types less than 32-bits, which is wrong.  This logic has been
replaced with PatFrag in the TableGen files, to provide the same functionality.

Reviewers: arsenm

Subscribers: arsenm, kzhuravl, llvm-commits

Differential Revision: http://reviews.llvm.org/D21696

llvm-svn: 274521
This commit is contained in:
Tom Stellard 2016-07-04 20:41:48 +00:00
parent 3ad040909a
commit 17a0ec5400
3 changed files with 15 additions and 15 deletions

View File

@ -533,10 +533,6 @@ bool AMDGPUDAGToDAGISel::isGlobalLoad(const MemSDNode *N) const {
if (Subtarget->getGeneration() < AMDGPUSubtarget::SOUTHERN_ISLANDS) if (Subtarget->getGeneration() < AMDGPUSubtarget::SOUTHERN_ISLANDS)
return !isa<GlobalValue>(GetUnderlyingObject( return !isa<GlobalValue>(GetUnderlyingObject(
N->getMemOperand()->getValue(), CurDAG->getDataLayout())); N->getMemOperand()->getValue(), CurDAG->getDataLayout()));
//TODO: Why do we need this?
if (N->getMemoryVT().bitsLT(MVT::i32))
return true;
} }
return checkType(N->getMemOperand()->getValue(), AMDGPUAS::GLOBAL_ADDRESS); return checkType(N->getMemOperand()->getValue(), AMDGPUAS::GLOBAL_ADDRESS);

View File

@ -170,17 +170,21 @@ def atomic_flat_store: flat_st <atomic_store>;
def flat_truncstorei8 : flat_st <truncstorei8>; def flat_truncstorei8 : flat_st <truncstorei8>;
def flat_truncstorei16 : flat_st <truncstorei16>; def flat_truncstorei16 : flat_st <truncstorei16>;
class MubufLoad <SDPatternOperator op> : PatFrag <
(ops node:$ptr), (op node:$ptr), [{
def mubuf_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{ const MemSDNode *LD = cast<MemSDNode>(N);
return isGlobalLoad(cast<LoadSDNode>(N)) || return LD->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS ||
isConstantLoad(cast<LoadSDNode>(N), -1); LD->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS;
}]>; }]>;
def mubuf_load_atomic : PatFrag <(ops node:$ptr), (atomic_load node:$ptr), [{ def mubuf_load : MubufLoad <load>;
return isGlobalLoad(cast<MemSDNode>(N)) || def mubuf_az_extloadi8 : MubufLoad <az_extloadi8>;
isConstantLoad(cast<MemSDNode>(N), -1); def mubuf_sextloadi8 : MubufLoad <sextloadi8>;
}]>; def mubuf_az_extloadi16 : MubufLoad <az_extloadi16>;
def mubuf_sextloadi16 : MubufLoad <sextloadi16>;
def mubuf_load_atomic : MubufLoad <atomic_load>;
def smrd_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{ def smrd_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{
auto Ld = cast<LoadSDNode>(N); auto Ld = cast<LoadSDNode>(N);

View File

@ -953,16 +953,16 @@ defm BUFFER_STORE_FORMAT_XYZW : MUBUF_Store_Helper <
mubuf<0x07>, "buffer_store_format_xyzw", VReg_128 mubuf<0x07>, "buffer_store_format_xyzw", VReg_128
>; >;
defm BUFFER_LOAD_UBYTE : MUBUF_Load_Helper < defm BUFFER_LOAD_UBYTE : MUBUF_Load_Helper <
mubuf<0x08, 0x10>, "buffer_load_ubyte", VGPR_32, i32, az_extloadi8_global mubuf<0x08, 0x10>, "buffer_load_ubyte", VGPR_32, i32, mubuf_az_extloadi8
>; >;
defm BUFFER_LOAD_SBYTE : MUBUF_Load_Helper < defm BUFFER_LOAD_SBYTE : MUBUF_Load_Helper <
mubuf<0x09, 0x11>, "buffer_load_sbyte", VGPR_32, i32, sextloadi8_global mubuf<0x09, 0x11>, "buffer_load_sbyte", VGPR_32, i32, mubuf_sextloadi8
>; >;
defm BUFFER_LOAD_USHORT : MUBUF_Load_Helper < defm BUFFER_LOAD_USHORT : MUBUF_Load_Helper <
mubuf<0x0a, 0x12>, "buffer_load_ushort", VGPR_32, i32, az_extloadi16_global mubuf<0x0a, 0x12>, "buffer_load_ushort", VGPR_32, i32, mubuf_az_extloadi16
>; >;
defm BUFFER_LOAD_SSHORT : MUBUF_Load_Helper < defm BUFFER_LOAD_SSHORT : MUBUF_Load_Helper <
mubuf<0x0b, 0x13>, "buffer_load_sshort", VGPR_32, i32, sextloadi16_global mubuf<0x0b, 0x13>, "buffer_load_sshort", VGPR_32, i32, mubuf_sextloadi16
>; >;
defm BUFFER_LOAD_DWORD : MUBUF_Load_Helper < defm BUFFER_LOAD_DWORD : MUBUF_Load_Helper <
mubuf<0x0c, 0x14>, "buffer_load_dword", VGPR_32, i32, mubuf_load mubuf<0x0c, 0x14>, "buffer_load_dword", VGPR_32, i32, mubuf_load