Skip to content

Commit 9411926

Browse files
committed
[SelectionDAG] Split vector types for atomic load
Vector types that aren't widened are split so that a single ATOMIC_LOAD is issued for the entire vector at once. This change utilizes the load vectorization infrastructure in SelectionDAG in order to group the vectors. This enables SelectionDAG to translate vectors with type bfloat,half.
1 parent 55ec858 commit 9411926

File tree

4 files changed

+400
-4
lines changed

4 files changed

+400
-4
lines changed

llvm/include/llvm/Target/TargetSelectionDAG.td

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1949,6 +1949,20 @@ def atomic_load_64 :
19491949
let MemoryVT = i64;
19501950
}
19511951

1952+
def atomic_load_128_v2i64 :
1953+
PatFrag<(ops node:$ptr),
1954+
(atomic_load node:$ptr)> {
1955+
let IsAtomic = true;
1956+
let MemoryVT = v2i64;
1957+
}
1958+
1959+
def atomic_load_128_v4i32 :
1960+
PatFrag<(ops node:$ptr),
1961+
(atomic_load node:$ptr)> {
1962+
let IsAtomic = true;
1963+
let MemoryVT = v4i32;
1964+
}
1965+
19521966
def atomic_load_nonext_8 :
19531967
PatFrag<(ops node:$ptr), (atomic_load_nonext node:$ptr)> {
19541968
let IsAtomic = true; // FIXME: Should be IsLoad and/or IsAtomic?

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
978978
void SplitVecRes_FPOp_MultiType(SDNode *N, SDValue &Lo, SDValue &Hi);
979979
void SplitVecRes_IS_FPCLASS(SDNode *N, SDValue &Lo, SDValue &Hi);
980980
void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
981+
void SplitVecRes_ATOMIC_LOAD(AtomicSDNode *LD, SDValue &Lo, SDValue &Hi);
981982
void SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo, SDValue &Hi);
982983
void SplitVecRes_VP_LOAD(VPLoadSDNode *LD, SDValue &Lo, SDValue &Hi);
983984
void SplitVecRes_VP_LOAD_FF(VPLoadFFSDNode *LD, SDValue &Lo, SDValue &Hi);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,9 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
12261226
SplitVecRes_STEP_VECTOR(N, Lo, Hi);
12271227
break;
12281228
case ISD::SIGN_EXTEND_INREG: SplitVecRes_InregOp(N, Lo, Hi); break;
1229+
case ISD::ATOMIC_LOAD:
1230+
SplitVecRes_ATOMIC_LOAD(cast<AtomicSDNode>(N), Lo, Hi);
1231+
break;
12291232
case ISD::LOAD:
12301233
SplitVecRes_LOAD(cast<LoadSDNode>(N), Lo, Hi);
12311234
break;
@@ -2202,6 +2205,40 @@ void DAGTypeLegalizer::SplitVecRes_VP_SPLAT(SDNode *N, SDValue &Lo,
22022205
Hi = DAG.getNode(N->getOpcode(), dl, HiVT, N->getOperand(0), MaskHi, EVLHi);
22032206
}
22042207

2208+
void DAGTypeLegalizer::SplitVecRes_ATOMIC_LOAD(AtomicSDNode *LD, SDValue &Lo,
2209+
SDValue &Hi) {
2210+
assert(LD->getExtensionType() == ISD::NON_EXTLOAD &&
2211+
"Extended load during type legalization!");
2212+
SDLoc dl(LD);
2213+
EVT VT = LD->getValueType(0);
2214+
EVT LoVT, HiVT;
2215+
std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(VT);
2216+
2217+
SDValue Ch = LD->getChain();
2218+
SDValue Ptr = LD->getBasePtr();
2219+
2220+
EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits());
2221+
EVT MemIntVT =
2222+
EVT::getIntegerVT(*DAG.getContext(), LD->getMemoryVT().getSizeInBits());
2223+
SDValue ALD = DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemIntVT, IntVT, Ch,
2224+
Ptr, LD->getMemOperand());
2225+
2226+
EVT LoIntVT = EVT::getIntegerVT(*DAG.getContext(), LoVT.getSizeInBits());
2227+
EVT HiIntVT = EVT::getIntegerVT(*DAG.getContext(), HiVT.getSizeInBits());
2228+
SDValue ExtractLo = DAG.getNode(ISD::TRUNCATE, dl, LoIntVT, ALD);
2229+
SDValue ExtractHi =
2230+
DAG.getNode(ISD::SRL, dl, IntVT, ALD,
2231+
DAG.getIntPtrConstant(VT.getSizeInBits() / 2, dl));
2232+
ExtractHi = DAG.getNode(ISD::TRUNCATE, dl, HiIntVT, ExtractHi);
2233+
2234+
Lo = DAG.getBitcast(LoVT, ExtractLo);
2235+
Hi = DAG.getBitcast(HiVT, ExtractHi);
2236+
2237+
// Legalize the chain result - switch anything that used the old chain to
2238+
// use the new one.
2239+
ReplaceValueWith(SDValue(LD, 1), ALD.getValue(1));
2240+
}
2241+
22052242
void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo,
22062243
SDValue &Hi) {
22072244
assert(ISD::isUNINDEXEDLoad(LD) && "Indexed load during type legalization!");

0 commit comments

Comments
 (0)