@@ -115,10 +115,6 @@ static cl::opt<unsigned>
115115 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
116116 cl::desc("DAG combiner limit number of steps when searching DAG "
117117 "for predecessor nodes"));
118- static cl::opt<bool> EnableSimplifyNodes(
119- "selectiondag-simplify-nodes", cl::Hidden, cl::init(true),
120- cl::desc("Enable SelectionDAG::getNode simplifications. Useful for testing "
121- "DAG combines."));
122118
123119static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G) {
124120 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
@@ -6176,46 +6172,23 @@ static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT,
61766172}
61776173
61786174/// Gets or creates the specified node.
6179- SDValue SelectionDAG::getNodeImpl(unsigned Opcode, const SDLoc &DL, EVT VT,
6180- ArrayRef<SDValue> Ops,
6181- const SDNodeFlags Flags) {
6175+ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
61826176 SDVTList VTs = getVTList(VT);
6183- return getNodeImpl(Opcode, DL, VTs, Ops, Flags);
6184- }
6185-
6186- SDValue SelectionDAG::getNodeImpl(unsigned Opcode, const SDLoc &DL,
6187- SDVTList VTs, ArrayRef<SDValue> Ops,
6188- const SDNodeFlags Flags) {
6189- SDNode *N;
6190- // Don't CSE glue-producing nodes
6191- if (VTs.VTs[VTs.NumVTs - 1] != MVT::Glue) {
6192- FoldingSetNodeID ID;
6193- AddNodeIDNode(ID, Opcode, VTs, Ops);
6194- void *IP = nullptr;
6195- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6196- E->intersectFlagsWith(Flags);
6197- return SDValue(E, 0);
6198- }
6177+ FoldingSetNodeID ID;
6178+ AddNodeIDNode(ID, Opcode, VTs, {});
6179+ void *IP = nullptr;
6180+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6181+ return SDValue(E, 0);
61996182
6200- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6201- createOperands(N, Ops);
6202- CSEMap.InsertNode(N, IP);
6203- } else {
6204- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6205- createOperands(N, Ops);
6206- }
6183+ auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6184+ CSEMap.InsertNode(N, IP);
62076185
6208- N->setFlags(Flags);
62096186 InsertNode(N);
62106187 SDValue V = SDValue(N, 0);
62116188 NewSDValueDbgMsg(V, "Creating new node: ", this);
62126189 return V;
62136190}
62146191
6215- SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6216- return getNodeImpl(Opcode, DL, VT, {}, SDNodeFlags{});
6217- }
6218-
62196192SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
62206193 SDValue N1) {
62216194 SDNodeFlags Flags;
@@ -6227,8 +6200,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
62276200SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
62286201 SDValue N1, const SDNodeFlags Flags) {
62296202 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
6230- if (!EnableSimplifyNodes)
6231- return getNodeImpl(Opcode, DL, VT, {N1}, Flags);
62326203
62336204 // Constant fold unary operations with a vector integer or float operand.
62346205 switch (Opcode) {
@@ -6545,7 +6516,31 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
65456516 break;
65466517 }
65476518
6548- return getNodeImpl(Opcode, DL, VT, {N1}, Flags);
6519+ SDNode *N;
6520+ SDVTList VTs = getVTList(VT);
6521+ SDValue Ops[] = {N1};
6522+ if (VT != MVT::Glue) { // Don't CSE glue producing nodes
6523+ FoldingSetNodeID ID;
6524+ AddNodeIDNode(ID, Opcode, VTs, Ops);
6525+ void *IP = nullptr;
6526+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6527+ E->intersectFlagsWith(Flags);
6528+ return SDValue(E, 0);
6529+ }
6530+
6531+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6532+ N->setFlags(Flags);
6533+ createOperands(N, Ops);
6534+ CSEMap.InsertNode(N, IP);
6535+ } else {
6536+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6537+ createOperands(N, Ops);
6538+ }
6539+
6540+ InsertNode(N);
6541+ SDValue V = SDValue(N, 0);
6542+ NewSDValueDbgMsg(V, "Creating new node: ", this);
6543+ return V;
65496544}
65506545
65516546static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
@@ -7239,8 +7234,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
72397234 assert(N1.getOpcode() != ISD::DELETED_NODE &&
72407235 N2.getOpcode() != ISD::DELETED_NODE &&
72417236 "Operand is DELETED_NODE!");
7242- if (!EnableSimplifyNodes)
7243- return getNodeImpl(Opcode, DL, VT, {N1, N2}, Flags);
72447237
72457238 canonicalizeCommutativeBinop(Opcode, N1, N2);
72467239
@@ -7687,7 +7680,32 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
76877680 }
76887681 }
76897682
7690- return getNodeImpl(Opcode, DL, VT, {N1, N2}, Flags);
7683+ // Memoize this node if possible.
7684+ SDNode *N;
7685+ SDVTList VTs = getVTList(VT);
7686+ SDValue Ops[] = {N1, N2};
7687+ if (VT != MVT::Glue) {
7688+ FoldingSetNodeID ID;
7689+ AddNodeIDNode(ID, Opcode, VTs, Ops);
7690+ void *IP = nullptr;
7691+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7692+ E->intersectFlagsWith(Flags);
7693+ return SDValue(E, 0);
7694+ }
7695+
7696+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7697+ N->setFlags(Flags);
7698+ createOperands(N, Ops);
7699+ CSEMap.InsertNode(N, IP);
7700+ } else {
7701+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7702+ createOperands(N, Ops);
7703+ }
7704+
7705+ InsertNode(N);
7706+ SDValue V = SDValue(N, 0);
7707+ NewSDValueDbgMsg(V, "Creating new node: ", this);
7708+ return V;
76917709}
76927710
76937711SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
@@ -7705,9 +7723,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
77057723 N2.getOpcode() != ISD::DELETED_NODE &&
77067724 N3.getOpcode() != ISD::DELETED_NODE &&
77077725 "Operand is DELETED_NODE!");
7708- if (!EnableSimplifyNodes)
7709- return getNodeImpl(Opcode, DL, VT, {N1, N2, N3}, Flags);
7710-
77117726 // Perform various simplifications.
77127727 switch (Opcode) {
77137728 case ISD::FMA:
@@ -7862,7 +7877,33 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
78627877 break;
78637878 }
78647879 }
7865- return getNodeImpl(Opcode, DL, VT, {N1, N2, N3}, Flags);
7880+
7881+ // Memoize node if it doesn't produce a glue result.
7882+ SDNode *N;
7883+ SDVTList VTs = getVTList(VT);
7884+ SDValue Ops[] = {N1, N2, N3};
7885+ if (VT != MVT::Glue) {
7886+ FoldingSetNodeID ID;
7887+ AddNodeIDNode(ID, Opcode, VTs, Ops);
7888+ void *IP = nullptr;
7889+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7890+ E->intersectFlagsWith(Flags);
7891+ return SDValue(E, 0);
7892+ }
7893+
7894+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7895+ N->setFlags(Flags);
7896+ createOperands(N, Ops);
7897+ CSEMap.InsertNode(N, IP);
7898+ } else {
7899+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7900+ createOperands(N, Ops);
7901+ }
7902+
7903+ InsertNode(N);
7904+ SDValue V = SDValue(N, 0);
7905+ NewSDValueDbgMsg(V, "Creating new node: ", this);
7906+ return V;
78667907}
78677908
78687909SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
@@ -10317,8 +10358,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
1031710358 assert(Op.getOpcode() != ISD::DELETED_NODE &&
1031810359 "Operand is DELETED_NODE!");
1031910360#endif
10320- if (!EnableSimplifyNodes)
10321- return getNodeImpl(Opcode, DL, VT, Ops, Flags);
1032210361
1032310362 switch (Opcode) {
1032410363 default: break;
@@ -10387,7 +10426,34 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
1038710426 break;
1038810427 }
1038910428
10390- return getNodeImpl(Opcode, DL, VT, Ops, Flags);
10429+ // Memoize nodes.
10430+ SDNode *N;
10431+ SDVTList VTs = getVTList(VT);
10432+
10433+ if (VT != MVT::Glue) {
10434+ FoldingSetNodeID ID;
10435+ AddNodeIDNode(ID, Opcode, VTs, Ops);
10436+ void *IP = nullptr;
10437+
10438+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10439+ E->intersectFlagsWith(Flags);
10440+ return SDValue(E, 0);
10441+ }
10442+
10443+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10444+ createOperands(N, Ops);
10445+
10446+ CSEMap.InsertNode(N, IP);
10447+ } else {
10448+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10449+ createOperands(N, Ops);
10450+ }
10451+
10452+ N->setFlags(Flags);
10453+ InsertNode(N);
10454+ SDValue V(N, 0);
10455+ NewSDValueDbgMsg(V, "Creating new node: ", this);
10456+ return V;
1039110457}
1039210458
1039310459SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
@@ -10407,8 +10473,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
1040710473 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
1040810474 if (VTList.NumVTs == 1)
1040910475 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
10410- if (!EnableSimplifyNodes)
10411- return getNodeImpl(Opcode, DL, VTList, Ops, Flags);
1041210476
1041310477#ifndef NDEBUG
1041410478 for (const auto &Op : Ops)
@@ -10573,7 +10637,30 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
1057310637#endif
1057410638 }
1057510639
10576- return getNodeImpl(Opcode, DL, VTList, Ops, Flags);
10640+ // Memoize the node unless it returns a glue result.
10641+ SDNode *N;
10642+ if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10643+ FoldingSetNodeID ID;
10644+ AddNodeIDNode(ID, Opcode, VTList, Ops);
10645+ void *IP = nullptr;
10646+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10647+ E->intersectFlagsWith(Flags);
10648+ return SDValue(E, 0);
10649+ }
10650+
10651+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10652+ createOperands(N, Ops);
10653+ CSEMap.InsertNode(N, IP);
10654+ } else {
10655+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10656+ createOperands(N, Ops);
10657+ }
10658+
10659+ N->setFlags(Flags);
10660+ InsertNode(N);
10661+ SDValue V(N, 0);
10662+ NewSDValueDbgMsg(V, "Creating new node: ", this);
10663+ return V;
1057710664}
1057810665
1057910666SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
0 commit comments