@@ -115,6 +115,10 @@ static cl::opt<unsigned>
115
115
MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
116
116
cl::desc("DAG combiner limit number of steps when searching DAG "
117
117
"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."));
118
122
119
123
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G) {
120
124
LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
@@ -6157,23 +6161,47 @@ static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT,
6157
6161
}
6158
6162
6159
6163
/// Gets or creates the specified node.
6160
- SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6164
+
6165
+ SDValue SelectionDAG::getNodeImpl(unsigned Opcode, const SDLoc &DL, EVT VT,
6166
+ ArrayRef<SDValue> Ops,
6167
+ const SDNodeFlags Flags) {
6161
6168
SDVTList VTs = getVTList(VT);
6162
- FoldingSetNodeID ID;
6163
- AddNodeIDNode(ID, Opcode, VTs, {});
6164
- void *IP = nullptr;
6165
- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6166
- return SDValue(E, 0);
6169
+ return getNodeImpl(Opcode, DL, VTs, Ops, Flags);
6170
+ }
6167
6171
6168
- auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6169
- CSEMap.InsertNode(N, IP);
6172
+ SDValue SelectionDAG::getNodeImpl(unsigned Opcode, const SDLoc &DL,
6173
+ SDVTList VTs, ArrayRef<SDValue> Ops,
6174
+ const SDNodeFlags Flags) {
6175
+ SDNode *N;
6176
+ // Don't CSE glue-producing nodes
6177
+ if (VTs.VTs[VTs.NumVTs - 1] != MVT::Glue) {
6178
+ FoldingSetNodeID ID;
6179
+ AddNodeIDNode(ID, Opcode, VTs, Ops);
6180
+ void *IP = nullptr;
6181
+ if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6182
+ E->intersectFlagsWith(Flags);
6183
+ return SDValue(E, 0);
6184
+ }
6170
6185
6186
+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6187
+ createOperands(N, Ops);
6188
+ CSEMap.InsertNode(N, IP);
6189
+ } else {
6190
+ N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6191
+ createOperands(N, Ops);
6192
+ }
6193
+
6194
+ N->setFlags(Flags);
6171
6195
InsertNode(N);
6172
6196
SDValue V = SDValue(N, 0);
6173
6197
NewSDValueDbgMsg(V, "Creating new node: ", this);
6174
6198
return V;
6175
6199
}
6176
6200
6201
+ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6202
+ return getNodeImpl(Opcode, DL, VT, {}, SDNodeFlags{});
6203
+ }
6204
+
6177
6205
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6178
6206
SDValue N1) {
6179
6207
SDNodeFlags Flags;
@@ -6185,6 +6213,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6185
6213
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6186
6214
SDValue N1, const SDNodeFlags Flags) {
6187
6215
assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
6216
+ if (!EnableSimplifyNodes)
6217
+ return getNodeImpl(Opcode, DL, VT, {N1}, Flags);
6188
6218
6189
6219
// Constant fold unary operations with a vector integer or float operand.
6190
6220
switch (Opcode) {
@@ -6501,31 +6531,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6501
6531
break;
6502
6532
}
6503
6533
6504
- SDNode *N;
6505
- SDVTList VTs = getVTList(VT);
6506
- SDValue Ops[] = {N1};
6507
- if (VT != MVT::Glue) { // Don't CSE glue producing nodes
6508
- FoldingSetNodeID ID;
6509
- AddNodeIDNode(ID, Opcode, VTs, Ops);
6510
- void *IP = nullptr;
6511
- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6512
- E->intersectFlagsWith(Flags);
6513
- return SDValue(E, 0);
6514
- }
6515
-
6516
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6517
- N->setFlags(Flags);
6518
- createOperands(N, Ops);
6519
- CSEMap.InsertNode(N, IP);
6520
- } else {
6521
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6522
- createOperands(N, Ops);
6523
- }
6524
-
6525
- InsertNode(N);
6526
- SDValue V = SDValue(N, 0);
6527
- NewSDValueDbgMsg(V, "Creating new node: ", this);
6528
- return V;
6534
+ return getNodeImpl(Opcode, DL, VT, {N1}, Flags);
6529
6535
}
6530
6536
6531
6537
static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
@@ -7219,6 +7225,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7219
7225
assert(N1.getOpcode() != ISD::DELETED_NODE &&
7220
7226
N2.getOpcode() != ISD::DELETED_NODE &&
7221
7227
"Operand is DELETED_NODE!");
7228
+ if (!EnableSimplifyNodes)
7229
+ return getNodeImpl(Opcode, DL, VT, {N1, N2}, Flags);
7222
7230
7223
7231
canonicalizeCommutativeBinop(Opcode, N1, N2);
7224
7232
@@ -7665,32 +7673,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7665
7673
}
7666
7674
}
7667
7675
7668
- // Memoize this node if possible.
7669
- SDNode *N;
7670
- SDVTList VTs = getVTList(VT);
7671
- SDValue Ops[] = {N1, N2};
7672
- if (VT != MVT::Glue) {
7673
- FoldingSetNodeID ID;
7674
- AddNodeIDNode(ID, Opcode, VTs, Ops);
7675
- void *IP = nullptr;
7676
- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7677
- E->intersectFlagsWith(Flags);
7678
- return SDValue(E, 0);
7679
- }
7680
-
7681
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7682
- N->setFlags(Flags);
7683
- createOperands(N, Ops);
7684
- CSEMap.InsertNode(N, IP);
7685
- } else {
7686
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7687
- createOperands(N, Ops);
7688
- }
7689
-
7690
- InsertNode(N);
7691
- SDValue V = SDValue(N, 0);
7692
- NewSDValueDbgMsg(V, "Creating new node: ", this);
7693
- return V;
7676
+ return getNodeImpl(Opcode, DL, VT, {N1, N2}, Flags);
7694
7677
}
7695
7678
7696
7679
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
@@ -7708,6 +7691,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7708
7691
N2.getOpcode() != ISD::DELETED_NODE &&
7709
7692
N3.getOpcode() != ISD::DELETED_NODE &&
7710
7693
"Operand is DELETED_NODE!");
7694
+ if (!EnableSimplifyNodes)
7695
+ return getNodeImpl(Opcode, DL, VT, {N1, N2, N3}, Flags);
7696
+
7711
7697
// Perform various simplifications.
7712
7698
switch (Opcode) {
7713
7699
case ISD::FMA:
@@ -7862,33 +7848,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7862
7848
break;
7863
7849
}
7864
7850
}
7865
-
7866
- // Memoize node if it doesn't produce a glue result.
7867
- SDNode *N;
7868
- SDVTList VTs = getVTList(VT);
7869
- SDValue Ops[] = {N1, N2, N3};
7870
- if (VT != MVT::Glue) {
7871
- FoldingSetNodeID ID;
7872
- AddNodeIDNode(ID, Opcode, VTs, Ops);
7873
- void *IP = nullptr;
7874
- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7875
- E->intersectFlagsWith(Flags);
7876
- return SDValue(E, 0);
7877
- }
7878
-
7879
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7880
- N->setFlags(Flags);
7881
- createOperands(N, Ops);
7882
- CSEMap.InsertNode(N, IP);
7883
- } else {
7884
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7885
- createOperands(N, Ops);
7886
- }
7887
-
7888
- InsertNode(N);
7889
- SDValue V = SDValue(N, 0);
7890
- NewSDValueDbgMsg(V, "Creating new node: ", this);
7891
- return V;
7851
+ return getNodeImpl(Opcode, DL, VT, {N1, N2, N3}, Flags);
7892
7852
}
7893
7853
7894
7854
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
@@ -10329,6 +10289,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
10329
10289
10330
10290
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
10331
10291
ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
10292
+
10332
10293
unsigned NumOps = Ops.size();
10333
10294
switch (NumOps) {
10334
10295
case 0: return getNode(Opcode, DL, VT);
@@ -10343,6 +10304,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
10343
10304
assert(Op.getOpcode() != ISD::DELETED_NODE &&
10344
10305
"Operand is DELETED_NODE!");
10345
10306
#endif
10307
+ if (!EnableSimplifyNodes)
10308
+ return getNodeImpl(Opcode, DL, VT, Ops, Flags);
10346
10309
10347
10310
switch (Opcode) {
10348
10311
default: break;
@@ -10411,34 +10374,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
10411
10374
break;
10412
10375
}
10413
10376
10414
- // Memoize nodes.
10415
- SDNode *N;
10416
- SDVTList VTs = getVTList(VT);
10417
-
10418
- if (VT != MVT::Glue) {
10419
- FoldingSetNodeID ID;
10420
- AddNodeIDNode(ID, Opcode, VTs, Ops);
10421
- void *IP = nullptr;
10422
-
10423
- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10424
- E->intersectFlagsWith(Flags);
10425
- return SDValue(E, 0);
10426
- }
10427
-
10428
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10429
- createOperands(N, Ops);
10430
-
10431
- CSEMap.InsertNode(N, IP);
10432
- } else {
10433
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10434
- createOperands(N, Ops);
10435
- }
10436
-
10437
- N->setFlags(Flags);
10438
- InsertNode(N);
10439
- SDValue V(N, 0);
10440
- NewSDValueDbgMsg(V, "Creating new node: ", this);
10441
- return V;
10377
+ return getNodeImpl(Opcode, DL, VT, Ops, Flags);
10442
10378
}
10443
10379
10444
10380
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
@@ -10458,6 +10394,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10458
10394
ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
10459
10395
if (VTList.NumVTs == 1)
10460
10396
return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
10397
+ if (!EnableSimplifyNodes)
10398
+ return getNodeImpl(Opcode, DL, VTList, Ops, Flags);
10461
10399
10462
10400
#ifndef NDEBUG
10463
10401
for (const auto &Op : Ops)
@@ -10622,30 +10560,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10622
10560
#endif
10623
10561
}
10624
10562
10625
- // Memoize the node unless it returns a glue result.
10626
- SDNode *N;
10627
- if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10628
- FoldingSetNodeID ID;
10629
- AddNodeIDNode(ID, Opcode, VTList, Ops);
10630
- void *IP = nullptr;
10631
- if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10632
- E->intersectFlagsWith(Flags);
10633
- return SDValue(E, 0);
10634
- }
10635
-
10636
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10637
- createOperands(N, Ops);
10638
- CSEMap.InsertNode(N, IP);
10639
- } else {
10640
- N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10641
- createOperands(N, Ops);
10642
- }
10643
-
10644
- N->setFlags(Flags);
10645
- InsertNode(N);
10646
- SDValue V(N, 0);
10647
- NewSDValueDbgMsg(V, "Creating new node: ", this);
10648
- return V;
10563
+ return getNodeImpl(Opcode, DL, VTList, Ops, Flags);
10649
10564
}
10650
10565
10651
10566
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
0 commit comments