Skip to content

Commit 8d549cf

Browse files
authored
[SelectionDAG] Pass SDNodeFlags through getNode instead of setFlags. (llvm#149852)
getNode updates flags correctly for CSE. Calling setFlags after getNode may set the flags where they don't apply. I've added a Flags argument to getSelectCC and the signature of getNode that takes an ArrayRef of EVTs.
1 parent d509972 commit 8d549cf

File tree

7 files changed

+59
-59
lines changed

7 files changed

+59
-59
lines changed

llvm/include/llvm/CodeGen/SelectionDAG.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,13 +1202,16 @@ class SelectionDAG {
12021202
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
12031203
ArrayRef<SDValue> Ops, const SDNodeFlags Flags);
12041204
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL,
1205-
ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops);
1205+
ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops,
1206+
const SDNodeFlags Flags);
12061207
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12071208
ArrayRef<SDValue> Ops, const SDNodeFlags Flags);
12081209

12091210
// Use flags from current flag inserter.
12101211
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
12111212
ArrayRef<SDValue> Ops);
1213+
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL,
1214+
ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops);
12121215
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12131216
ArrayRef<SDValue> Ops);
12141217
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
@@ -1346,9 +1349,10 @@ class SelectionDAG {
13461349
/// Helper function to make it easier to build SelectCC's if you just have an
13471350
/// ISD::CondCode instead of an SDValue.
13481351
SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True,
1349-
SDValue False, ISD::CondCode Cond) {
1352+
SDValue False, ISD::CondCode Cond,
1353+
SDNodeFlags Flags = SDNodeFlags()) {
13501354
return getNode(ISD::SELECT_CC, DL, True.getValueType(), LHS, RHS, True,
1351-
False, getCondCode(Cond));
1355+
False, getCondCode(Cond), Flags);
13521356
}
13531357

13541358
/// Try to simplify a select/vselect into 1 of its operands or a constant.

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12375,11 +12375,8 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
1237512375
TLI.isOperationLegalOrCustom(ISD::SELECT_CC, VT))) {
1237612376
// Any flags available in a select/setcc fold will be on the setcc as they
1237712377
// migrated from fcmp
12378-
Flags = N0->getFlags();
12379-
SDValue SelectNode = DAG.getNode(ISD::SELECT_CC, DL, VT, Cond0, Cond1, N1,
12380-
N2, N0.getOperand(2));
12381-
SelectNode->setFlags(Flags);
12382-
return SelectNode;
12378+
return DAG.getNode(ISD::SELECT_CC, DL, VT, Cond0, Cond1, N1, N2,
12379+
N0.getOperand(2), N0->getFlags());
1238312380
}
1238412381

1238512382
if (SDValue ABD = foldSelectToABD(Cond0, Cond1, N1, N2, CC, DL))

llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,19 +2785,17 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(SDNode *Node,
27852785
// In strict mode, we must avoid spurious exceptions, and therefore
27862786
// must make sure to only emit a single STRICT_SINT_TO_FP.
27872787
SDValue InCvt = DAG.getSelect(dl, SrcVT, SignBitTest, Or, Op0);
2788-
Fast = DAG.getNode(ISD::STRICT_SINT_TO_FP, dl, { DestVT, MVT::Other },
2789-
{ Node->getOperand(0), InCvt });
2790-
Slow = DAG.getNode(ISD::STRICT_FADD, dl, { DestVT, MVT::Other },
2791-
{ Fast.getValue(1), Fast, Fast });
2792-
Chain = Slow.getValue(1);
27932788
// The STRICT_SINT_TO_FP inherits the exception mode from the
27942789
// incoming STRICT_UINT_TO_FP node; the STRICT_FADD node can
27952790
// never raise any exception.
27962791
SDNodeFlags Flags;
27972792
Flags.setNoFPExcept(Node->getFlags().hasNoFPExcept());
2798-
Fast->setFlags(Flags);
2793+
Fast = DAG.getNode(ISD::STRICT_SINT_TO_FP, dl, {DestVT, MVT::Other},
2794+
{Node->getOperand(0), InCvt}, Flags);
27992795
Flags.setNoFPExcept(true);
2800-
Slow->setFlags(Flags);
2796+
Slow = DAG.getNode(ISD::STRICT_FADD, dl, {DestVT, MVT::Other},
2797+
{Fast.getValue(1), Fast, Fast}, Flags);
2798+
Chain = Slow.getValue(1);
28012799
} else {
28022800
SDValue SignCvt = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Or);
28032801
Slow = DAG.getNode(ISD::FADD, dl, DestVT, SignCvt, SignCvt);
@@ -3407,14 +3405,12 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
34073405
EVT VT = Operand.getValueType();
34083406
SDValue One = DAG.getConstantFP(1.0, dl, VT);
34093407
SDValue Chain = DAG.getEntryNode();
3410-
SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, dl, {VT, MVT::Other},
3411-
{Chain, Operand, One});
3412-
34133408
// Propagate existing flags on canonicalize, and additionally set
34143409
// NoFPExcept.
34153410
SDNodeFlags CanonicalizeFlags = Node->getFlags();
34163411
CanonicalizeFlags.setNoFPExcept(true);
3417-
Mul->setFlags(CanonicalizeFlags);
3412+
SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, dl, {VT, MVT::Other},
3413+
{Chain, Operand, One}, CanonicalizeFlags);
34183414

34193415
Results.push_back(Mul);
34203416
break;
@@ -4150,15 +4146,14 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
41504146
Tmp2 = Node->getOperand(1);
41514147
Tmp3 = Node->getOperand(2);
41524148
if (Tmp1.getOpcode() == ISD::SETCC) {
4153-
Tmp1 = DAG.getSelectCC(dl, Tmp1.getOperand(0), Tmp1.getOperand(1),
4154-
Tmp2, Tmp3,
4155-
cast<CondCodeSDNode>(Tmp1.getOperand(2))->get());
4149+
Tmp1 = DAG.getSelectCC(
4150+
dl, Tmp1.getOperand(0), Tmp1.getOperand(1), Tmp2, Tmp3,
4151+
cast<CondCodeSDNode>(Tmp1.getOperand(2))->get(), Node->getFlags());
41564152
} else {
4157-
Tmp1 = DAG.getSelectCC(dl, Tmp1,
4158-
DAG.getConstant(0, dl, Tmp1.getValueType()),
4159-
Tmp2, Tmp3, ISD::SETNE);
4153+
Tmp1 =
4154+
DAG.getSelectCC(dl, Tmp1, DAG.getConstant(0, dl, Tmp1.getValueType()),
4155+
Tmp2, Tmp3, ISD::SETNE, Node->getFlags());
41604156
}
4161-
Tmp1->setFlags(Node->getFlags());
41624157
Results.push_back(Tmp1);
41634158
break;
41644159
case ISD::BR_JT: {
@@ -4296,8 +4291,8 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
42964291
EVT Tmp1VT = Tmp1.getValueType();
42974292
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2,
42984293
DAG.getBoolConstant(true, dl, VT, Tmp1VT),
4299-
DAG.getBoolConstant(false, dl, VT, Tmp1VT), Tmp3);
4300-
Tmp1->setFlags(Node->getFlags());
4294+
DAG.getBoolConstant(false, dl, VT, Tmp1VT), Tmp3,
4295+
Node->getFlags());
43014296
Results.push_back(Tmp1);
43024297
break;
43034298
}
@@ -4335,8 +4330,8 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
43354330
if (TLI.isCondCodeLegalOrCustom(InvCC, Tmp1.getSimpleValueType())) {
43364331
// Use the new condition code and swap true and false
43374332
Legalized = true;
4338-
Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp4, Tmp3, InvCC);
4339-
Tmp1->setFlags(Node->getFlags());
4333+
Tmp1 =
4334+
DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp4, Tmp3, InvCC, Node->getFlags());
43404335
} else {
43414336
// If The inverse is not legal, then try to swap the arguments using
43424337
// the inverse condition code.
@@ -4345,8 +4340,8 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
43454340
// The swapped inverse condition is legal, so swap true and false,
43464341
// lhs and rhs.
43474342
Legalized = true;
4348-
Tmp1 = DAG.getSelectCC(dl, Tmp2, Tmp1, Tmp4, Tmp3, SwapInvCC);
4349-
Tmp1->setFlags(Node->getFlags());
4343+
Tmp1 = DAG.getSelectCC(dl, Tmp2, Tmp1, Tmp4, Tmp3, SwapInvCC,
4344+
Node->getFlags());
43504345
}
43514346
}
43524347

