aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp75
1 files changed, 39 insertions, 36 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8b1deb3470..0605352f9f 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -388,43 +388,46 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
assert(N->getNumOperands() && "This is a leaf node!");
if (N->getOpcode() == ISD::CALLSEQ_START ||
- N->getOpcode() == ISD::CALLSEQ_END)
- return 0;
+ N->getOpcode() == ISD::CALLSEQ_END ||
+ N->getOpcode() == ISD::HANDLENODE)
+ return 0; // Never add these nodes.
- if (N->getOpcode() == ISD::LOAD) {
- SDNode *&L = Loads[std::make_pair(N->getOperand(1),
- std::make_pair(N->getOperand(0),
- N->getValueType(0)))];
- if (L) return L;
- L = N;
- } else if (N->getOpcode() == ISD::HANDLENODE) {
- return 0; // never add it.
- } else if (N->getNumOperands() == 1) {
- SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
- std::make_pair(N->getOperand(0),
- N->getValueType(0)))];
- if (U) return U;
- U = N;
- } else if (N->getNumOperands() == 2) {
- SDNode *&B = BinaryOps[std::make_pair(N->getOpcode(),
- std::make_pair(N->getOperand(0),
- N->getOperand(1)))];
- if (B) return B;
- B = N;
- } else if (N->getNumValues() == 1) {
- std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
- SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
- std::make_pair(N->getValueType(0), Ops))];
- if (ORN) return ORN;
- ORN = N;
- } else {
- // Remove the node from the ArbitraryNodes map.
- std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
- std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
- SDNode *&AN = ArbitraryNodes[std::make_pair(N->getOpcode(),
- std::make_pair(RV, Ops))];
- if (AN) return AN;
- AN = N;
+ if (N->getNumValues() == 1) {
+ if (N->getNumOperands() == 1) {
+ SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
+ std::make_pair(N->getOperand(0),
+ N->getValueType(0)))];
+ if (U) return U;
+ U = N;
+ } else if (N->getNumOperands() == 2) {
+ SDNode *&B = BinaryOps[std::make_pair(N->getOpcode(),
+ std::make_pair(N->getOperand(0),
+ N->getOperand(1)))];
+ if (B) return B;
+ B = N;
+ } else {
+ std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
+ SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
+ std::make_pair(N->getValueType(0), Ops))];
+ if (ORN) return ORN;
+ ORN = N;
+ }
+ } else {
+ if (N->getOpcode() == ISD::LOAD) {
+ SDNode *&L = Loads[std::make_pair(N->getOperand(1),
+ std::make_pair(N->getOperand(0),
+ N->getValueType(0)))];
+ if (L) return L;
+ L = N;
+ } else {
+ // Remove the node from the ArbitraryNodes map.
+ std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
+ std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
+ SDNode *&AN = ArbitraryNodes[std::make_pair(N->getOpcode(),
+ std::make_pair(RV, Ops))];
+ if (AN) return AN;
+ AN = N;
+ }
}
return 0;
}