Skip to content

Commit f6178cd

Browse files
authored
[SelectionDAG] Pass LoadExtType when ATOMIC_LOAD is created. (#136653)
Rename one signature of getAtomic to getAtomicLoad and pass LoadExtType. Previously we had to set the extension type after the node was created, but we don't usually modify SDNodes once they are created. It's possible the node already existed and has been CSEd. If that happens, modifying the node may affect the other users. It's therefore safer to add the extension type at creation so that it is part of the CSE information. I don't know of any failures related to the current implementation. I only noticed that it doesn't match how we usually do things.
1 parent 9c388f1 commit f6178cd

File tree

7 files changed

+45
-53
lines changed

7 files changed

+45
-53
lines changed

llvm/include/llvm/CodeGen/SelectionDAG.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,16 +1325,16 @@ class SelectionDAG {
13251325
SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain,
13261326
SDValue Ptr, SDValue Val, MachineMemOperand *MMO);
13271327

1328-
/// Gets a node for an atomic op, produces result and chain and
1329-
/// takes 1 operand.
1330-
SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, EVT VT,
1331-
SDValue Chain, SDValue Ptr, MachineMemOperand *MMO);
1332-
13331328
/// Gets a node for an atomic op, produces result and chain and takes N
13341329
/// operands.
13351330
SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
13361331
SDVTList VTList, ArrayRef<SDValue> Ops,
1337-
MachineMemOperand *MMO);
1332+
MachineMemOperand *MMO,
1333+
ISD::LoadExtType ExtType = ISD::NON_EXTLOAD);
1334+
1335+
SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT,
1336+
EVT VT, SDValue Chain, SDValue Ptr,
1337+
MachineMemOperand *MMO);
13381338

13391339
/// Creates a MemIntrinsicNode that may produce a
13401340
/// result and takes a list of operands. Opcode may be INTRINSIC_VOID,

llvm/include/llvm/CodeGen/SelectionDAGNodes.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,15 +1546,13 @@ class MemSDNode : public SDNode {
15461546
/// This is an SDNode representing atomic operations.
15471547
class AtomicSDNode : public MemSDNode {
15481548
public:
1549-
AtomicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTL,
1550-
EVT MemVT, MachineMemOperand *MMO)
1551-
: MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) {
1549+
AtomicSDNode(unsigned Order, const DebugLoc &dl, unsigned Opc, SDVTList VTL,
1550+
EVT MemVT, MachineMemOperand *MMO, ISD::LoadExtType ETy)
1551+
: MemSDNode(Opc, Order, dl, VTL, MemVT, MMO) {
15521552
assert(((Opc != ISD::ATOMIC_LOAD && Opc != ISD::ATOMIC_STORE) ||
15531553
MMO->isAtomic()) && "then why are we using an AtomicSDNode?");
1554-
}
1555-
1556-
void setExtensionType(ISD::LoadExtType ETy) {
1557-
assert(getOpcode() == ISD::ATOMIC_LOAD && "Only used for atomic loads.");
1554+
assert((Opc == ISD::ATOMIC_LOAD || ETy == ISD::NON_EXTLOAD) &&
1555+
"Only atomic load uses ExtTy");
15581556
LoadSDNodeBits.ExtTy = ETy;
15591557
}
15601558

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13833,10 +13833,9 @@ static SDValue tryToFoldExtOfAtomicLoad(SelectionDAG &DAG,
1383313833

1383413834
EVT OrigVT = ALoad->getValueType(0);
1383513835
assert(OrigVT.getSizeInBits() < VT.getSizeInBits() && "VT should be wider.");
13836-
auto *NewALoad = cast<AtomicSDNode>(DAG.getAtomic(
13837-
ISD::ATOMIC_LOAD, SDLoc(ALoad), MemoryVT, VT, ALoad->getChain(),
13836+
auto *NewALoad = cast<AtomicSDNode>(DAG.getAtomicLoad(
13837+
ExtLoadType, SDLoc(ALoad), MemoryVT, VT, ALoad->getChain(),
1383813838
ALoad->getBasePtr(), ALoad->getMemOperand()));
13839-
NewALoad->setExtensionType(ExtLoadType);
1384013839
DAG.ReplaceAllUsesOfValueWith(
1384113840
SDValue(ALoad, 0),
1384213841
DAG.getNode(ISD::TRUNCATE, SDLoc(ALoad), OrigVT, SDValue(NewALoad, 0)));

llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -381,30 +381,27 @@ SDValue DAGTypeLegalizer::PromoteIntRes_AssertZext(SDNode *N) {
381381

382382
SDValue DAGTypeLegalizer::PromoteIntRes_Atomic0(AtomicSDNode *N) {
383383
EVT ResVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
384-
SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N),
385-
N->getMemoryVT(), ResVT,
386-
N->getChain(), N->getBasePtr(),
387-
N->getMemOperand());
388-
if (N->getOpcode() == ISD::ATOMIC_LOAD) {
389-
ISD::LoadExtType ETy = cast<AtomicSDNode>(N)->getExtensionType();
390-
if (ETy == ISD::NON_EXTLOAD) {
391-
switch (TLI.getExtendForAtomicOps()) {
392-
case ISD::SIGN_EXTEND:
393-
ETy = ISD::SEXTLOAD;
394-
break;
395-
case ISD::ZERO_EXTEND:
396-
ETy = ISD::ZEXTLOAD;
397-
break;
398-
case ISD::ANY_EXTEND:
399-
ETy = ISD::EXTLOAD;
400-
break;
401-
default:
402-
llvm_unreachable("Invalid atomic op extension");
403-
}
384+
ISD::LoadExtType ExtType = N->getExtensionType();
385+
if (ExtType == ISD::NON_EXTLOAD) {
386+
switch (TLI.getExtendForAtomicOps()) {
387+
case ISD::SIGN_EXTEND:
388+
ExtType = ISD::SEXTLOAD;
389+
break;
390+
case ISD::ZERO_EXTEND:
391+
ExtType = ISD::ZEXTLOAD;
392+
break;
393+
case ISD::ANY_EXTEND:
394+
ExtType = ISD::EXTLOAD;
395+
break;
396+
default:
397+
llvm_unreachable("Invalid atomic op extension");
404398
}
405-
cast<AtomicSDNode>(Res)->setExtensionType(ETy);
406399
}
407400

401+
SDValue Res =
402+
DAG.getAtomicLoad(ExtType, SDLoc(N), N->getMemoryVT(), ResVT,
403+
N->getChain(), N->getBasePtr(), N->getMemOperand());
404+
408405
// Legalize the chain result - switch anything that used the old chain to
409406
// use the new one.
410407
ReplaceValueWith(SDValue(N, 1), Res.getValue(1));

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8992,12 +8992,13 @@ SDValue SelectionDAG::getAtomicMemset(SDValue Chain, const SDLoc &dl,
89928992

89938993
SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
89948994
SDVTList VTList, ArrayRef<SDValue> Ops,
8995-
MachineMemOperand *MMO) {
8995+
MachineMemOperand *MMO,
8996+
ISD::LoadExtType ExtType) {
89968997
FoldingSetNodeID ID;
89978998
AddNodeIDNode(ID, Opcode, VTList, Ops);
89988999
ID.AddInteger(MemVT.getRawBits());
89999000
ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
9000-
Opcode, dl.getIROrder(), VTList, MemVT, MMO));
9001+
dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
90019002
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
90029003
ID.AddInteger(MMO->getFlags());
90039004
void* IP = nullptr;
@@ -9006,8 +9007,8 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
90069007
return SDValue(E, 0);
90079008
}
90089009

9009-
auto *N = newSDNode<AtomicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
9010-
VTList, MemVT, MMO);
9010+
auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
9011+
VTList, MemVT, MMO, ExtType);
90119012
createOperands(N, Ops);
90129013

90139014
CSEMap.InsertNode(N, IP);
@@ -9053,14 +9054,12 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
90539054
return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
90549055
}
90559056

9056-
SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
9057-
EVT VT, SDValue Chain, SDValue Ptr,
9058-
MachineMemOperand *MMO) {
9059-
assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op");
9060-
9057+
SDValue SelectionDAG::getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl,
9058+
EVT MemVT, EVT VT, SDValue Chain,
9059+
SDValue Ptr, MachineMemOperand *MMO) {
90619060
SDVTList VTs = getVTList(VT, MVT::Other);
90629061
SDValue Ops[] = {Chain, Ptr};
9063-
return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
9062+
return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
90649063
}
90659064

