mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
AMDGPU: Avoid code predicates for extload PatFrags
Use the MemoryVT field. This will be necessary for tablegen to automatically handle patterns for GlobalISel. Doesn't handle the d16 lo/hi patterns. Those are a special case since it involvess the custom node type. llvm-svn: 366168
This commit is contained in:
parent
e91ea804fa
commit
b2782227ab
@ -379,27 +379,6 @@ class FlatStoreAddress : CodePatPred<[{
|
||||
AS == AMDGPUAS::GLOBAL_ADDRESS;
|
||||
}]>;
|
||||
|
||||
class AZExtLoadBase <SDPatternOperator ld_node>: PatFrag<(ops node:$ptr),
|
||||
(ld_node node:$ptr), [{
|
||||
LoadSDNode *L = cast<LoadSDNode>(N);
|
||||
return L->getExtensionType() == ISD::ZEXTLOAD ||
|
||||
L->getExtensionType() == ISD::EXTLOAD;
|
||||
}]>;
|
||||
|
||||
def az_extload : AZExtLoadBase <unindexedload>;
|
||||
|
||||
def az_extloadi8 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
|
||||
}]>;
|
||||
|
||||
def az_extloadi16 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
|
||||
}]>;
|
||||
|
||||
def az_extloadi32 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
|
||||
}]>;
|
||||
|
||||
class PrivateLoad <SDPatternOperator op> : LoadFrag <op>, PrivateAddress;
|
||||
class PrivateStore <SDPatternOperator op> : StoreFrag <op>, PrivateAddress;
|
||||
|
||||
@ -419,9 +398,11 @@ class ConstantLoad <SDPatternOperator op> : LoadFrag <op>, ConstantAddress;
|
||||
|
||||
|
||||
def load_private : PrivateLoad <load>;
|
||||
def az_extloadi8_private : PrivateLoad <az_extloadi8>;
|
||||
def extloadi8_private : PrivateLoad <extloadi8>;
|
||||
def zextloadi8_private : PrivateLoad <zextloadi8>;
|
||||
def sextloadi8_private : PrivateLoad <sextloadi8>;
|
||||
def az_extloadi16_private : PrivateLoad <az_extloadi16>;
|
||||
def extloadi16_private : PrivateLoad <extloadi16>;
|
||||
def zextloadi16_private : PrivateLoad <zextloadi16>;
|
||||
def sextloadi16_private : PrivateLoad <sextloadi16>;
|
||||
|
||||
def store_private : PrivateStore <store>;
|
||||
@ -433,9 +414,11 @@ def truncstorei8_hi16_private : StoreHi16<truncstorei8>, PrivateAddress;
|
||||
|
||||
def load_global : GlobalLoad <load>;
|
||||
def sextloadi8_global : GlobalLoad <sextloadi8>;
|
||||
def az_extloadi8_global : GlobalLoad <az_extloadi8>;
|
||||
def extloadi8_global : GlobalLoad <extloadi8>;
|
||||
def zextloadi8_global : GlobalLoad <zextloadi8>;
|
||||
def sextloadi16_global : GlobalLoad <sextloadi16>;
|
||||
def az_extloadi16_global : GlobalLoad <az_extloadi16>;
|
||||
def extloadi16_global : GlobalLoad <extloadi16>;
|
||||
def zextloadi16_global : GlobalLoad <zextloadi16>;
|
||||
def atomic_load_global : GlobalLoad<atomic_load>;
|
||||
|
||||
def store_global : GlobalStore <store>;
|
||||
@ -479,9 +462,11 @@ def store_align16_local : Aligned16Bytes <
|
||||
>;
|
||||
|
||||
def load_flat : FlatLoad <load>;
|
||||
def az_extloadi8_flat : FlatLoad <az_extloadi8>;
|
||||
def extloadi8_flat : FlatLoad <extloadi8>;
|
||||
def zextloadi8_flat : FlatLoad <zextloadi8>;
|
||||
def sextloadi8_flat : FlatLoad <sextloadi8>;
|
||||
def az_extloadi16_flat : FlatLoad <az_extloadi16>;
|
||||
def extloadi16_flat : FlatLoad <extloadi16>;
|
||||
def zextloadi16_flat : FlatLoad <zextloadi16>;
|
||||
def sextloadi16_flat : FlatLoad <sextloadi16>;
|
||||
def atomic_load_flat : FlatLoad<atomic_load>;
|
||||
|
||||
@ -495,9 +480,11 @@ def truncstorei16_hi16_flat : StoreHi16<truncstorei16>, FlatStoreAddress;
|
||||
|
||||
def constant_load : ConstantLoad<load>;
|
||||
def sextloadi8_constant : ConstantLoad <sextloadi8>;
|
||||
def az_extloadi8_constant : ConstantLoad <az_extloadi8>;
|
||||
def extloadi8_constant : ConstantLoad <extloadi8>;
|
||||
def zextloadi8_constant : ConstantLoad <zextloadi8>;
|
||||
def sextloadi16_constant : ConstantLoad <sextloadi16>;
|
||||
def az_extloadi16_constant : ConstantLoad <az_extloadi16>;
|
||||
def extloadi16_constant : ConstantLoad <extloadi16>;
|
||||
def zextloadi16_constant : ConstantLoad <zextloadi16>;
|
||||
|
||||
|
||||
class local_binary_atomic_op<SDNode atomic_op> :
|
||||
|
@ -851,9 +851,11 @@ defm BUFFER_LOAD_DWORDX4 : MUBUF_Pseudo_Loads <
|
||||
"buffer_load_dwordx4", VReg_128, v4i32
|
||||
>;
|
||||
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_UBYTE", i32, az_extloadi8_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_UBYTE", i32, extloadi8_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_UBYTE", i32, zextloadi8_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_SBYTE", i32, sextloadi8_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_USHORT", i32, az_extloadi16_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_USHORT", i32, extloadi16_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_USHORT", i32, zextloadi16_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_SSHORT", i32, sextloadi16_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_DWORD", i32, load_global>;
|
||||
defm : MUBUF_Pseudo_Load_Pats<"BUFFER_LOAD_DWORDX2", v2i32, load_global>;
|
||||
@ -1437,9 +1439,11 @@ multiclass MUBUFLoad_Atomic_Pattern <MUBUF_Pseudo Instr_ADDR64, MUBUF_Pseudo Ins
|
||||
|
||||
let SubtargetPredicate = isGFX6GFX7 in {
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SBYTE_ADDR64, i32, sextloadi8_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_UBYTE_ADDR64, i32, az_extloadi8_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_UBYTE_ADDR64, i32, extloadi8_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_UBYTE_ADDR64, i32, zextloadi8_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_SSHORT_ADDR64, i32, sextloadi16_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_USHORT_ADDR64, i32, az_extloadi16_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_USHORT_ADDR64, i32, extloadi16_constant>;
|
||||
def : MUBUFLoad_PatternADDR64 <BUFFER_LOAD_USHORT_ADDR64, i32, zextloadi16_constant>;
|
||||
|
||||
defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORD_ADDR64, BUFFER_LOAD_DWORD_OFFSET, i32, atomic_load_global>;
|
||||
defm : MUBUFLoad_Atomic_Pattern <BUFFER_LOAD_DWORDX2_ADDR64, BUFFER_LOAD_DWORDX2_OFFSET, i64, atomic_load_global>;
|
||||
@ -1458,9 +1462,11 @@ multiclass MUBUFLoad_Pattern <MUBUF_Pseudo Instr_OFFSET, ValueType vt,
|
||||
let OtherPredicates = [Has16BitInsts] in {
|
||||
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, extloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, zextloadi8_constant>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_global>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_global>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, extloadi8_global>;
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_UBYTE_OFFSET, i16, zextloadi8_global>;
|
||||
|
||||
defm : MUBUFLoad_Pattern <BUFFER_LOAD_USHORT_OFFSET, i16, load_global>;
|
||||
|
||||
@ -1497,11 +1503,14 @@ multiclass MUBUFScratchLoadPat_D16 <MUBUF_Pseudo InstrOffen,
|
||||
}
|
||||
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i32, sextloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i32, az_extloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i32, extloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i32, zextloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_SBYTE_OFFEN, BUFFER_LOAD_SBYTE_OFFSET, i16, sextloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i16, az_extloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i16, extloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_UBYTE_OFFEN, BUFFER_LOAD_UBYTE_OFFSET, i16, zextloadi8_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_SSHORT_OFFEN, BUFFER_LOAD_SSHORT_OFFSET, i32, sextloadi16_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i32, az_extloadi16_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i32, extloadi16_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i32, zextloadi16_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_USHORT_OFFEN, BUFFER_LOAD_USHORT_OFFSET, i16, load_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORD_OFFEN, BUFFER_LOAD_DWORD_OFFSET, i32, load_private>;
|
||||
defm : MUBUFScratchLoadPat <BUFFER_LOAD_DWORDX2_OFFEN, BUFFER_LOAD_DWORDX2_OFFSET, v2i32, load_private>;
|
||||
|
@ -30,10 +30,6 @@ class EGOrCaymanPat<dag pattern, dag result> : AMDGPUPat<pattern, result> {
|
||||
let SubtargetPredicate = isEGorCayman;
|
||||
}
|
||||
|
||||
// FIXME: These are deprecated
|
||||
def az_extloadi8_local : LocalLoad <az_extloadi8>;
|
||||
def az_extloadi16_local : LocalLoad <az_extloadi16>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Evergreen / Cayman store instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -767,11 +767,14 @@ class FlatSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType v
|
||||
|
||||
let OtherPredicates = [HasFlatAddressSpace] in {
|
||||
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_flat, i16>;
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
|
||||
def : FlatLoadPat <FLAT_LOAD_USHORT, az_extloadi16_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_USHORT, extloadi16_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_USHORT, zextloadi16_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORD, load_flat, i32>;
|
||||
@ -849,11 +852,14 @@ def atomic_pk_fadd_global : global_binary_atomic_op_frag<SIglobal_atomic_pk_fadd
|
||||
|
||||
let OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10 in {
|
||||
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, extloadi8_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, zextloadi8_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i16>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, extloadi8_global, i16>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, zextloadi8_global, i16>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, az_extloadi16_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, extloadi16_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, zextloadi16_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_SSHORT, sextloadi16_global, i32>;
|
||||
def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, load_global, i16>;
|
||||
|
||||
|
@ -295,6 +295,32 @@ class VTX_READ <string name, dag outs, list<dag> pattern>
|
||||
let VTXInst = 1;
|
||||
}
|
||||
|
||||
// FIXME: Deprecated.
|
||||
class AZExtLoadBase <SDPatternOperator ld_node>: PatFrag<(ops node:$ptr),
|
||||
(ld_node node:$ptr), [{
|
||||
LoadSDNode *L = cast<LoadSDNode>(N);
|
||||
return L->getExtensionType() == ISD::ZEXTLOAD ||
|
||||
L->getExtensionType() == ISD::EXTLOAD;
|
||||
}]>;
|
||||
|
||||
def az_extload : AZExtLoadBase <unindexedload>;
|
||||
|
||||
def az_extloadi8 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
|
||||
}]>;
|
||||
|
||||
def az_extloadi16 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
|
||||
}]>;
|
||||
|
||||
def az_extloadi32 : PatFrag<(ops node:$ptr), (az_extload node:$ptr), [{
|
||||
return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
|
||||
}]>;
|
||||
|
||||
// FIXME: These are deprecated
|
||||
def az_extloadi8_local : LocalLoad <az_extloadi8>;
|
||||
def az_extloadi16_local : LocalLoad <az_extloadi16>;
|
||||
|
||||
class LoadParamFrag <PatFrag load_type> : PatFrag <
|
||||
(ops node:$ptr), (load_type node:$ptr),
|
||||
[{ return isConstantLoad(cast<LoadSDNode>(N), 0) ||
|
||||
|
Loading…
x
Reference in New Issue
Block a user