@@ -4365,15 +4360,14 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
43654360
// If we expanded the SETCC by swapping LHS and RHS, or by inverting the
43664361
// condition code, create a new SELECT_CC node.
43674362
if (CC.getNode()) {
4368-
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0),
4369-
Tmp1, Tmp2, Tmp3, Tmp4, CC);
4363+
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1,
4364+
Tmp2, Tmp3, Tmp4, CC, Node->getFlags());
43704365
} else {
43714366
Tmp2 = DAG.getConstant(0, dl, Tmp1.getValueType());
43724367
CC = DAG.getCondCode(ISD::SETNE);
43734368
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1,
4374-
Tmp2, Tmp3, Tmp4, CC);
4369+
Tmp2, Tmp3, Tmp4, CC, Node->getFlags());
43754370
}
4376-
Tmp1->setFlags(Node->getFlags());
43774371
}
43784372
Results.push_back(Tmp1);
43794373
break;

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,11 +2087,10 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node,
20872087
// Otherwise, SETCC for the given comparison type must be completely
20882088
// illegal; expand it into a SELECT_CC.
20892089
EVT VT = Node->getValueType(0);
2090-
LHS =
2091-
DAG.getNode(ISD::SELECT_CC, dl, VT, LHS, RHS,
2092-
DAG.getBoolConstant(true, dl, VT, LHS.getValueType()),
2093-
DAG.getBoolConstant(false, dl, VT, LHS.getValueType()), CC);
2094-
LHS->setFlags(Node->getFlags());
2090+
LHS = DAG.getNode(ISD::SELECT_CC, dl, VT, LHS, RHS,
2091+
DAG.getBoolConstant(true, dl, VT, LHS.getValueType()),
2092+
DAG.getBoolConstant(false, dl, VT, LHS.getValueType()),
2093+
CC, Node->getFlags());
20952094
}
20962095

