Eliminate special purpose hacks for dynamic_stack_alloc.

llvm-svn: 22015
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index d0de8c9..2f259b1 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -373,10 +373,12 @@
     Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the size.
     Tmp3 = LegalizeOp(Node->getOperand(2));  // Legalize the alignment.
     if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
-        Tmp3 != Node->getOperand(2))
-      Result = DAG.getNode(ISD::DYNAMIC_STACKALLOC, Node->getValueType(0),
-                           Tmp1, Tmp2, Tmp3);
-    else
+        Tmp3 != Node->getOperand(2)) {
+      std::vector<MVT::ValueType> VTs(Node->value_begin(), Node->value_end());
+      std::vector<SDOperand> Ops;
+      Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3);
+      Result = DAG.getNode(ISD::DYNAMIC_STACKALLOC, VTs, Ops);
+    } else
       Result = Op.getValue(0);
 
     // Since this op produces two values, make sure to remember that we
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 165b3c9..3643f77 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -1350,19 +1350,7 @@
   }
 
   SDNode *N = new SDNode(Opcode, N1, N2, N3);
-  switch (Opcode) {
-  case ISD::SRA_PARTS:
-  case ISD::SRL_PARTS:
-  case ISD::SHL_PARTS:
-    assert(0 && "Should not get here!");
-  default:
-    N->setValueTypes(VT);
-    break;
-  case ISD::DYNAMIC_STACKALLOC: // DYNAMIC_STACKALLOC produces pointer and chain
-    N->setValueTypes(VT, MVT::Other);
-    break;
-  }
-
+  N->setValueTypes(VT);
   // FIXME: memoize NODES
   AllNodes.push_back(N);
   return SDOperand(N, 0);
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index c08232c..52bcc9a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -617,9 +617,14 @@
                             getIntPtrConstant(~(uint64_t)(StackAlign-1)));
   }
 
-  SDOperand DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, AllocSize.getValueType(),
-                              getRoot(), AllocSize,
-                              getIntPtrConstant(Align));
+  std::vector<MVT::ValueType> VTs;
+  VTs.push_back(AllocSize.getValueType());
+  VTs.push_back(MVT::Other);
+  std::vector<SDOperand> Ops;
+  Ops.push_back(getRoot());
+  Ops.push_back(AllocSize);
+  Ops.push_back(getIntPtrConstant(Align));
+  SDOperand DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, VTs, Ops);
   DAG.setRoot(setValue(&I, DSA).getValue(1));
 
   // Inform the Frame Information that we have just allocated a variable-sized