From: Matt Arsenault Date: Mon, 8 Jul 2019 22:08:23 +0000 (+0000) Subject: AMDGPU: Split extload/zextload local load patterns X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4916caff76dc0aaff288598174a3e7f5ea44c9ff;p=llvm AMDGPU: Split extload/zextload local load patterns This will help removing the custom load predicates, allowing the global isel emitter to handle them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365398 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AMDGPU/AMDGPUInstructions.td b/lib/Target/AMDGPU/AMDGPUInstructions.td index 7c077cdaf05..d5215ab9601 100644 --- a/lib/Target/AMDGPU/AMDGPUInstructions.td +++ b/lib/Target/AMDGPU/AMDGPUInstructions.td @@ -446,9 +446,11 @@ def truncstorei8_hi16_global : StoreHi16 , GlobalAddress; def truncstorei16_hi16_global : StoreHi16 , GlobalAddress; def load_local : LocalLoad ; -def az_extloadi8_local : LocalLoad ; +def extloadi8_local : LocalLoad ; +def zextloadi8_local : LocalLoad ; def sextloadi8_local : LocalLoad ; -def az_extloadi16_local : LocalLoad ; +def extloadi16_local : LocalLoad ; +def zextloadi16_local : LocalLoad ; def sextloadi16_local : LocalLoad ; def atomic_load_32_local : LocalLoad; def atomic_load_64_local : LocalLoad; diff --git a/lib/Target/AMDGPU/DSInstructions.td b/lib/Target/AMDGPU/DSInstructions.td index b67306107db..93308e6d78a 100644 --- a/lib/Target/AMDGPU/DSInstructions.td +++ b/lib/Target/AMDGPU/DSInstructions.td @@ -623,12 +623,15 @@ class DSReadPat_D16 : GCNPat < >; defm : DSReadPat_mc ; -defm : DSReadPat_mc ; defm : DSReadPat_mc ; -defm : DSReadPat_mc ; +defm : DSReadPat_mc ; +defm : DSReadPat_mc ; +defm : DSReadPat_mc ; +defm : DSReadPat_mc ; defm : DSReadPat_mc ; defm : DSReadPat_mc ; -defm : DSReadPat_mc ; +defm : DSReadPat_mc ; +defm : DSReadPat_mc ; defm : DSReadPat_mc ; defm : DSReadPat_mc ; defm : DSReadPat_mc ; diff --git a/lib/Target/AMDGPU/EvergreenInstructions.td b/lib/Target/AMDGPU/EvergreenInstructions.td index 0550092ce1d..fbe7d757f35 100644 --- a/lib/Target/AMDGPU/EvergreenInstructions.td +++ b/lib/Target/AMDGPU/EvergreenInstructions.td @@ -30,6 +30,10 @@ class EGOrCaymanPat : AMDGPUPat { let SubtargetPredicate = isEGorCayman; } +// FIXME: These are deprecated +def az_extloadi8_local : LocalLoad ; +def az_extloadi16_local : LocalLoad ; + //===----------------------------------------------------------------------===// // Evergreen / Cayman store instructions //===----------------------------------------------------------------------===// diff --git a/lib/Target/AMDGPU/SIInstrInfo.td b/lib/Target/AMDGPU/SIInstrInfo.td index 073ca6e0f34..4ca4d36847f 100644 --- a/lib/Target/AMDGPU/SIInstrInfo.td +++ b/lib/Target/AMDGPU/SIInstrInfo.td @@ -300,13 +300,13 @@ def AMDGPUatomic_ld_glue : SDNode <"ISD::ATOMIC_LOAD", SDTAtomicLoad, [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, SDNPInGlue] >; -def unindexedload_glue : PatFrag <(ops node:$ptr), (AMDGPUld_glue node:$ptr), [{ - return cast(N)->getAddressingMode() == ISD::UNINDEXED; -}]>; +def unindexedload_glue : PatFrag <(ops node:$ptr), (AMDGPUld_glue node:$ptr)> { + let IsUnindexed = 1; +} -def load_glue : PatFrag <(ops node:$ptr), (unindexedload_glue node:$ptr), [{ - return cast(N)->getExtensionType() == ISD::NON_EXTLOAD; -}]>; +def load_glue : PatFrag <(ops node:$ptr), (unindexedload_glue node:$ptr)> { + let IsNonExtLoad = 1; +} def atomic_load_32_glue : PatFrag<(ops node:$ptr), (AMDGPUatomic_ld_glue node:$ptr)> { @@ -320,35 +320,49 @@ def atomic_load_64_glue : PatFrag<(ops node:$ptr), let MemoryVT = i64; } -def extload_glue : PatFrag<(ops node:$ptr), (load_glue node:$ptr), [{ - return cast(N)->getExtensionType() == ISD::EXTLOAD; -}]>; +def extload_glue : PatFrag<(ops node:$ptr), (load_glue node:$ptr)> { + let IsLoad = 1; + let IsAnyExtLoad = 1; +} def sextload_glue : PatFrag<(ops node:$ptr), (unindexedload_glue node:$ptr), [{ return cast(N)->getExtensionType() == ISD::SEXTLOAD; }]>; -def zextload_glue : PatFrag<(ops node:$ptr), (unindexedload_glue node:$ptr), [{ - return cast(N)->getExtensionType() == ISD::ZEXTLOAD; -}]>; +def zextload_glue : PatFrag<(ops node:$ptr), (unindexedload_glue node:$ptr)> { + let IsLoad = 1; + let IsZeroExtLoad = 1; +} -def az_extload_glue : AZExtLoadBase ; +def extloadi8_glue : PatFrag<(ops node:$ptr), (extload_glue node:$ptr)> { + let IsLoad = 1; + let MemoryVT = i8; +} -def az_extloadi8_glue : PatFrag<(ops node:$ptr), (az_extload_glue node:$ptr), [{ - return cast(N)->getMemoryVT() == MVT::i8; -}]>; +def zextloadi8_glue : PatFrag<(ops node:$ptr), (zextload_glue node:$ptr)> { + let IsLoad = 1; + let MemoryVT = i8; +} -def az_extloadi16_glue : PatFrag<(ops node:$ptr), (az_extload_glue node:$ptr), [{ - return cast(N)->getMemoryVT() == MVT::i16; -}]>; +def extloadi16_glue : PatFrag<(ops node:$ptr), (extload_glue node:$ptr)> { + let IsLoad = 1; + let MemoryVT = i16; +} -def sextloadi8_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr), [{ - return cast(N)->getMemoryVT() == MVT::i8; -}]>; +def zextloadi16_glue : PatFrag<(ops node:$ptr), (zextload_glue node:$ptr)> { + let IsLoad = 1; + let MemoryVT = i16; +} -def sextloadi16_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr), [{ - return cast(N)->getMemoryVT() == MVT::i16; -}]>; +def sextloadi8_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr)> { + let IsLoad = 1; + let MemoryVT = i8; +} + +def sextloadi16_glue : PatFrag<(ops node:$ptr), (sextload_glue node:$ptr)> { + let IsLoad = 1; + let MemoryVT = i16; +} def load_glue_align8 : Aligned8Bytes < (ops node:$ptr), (load_glue node:$ptr) @@ -361,8 +375,10 @@ def load_glue_align16 : Aligned16Bytes < def load_local_m0 : LoadFrag, LocalAddress; def sextloadi8_local_m0 : LoadFrag, LocalAddress; def sextloadi16_local_m0 : LoadFrag, LocalAddress; -def az_extloadi8_local_m0 : LoadFrag, LocalAddress; -def az_extloadi16_local_m0 : LoadFrag, LocalAddress; +def extloadi8_local_m0 : LoadFrag, LocalAddress; +def zextloadi8_local_m0 : LoadFrag, LocalAddress; +def extloadi16_local_m0 : LoadFrag, LocalAddress; +def zextloadi16_local_m0 : LoadFrag, LocalAddress; def load_align8_local_m0 : LoadFrag , LocalAddress; def load_align16_local_m0 : LoadFrag , LocalAddress; def atomic_load_32_local_m0 : LoadFrag, LocalAddress;