forked from OSchip/llvm-project
AMDGPU/SI: Consolidate FLAT patterns
Summary: We had to sets of identical FLAT patterns one inside the HasFlatAddressSpace predicate and one inside the useFlatForGloabl predicate. This patch merges these sets into a single pattern under the isCIVI predicate. The reason we can remove the predicates is that when MUBUF instructions are legal, the instruction selector will prefer selecting those over FLAT instructions because MUBUF patterns have a higher complexity score. So, in this case having patterns for FLAT instructions will have no effect. This change also simplifies the process for forcing global address space loads to use FLAT instructions, since we no only have to disable the MUBUF patterns instead of having to disable the MUBUF patterns and enable the FLAT patterns. Reviewers: arsenm, cfang Subscribers: llvm-commits llvm-svn: 256807
This commit is contained in:
parent
cc56ac3669
commit
2c82ee60c3
|
@ -204,14 +204,6 @@ def sextloadi8_global : PatFrag<(ops node:$ptr), (sextloadi8 node:$ptr), [{
|
|||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def az_extloadi8_flat : PatFrag<(ops node:$ptr), (az_extloadi8 node:$ptr), [{
|
||||
return isFlatLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def sextloadi8_flat : PatFrag<(ops node:$ptr), (sextloadi8 node:$ptr), [{
|
||||
return isFlatLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def az_extloadi8_constant : PatFrag<(ops node:$ptr), (az_extloadi8 node:$ptr), [{
|
||||
return isConstantLoad(dyn_cast<LoadSDNode>(N), -1);
|
||||
}]>;
|
||||
|
@ -243,14 +235,6 @@ def sextloadi16_global : PatFrag<(ops node:$ptr), (sextloadi16 node:$ptr), [{
|
|||
return isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def az_extloadi16_flat : PatFrag<(ops node:$ptr), (az_extloadi16 node:$ptr), [{
|
||||
return isFlatLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def sextloadi16_flat : PatFrag<(ops node:$ptr), (sextloadi16 node:$ptr), [{
|
||||
return isFlatLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def az_extloadi16_constant : PatFrag<(ops node:$ptr), (az_extloadi16 node:$ptr), [{
|
||||
return isConstantLoad(dyn_cast<LoadSDNode>(N), -1);
|
||||
}]>;
|
||||
|
@ -299,16 +283,6 @@ def truncstorei16_global : PatFrag<(ops node:$val, node:$ptr),
|
|||
return isGlobalStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def truncstorei8_flat : PatFrag<(ops node:$val, node:$ptr),
|
||||
(truncstorei8 node:$val, node:$ptr), [{
|
||||
return isFlatStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def truncstorei16_flat : PatFrag<(ops node:$val, node:$ptr),
|
||||
(truncstorei16 node:$val, node:$ptr), [{
|
||||
return isFlatStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def local_store : PatFrag<(ops node:$val, node:$ptr),
|
||||
(store node:$val, node:$ptr), [{
|
||||
return isLocalStore(dyn_cast<StoreSDNode>(N));
|
||||
|
@ -385,15 +359,6 @@ multiclass AtomicCmpSwapLocal <SDNode cmp_swap_node> {
|
|||
|
||||
defm atomic_cmp_swap : AtomicCmpSwapLocal <atomic_cmp_swap>;
|
||||
|
||||
def flat_load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
|
||||
return isFlatLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def flat_store : PatFrag<(ops node:$val, node:$ptr),
|
||||
(store node:$val, node:$ptr), [{
|
||||
return isFlatStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def mskor_flat : PatFrag<(ops node:$val, node:$ptr),
|
||||
(AMDGPUstore_mskor node:$val, node:$ptr), [{
|
||||
return cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::FLAT_ADDRESS;
|
||||
|
|
|
@ -264,42 +264,6 @@ defm FLAT_ATOMIC_FMAX_X2 : FLAT_ATOMIC <
|
|||
|
||||
} // End let SubtargetPredicate = isCI, VIAssemblerPredicate = DisableInst
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Flat Patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
let Predicates = [HasFlatAddressSpace] in {
|
||||
|
||||
class FLATLoad_Pattern <FLAT Instr_ADDR64, ValueType vt,
|
||||
PatFrag flat_ld> :
|
||||
Pat <(vt (flat_ld i64:$ptr)),
|
||||
(Instr_ADDR64 $ptr, 0, 0, 0)
|
||||
>;
|
||||
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_SBYTE, i32, sextloadi8_flat>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_UBYTE, i32, az_extloadi8_flat>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_SSHORT, i32, sextloadi16_flat>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_USHORT, i32, az_extloadi16_flat>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_DWORD, i32, flat_load>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_DWORDX2, i64, flat_load>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_DWORDX2, i64, az_extloadi32_flat>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_DWORDX2, v2i32, flat_load>;
|
||||
def : FLATLoad_Pattern <FLAT_LOAD_DWORDX4, v4i32, flat_load>;
|
||||
|
||||
class FLATStore_Pattern <FLAT Instr, ValueType vt, PatFrag st> :
|
||||
Pat <(st vt:$value, i64:$ptr),
|
||||
(Instr $value, $ptr, 0, 0, 0)
|
||||
>;
|
||||
|
||||
def : FLATStore_Pattern <FLAT_STORE_BYTE, i32, truncstorei8_flat>;
|
||||
def : FLATStore_Pattern <FLAT_STORE_SHORT, i32, truncstorei16_flat>;
|
||||
def : FLATStore_Pattern <FLAT_STORE_DWORD, i32, flat_store>;
|
||||
def : FLATStore_Pattern <FLAT_STORE_DWORDX2, i64, flat_store>;
|
||||
def : FLATStore_Pattern <FLAT_STORE_DWORDX2, v2i32, flat_store>;
|
||||
def : FLATStore_Pattern <FLAT_STORE_DWORDX4, v4i32, flat_store>;
|
||||
|
||||
} // End HasFlatAddressSpace predicate
|
||||
|
||||
let Predicates = [isCI] in {
|
||||
|
||||
// Convert (x - floor(x)) to fract(x)
|
||||
|
@ -320,14 +284,10 @@ def : Pat <
|
|||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Patterns to generate flat for global
|
||||
// Flat Patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def useFlatForGlobal : Predicate <
|
||||
"Subtarget->useFlatForGlobal() || "
|
||||
"Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS">;
|
||||
|
||||
let Predicates = [useFlatForGlobal] in {
|
||||
let Predicates = [isCIVI] in {
|
||||
|
||||
// Patterns for global loads with no offset
|
||||
class FlatLoadPat <FLAT inst, SDPatternOperator node, ValueType vt> : Pat <
|
||||
|
@ -335,24 +295,24 @@ class FlatLoadPat <FLAT inst, SDPatternOperator node, ValueType vt> : Pat <
|
|||
(inst $addr, 0, 0, 0)
|
||||
>;
|
||||
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_global, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_global, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_USHORT, az_extloadi16_global, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_global, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORD, global_load, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORDX2, global_load, v2i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORDX4, global_load, v4i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_UBYTE, flat_az_extloadi8, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SBYTE, flat_sextloadi8, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_USHORT, flat_az_extloadi16, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_SSHORT, flat_sextloadi16, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORD, flat_load, i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORDX2, flat_load, v2i32>;
|
||||
def : FlatLoadPat <FLAT_LOAD_DWORDX4, flat_load, v4i32>;
|
||||
|
||||
class FlatStorePat <FLAT inst, SDPatternOperator node, ValueType vt> : Pat <
|
||||
(node vt:$data, i64:$addr),
|
||||
(inst $data, $addr, 0, 0, 0)
|
||||
>;
|
||||
|
||||
def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_global, i32>;
|
||||
def : FlatStorePat <FLAT_STORE_SHORT, truncstorei16_global, i32>;
|
||||
def : FlatStorePat <FLAT_STORE_DWORD, global_store, i32>;
|
||||
def : FlatStorePat <FLAT_STORE_DWORDX2, global_store, v2i32>;
|
||||
def : FlatStorePat <FLAT_STORE_DWORDX4, global_store, v4i32>;
|
||||
def : FlatStorePat <FLAT_STORE_BYTE, flat_truncstorei8, i32>;
|
||||
def : FlatStorePat <FLAT_STORE_SHORT, flat_truncstorei16, i32>;
|
||||
def : FlatStorePat <FLAT_STORE_DWORD, flat_store, i32>;
|
||||
def : FlatStorePat <FLAT_STORE_DWORDX2, flat_store, v2i32>;
|
||||
def : FlatStorePat <FLAT_STORE_DWORDX4, flat_store, v4i32>;
|
||||
|
||||
class FlatAtomicPat <FLAT inst, SDPatternOperator node, ValueType vt> : Pat <
|
||||
(vt (node i64:$addr, vt:$data)),
|
||||
|
@ -370,4 +330,4 @@ def : FlatAtomicPat <FLAT_ATOMIC_OR_RTN, atomic_or_global, i32>;
|
|||
def : FlatAtomicPat <FLAT_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
|
||||
def : FlatAtomicPat <FLAT_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
|
||||
|
||||
} // End Predicates = [useFlatForGlobal]
|
||||
} // End Predicates = [isCIVI]
|
||||
|
|
|
@ -134,6 +134,33 @@ def SIconstdata_ptr : SDNode<
|
|||
SDTCisVT<0, i64>]>
|
||||
>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PatFrags for FLAT instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
class flat_ld <SDPatternOperator ld> : PatFrag<(ops node:$ptr),
|
||||
(ld node:$ptr), [{
|
||||
return isFlatLoad(dyn_cast<LoadSDNode>(N)) ||
|
||||
isGlobalLoad(dyn_cast<LoadSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def flat_load : flat_ld <load>;
|
||||
def flat_az_extloadi8 : flat_ld <az_extloadi8>;
|
||||
def flat_sextloadi8 : flat_ld <sextloadi8>;
|
||||
def flat_az_extloadi16 : flat_ld <az_extloadi16>;
|
||||
def flat_sextloadi16 : flat_ld <sextloadi16>;
|
||||
|
||||
class flat_st <SDPatternOperator st> : PatFrag<(ops node:$val, node:$ptr),
|
||||
(st node:$val, node:$ptr), [{
|
||||
return isFlatStore(dyn_cast<StoreSDNode>(N)) ||
|
||||
isGlobalStore(dyn_cast<StoreSDNode>(N));
|
||||
}]>;
|
||||
|
||||
def flat_store: flat_st <store>;
|
||||
def flat_truncstorei8 : flat_st <truncstorei8>;
|
||||
def flat_truncstorei16 : flat_st <truncstorei16>;
|
||||
|
||||
|
||||
def mubuf_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{
|
||||
return isGlobalLoad(cast<LoadSDNode>(N)) ||
|
||||
isConstantLoad(cast<LoadSDNode>(N), -1);
|
||||
|
|
Loading…
Reference in New Issue