diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8b1deb3..0605352 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -388,43 +388,46 @@
 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;
 }
