@@ -2091,7 +2091,9 @@ SDValue DAGCombiner::foldBinOpIntoSelect(SDNode *BO) {
2091
2091
!isConstantFPBuildVectorOrConstantFP(NewCF))
2092
2092
return SDValue();
2093
2093
2094
- return DAG.getSelect(DL, VT, Sel.getOperand(0), NewCT, NewCF);
2094
+ SDValue SelectOp = DAG.getSelect(DL, VT, Sel.getOperand(0), NewCT, NewCF);
2095
+ SelectOp->setFlags(BO->getFlags());
2096
+ return SelectOp;
2095
2097
}
2096
2098
2097
2099
static SDValue foldAddSubBoolOfMaskedVal(SDNode *N, SelectionDAG &DAG) {
@@ -7997,6 +7999,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
7997
7999
EVT VT = N->getValueType(0);
7998
8000
EVT VT0 = N0.getValueType();
7999
8001
SDLoc DL(N);
8002
+ SDNodeFlags Flags = N->getFlags();
8000
8003
8001
8004
if (SDValue V = DAG.simplifySelect(N0, N1, N2))
8002
8005
return V;
@@ -8047,10 +8050,10 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
8047
8050
SDValue Cond0 = N0->getOperand(0);
8048
8051
SDValue Cond1 = N0->getOperand(1);
8049
8052
SDValue InnerSelect =
8050
- DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Cond1, N1, N2);
8053
+ DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Cond1, N1, N2, Flags );
8051
8054
if (normalizeToSequence || !InnerSelect.use_empty())
8052
8055
return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Cond0,
8053
- InnerSelect, N2);
8056
+ InnerSelect, N2, Flags );
8054
8057
// Cleanup on failure.
8055
8058
if (InnerSelect.use_empty())
8056
8059
recursivelyDeleteUnusedNodes(InnerSelect.getNode());
@@ -8059,11 +8062,11 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
8059
8062
if (N0->getOpcode() == ISD::OR && N0->hasOneUse()) {
8060
8063
SDValue Cond0 = N0->getOperand(0);
8061
8064
SDValue Cond1 = N0->getOperand(1);
8062
- SDValue InnerSelect =
8063
- DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Cond1, N1, N2);
8065
+ SDValue InnerSelect = DAG.getNode(ISD::SELECT, DL, N1.getValueType(),
8066
+ Cond1, N1, N2, Flags );
8064
8067
if (normalizeToSequence || !InnerSelect.use_empty())
8065
8068
return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Cond0, N1,
8066
- InnerSelect);
8069
+ InnerSelect, Flags );
8067
8070
// Cleanup on failure.
8068
8071
if (InnerSelect.use_empty())
8069
8072
recursivelyDeleteUnusedNodes(InnerSelect.getNode());
@@ -8078,12 +8081,14 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
8078
8081
// Create the actual and node if we can generate good code for it.
8079
8082
if (!normalizeToSequence) {
8080
8083
SDValue And = DAG.getNode(ISD::AND, DL, N0.getValueType(), N0, N1_0);
8081
- return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), And, N1_1, N2);
8084
+ return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), And, N1_1,
8085
+ N2, Flags);
8082
8086
}
8083
8087
// Otherwise see if we can optimize the "and" to a better pattern.
8084
- if (SDValue Combined = visitANDLike(N0, N1_0, N))
8088
+ if (SDValue Combined = visitANDLike(N0, N1_0, N)) {
8085
8089
return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Combined, N1_1,
8086
- N2);
8090
+ N2, Flags);
8091
+ }
8087
8092
}
8088
8093
}
8089
8094
// select Cond0, X, (select Cond1, X, Y) -> select (or Cond0, Cond1), X, Y
@@ -8095,19 +8100,23 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
8095
8100
// Create the actual or node if we can generate good code for it.
8096
8101
if (!normalizeToSequence) {
8097
8102
SDValue Or = DAG.getNode(ISD::OR, DL, N0.getValueType(), N0, N2_0);
8098
- return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Or, N1, N2_2);
8103
+ return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Or, N1,
8104
+ N2_2, Flags);
8099
8105
}
8100
8106
// Otherwise see if we can optimize to a better pattern.
8101
8107
if (SDValue Combined = visitORLike(N0, N2_0, N))
8102
8108
return DAG.getNode(ISD::SELECT, DL, N1.getValueType(), Combined, N1,
8103
- N2_2);
8109
+ N2_2, Flags );
8104
8110
}
8105
8111
}
8106
8112
}
8107
8113
8108
8114
// select (not Cond), N1, N2 -> select Cond, N2, N1
8109
- if (SDValue F = extractBooleanFlip(N0, TLI))
8110
- return DAG.getSelect(DL, VT, F, N2, N1);
8115
+ if (SDValue F = extractBooleanFlip(N0, TLI)) {
8116
+ SDValue SelectOp = DAG.getSelect(DL, VT, F, N2, N1);
8117
+ SelectOp->setFlags(Flags);
8118
+ return SelectOp;
8119
+ }
8111
8120
8112
8121
// Fold selects based on a setcc into other things, such as min/max/abs.
8113
8122
if (N0.getOpcode() == ISD::SETCC) {
@@ -8157,7 +8166,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
8157
8166
TLI.isOperationLegalOrCustom(ISD::SELECT_CC, VT))) {
8158
8167
// Any flags available in a select/setcc fold will be on the setcc as they
8159
8168
// migrated from fcmp
8160
- const SDNodeFlags Flags = N0.getNode()->getFlags();
8169
+ Flags = N0.getNode()->getFlags();
8161
8170
SDValue SelectNode = DAG.getNode(ISD::SELECT_CC, DL, VT, Cond0, Cond1, N1,
8162
8171
N2, N0.getOperand(2));
8163
8172
SelectNode->setFlags(Flags);
@@ -8743,9 +8752,11 @@ SDValue DAGCombiner::visitSELECT_CC(SDNode *N) {
8743
8752
return N2;
8744
8753
} else if (SCC.getOpcode() == ISD::SETCC) {
8745
8754
// Fold to a simpler select_cc
8746
- return DAG.getNode(ISD::SELECT_CC, SDLoc(N), N2.getValueType(),
8747
- SCC.getOperand(0), SCC.getOperand(1), N2, N3,
8748
- SCC.getOperand(2));
8755
+ SDValue SelectOp = DAG.getNode(
8756
+ ISD::SELECT_CC, SDLoc(N), N2.getValueType(), SCC.getOperand(0),
8757
+ SCC.getOperand(1), N2, N3, SCC.getOperand(2));
8758
+ SelectOp->setFlags(SCC->getFlags());
8759
+ return SelectOp;
8749
8760
}
8750
8761
}
8751
8762
@@ -19412,13 +19423,16 @@ SDValue DAGCombiner::SimplifySelect(const SDLoc &DL, SDValue N0, SDValue N1,
19412
19423
// Check to see if we got a select_cc back (to turn into setcc/select).
19413
19424
// Otherwise, just return whatever node we got back, like fabs.
19414
19425
if (SCC.getOpcode() == ISD::SELECT_CC) {
19426
+ const SDNodeFlags Flags = N0.getNode()->getFlags();
19415
19427
SDValue SETCC = DAG.getNode(ISD::SETCC, SDLoc(N0),
19416
19428
N0.getValueType(),
19417
19429
SCC.getOperand(0), SCC.getOperand(1),
19418
- SCC.getOperand(4));
19430
+ SCC.getOperand(4), Flags );
19419
19431
AddToWorklist(SETCC.getNode());
19420
- return DAG.getSelect(SDLoc(SCC), SCC.getValueType(), SETCC,
19421
- SCC.getOperand(2), SCC.getOperand(3));
19432
+ SDValue SelectNode = DAG.getSelect(SDLoc(SCC), SCC.getValueType(), SETCC,
19433
+ SCC.getOperand(2), SCC.getOperand(3));
19434
+ SelectNode->setFlags(Flags);
19435
+ return SelectNode;
19422
19436
}
19423
19437
19424
19438
return SCC;
0 commit comments