20972096
Results.push_back(LHS);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,9 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_OverflowOp(SDNode *N,
372372

373373
SDVTList ScalarVTs = DAG.getVTList(
374374
ResVT.getVectorElementType(), OvVT.getVectorElementType());
375-
SDNode *ScalarNode = DAG.getNode(
376-
N->getOpcode(), DL, ScalarVTs, ScalarLHS, ScalarRHS).getNode();
377-
ScalarNode->setFlags(N->getFlags());
375+
SDNode *ScalarNode = DAG.getNode(N->getOpcode(), DL, ScalarVTs,
376+
{ScalarLHS, ScalarRHS}, N->getFlags())
377+
.getNode();
378378

379379
// Replace the other vector result not being explicitly scalarized here.
380380
unsigned OtherNo = 1 - ResNo;
@@ -1898,7 +1898,7 @@ SDValue DAGTypeLegalizer::UnrollVectorOp_StrictFP(SDNode *N, unsigned ResNE) {
18981898
NE = ResNE;
18991899

19001900
//The results of each unrolled operation, including the chain.
1901-
EVT ChainVTs[] = {EltVT, MVT::Other};
1901+
SDVTList ChainVTs = DAG.getVTList(EltVT, MVT::Other);
19021902
SmallVector<SDValue, 8> Chains;
19031903

19041904
unsigned i;
@@ -1914,8 +1914,8 @@ SDValue DAGTypeLegalizer::UnrollVectorOp_StrictFP(SDNode *N, unsigned ResNE) {
19141914
Operands[j] = Operand;
19151915
}
19161916
}
1917-
SDValue Scalar = DAG.getNode(N->getOpcode(), dl, ChainVTs, Operands);
1918-
Scalar.getNode()->setFlags(N->getFlags());
1917+
SDValue Scalar =
1918+
DAG.getNode(N->getOpcode(), dl, ChainVTs, Operands, N->getFlags());
19191919

19201920
//Add in the scalar as well as its chain value to the
19211921
//result vectors.
@@ -1956,10 +1956,10 @@ void DAGTypeLegalizer::SplitVecRes_OverflowOp(SDNode *N, unsigned ResNo,
19561956
unsigned Opcode = N->getOpcode();
19571957
SDVTList LoVTs = DAG.getVTList(LoResVT, LoOvVT);
19581958
SDVTList HiVTs = DAG.getVTList(HiResVT, HiOvVT);
1959-
SDNode *LoNode = DAG.getNode(Opcode, dl, LoVTs, LoLHS, LoRHS).getNode();
1960-
SDNode *HiNode = DAG.getNode(Opcode, dl, HiVTs, HiLHS, HiRHS).getNode();
1961-
LoNode->setFlags(N->getFlags());
1962-
HiNode->setFlags(N->getFlags());
1959+
SDNode *LoNode =
1960+
DAG.getNode(Opcode, dl, LoVTs, {LoLHS, LoRHS}, N->getFlags()).getNode();
1961+
SDNode *HiNode =
1962+
DAG.getNode(Opcode, dl, HiVTs, {HiLHS, HiRHS}, N->getFlags()).getNode();
19631963

19641964
Lo = SDValue(LoNode, ResNo);
19651965
Hi = SDValue(HiNode, ResNo);
@@ -2669,10 +2669,8 @@ void DAGTypeLegalizer::SplitVecRes_UnaryOpWithTwoResults(SDNode *N,
26692669
else
26702670
std::tie(Lo, Hi) = DAG.SplitVectorOperand(N, 0);
26712671

2672-
Lo = DAG.getNode(N->getOpcode(), dl, {LoVT, LoVT1}, Lo);
2673-
Hi = DAG.getNode(N->getOpcode(), dl, {HiVT, HiVT1}, Hi);
2674-
Lo->setFlags(N->getFlags());
2675-
Hi->setFlags(N->getFlags());
2672+
Lo = DAG.getNode(N->getOpcode(), dl, {LoVT, LoVT1}, Lo, N->getFlags());
2673+
Hi = DAG.getNode(N->getOpcode(), dl, {HiVT, HiVT1}, Hi, N->getFlags());
26762674

26772675
SDNode *HiNode = Hi.getNode();
26782676
SDNode *LoNode = Lo.getNode();

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10695,7 +10695,16 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
1069510695

1069610696
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
1069710697
ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
10698-
return getNode(Opcode, DL, getVTList(ResultTys), Ops);
10698+
SDNodeFlags Flags;
10699+
if (Inserter)
10700+
Flags = Inserter->getFlags();
10701+
return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
10702+
}
10703+
10704+
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
10705+
ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops,
10706+
const SDNodeFlags Flags) {
10707+
return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
1069910708
}
1070010709

1070110710
SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8634,9 +8634,8 @@ TargetLowering::createSelectForFMINNUM_FMAXNUM(SDNode *Node,
86348634
return SDValue();
86358635
SDValue Op1 = Node->getOperand(0);
86368636
SDValue Op2 = Node->getOperand(1);
8637-
SDValue SelCC = DAG.getSelectCC(SDLoc(Node), Op1, Op2, Op1, Op2, Pred);
8638-
SelCC->setFlags(Node->getFlags());
8639-
return SelCC;
8637+
return DAG.getSelectCC(SDLoc(Node), Op1, Op2, Op1, Op2, Pred,
8638+
Node->getFlags());
86408639
}
86418640

86428641
return SDValue();

0 commit comments

Comments
 (0)