90669065
/// getMergeValues - Create a MERGE_VALUES node from the given operands.

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5157,8 +5157,8 @@ void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {
51575157
InChain = TLI.prepareVolatileOrAtomicLoad(InChain, dl, DAG);
51585158

51595159
SDValue Ptr = getValue(I.getPointerOperand());
5160-
SDValue L = DAG.getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, MemVT, InChain,
5161-
Ptr, MMO);
5160+
SDValue L =
5161+
DAG.getAtomicLoad(ISD::NON_EXTLOAD, dl, MemVT, MemVT, InChain, Ptr, MMO);
51625162

51635163
SDValue OutChain = L.getValue(1);
51645164
if (MemVT != VT)

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6922,10 +6922,9 @@ SDValue SystemZTargetLowering::lowerLoadF16(SDValue Op,
69226922
SDValue NewLd;
69236923
if (auto *AtomicLd = dyn_cast<AtomicSDNode>(Op.getNode())) {
69246924
assert(EVT(RegVT) == AtomicLd->getMemoryVT() && "Unhandled f16 load");
6925-
NewLd = DAG.getAtomic(ISD::ATOMIC_LOAD, DL, MVT::i16, MVT::i64,
6926-
AtomicLd->getChain(), AtomicLd->getBasePtr(),
6927-
AtomicLd->getMemOperand());
6928-
cast<AtomicSDNode>(NewLd)->setExtensionType(ISD::EXTLOAD);
6925+
NewLd = DAG.getAtomicLoad(ISD::EXTLOAD, DL, MVT::i16, MVT::i64,
6926+
AtomicLd->getChain(), AtomicLd->getBasePtr(),
6927+
AtomicLd->getMemOperand());
69296928
} else {
69306929
LoadSDNode *Ld = cast<LoadSDNode>(Op.getNode());
69316930
assert(EVT(RegVT) == Ld->getMemoryVT() && "Unhandled f16 load");

0 commit comments

Comments
 (0)