[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Nate Begeman
natebegeman at mac.com
Thu Aug 25 13:04:49 PDT 2005
Changes in directory llvm/lib/CodeGen/SelectionDAG:
SelectionDAG.cpp updated: 1.166 -> 1.167
---
Log message:
New fold for SELECT_CC
---
Diffs of the changes: (+19 -1)
SelectionDAG.cpp | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletion(-)
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.166 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.167
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.166 Thu Aug 25 14:12:10 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Aug 25 15:04:38 2005
@@ -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()))
More information about the llvm-commits
mailing list