New fold for SELECT_CC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23058 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 7a123aa..c3d1bb3 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -843,6 +843,7 @@
SDOperand N3, SDOperand N4,
ISD::CondCode CC) {
MVT::ValueType VT = N3.getValueType();
+ ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.Val);
ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.Val);
ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N3.Val);
ConstantSDNode *N4C = dyn_cast<ConstantSDNode>(N4.Val);
@@ -865,6 +866,23 @@
}
}
+ // check to see if we're select_cc'ing a select_cc.
+ // this allows us to turn:
+ // select_cc set[eq,ne] (select_cc cc, lhs, rhs, 1, 0), 0, true, false ->
+ // select_cc cc, lhs, rhs, true, false
+ if ((N1C && N1C->isNullValue() && N2.getOpcode() == ISD::SELECT_CC) ||
+ (N2C && N2C->isNullValue() && N1.getOpcode() == ISD::SELECT_CC) &&
+ (CC == ISD::SETEQ || CC == ISD::SETNE)) {
+ SDOperand SCC = N1C ? N2 : N1;
+ ConstantSDNode *SCCT = dyn_cast<ConstantSDNode>(SCC.getOperand(2));
+ ConstantSDNode *SCCF = dyn_cast<ConstantSDNode>(SCC.getOperand(3));
+ if (SCCT && SCCF && SCCF->isNullValue() && SCCT->getValue() == 1ULL) {
+ if (CC == ISD::SETEQ) std::swap(N3, N4);
+ return getNode(ISD::SELECT_CC, N3.getValueType(), SCC.getOperand(0),
+ SCC.getOperand(1), N3, N4, SCC.getOperand(4));
+ }
+ }
+
// Check to see if we can perform the "gzip trick", transforming
// select_cc setlt X, 0, A, 0 -> and (sra X, size(X)-1), A
if (N2C && N2C->isNullValue() && N4C && N4C->isNullValue() &&
@@ -894,7 +912,7 @@
}
}
- // Check to see if this is the equivalent of setcc X, 0
+ // Check to see if this is the equivalent of setcc
if (N4C && N4C->isNullValue() && N3C && (N3C->getValue() == 1ULL)) {
MVT::ValueType XType = N1.getValueType();
if (TLI.isOperationLegal(ISD::SETCC, TLI.getSetCCResultTy()))