Disable type legalization in LegalizeDAG.

This leaves around 4000 lines of dead code; I'll clean that up 
in subsequent commits.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72358 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 25e43d9..f2a6b24 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -56,7 +56,6 @@
   TargetLowering &TLI;
   SelectionDAG &DAG;
   CodeGenOpt::Level OptLevel;
-  bool TypesNeedLegalizing;
 
   // Libcall insertion helpers.
 
@@ -138,8 +137,7 @@
   }
 
 public:
-  explicit SelectionDAGLegalize(SelectionDAG &DAG, bool TypesNeedLegalizing,
-                                CodeGenOpt::Level ol);
+  SelectionDAGLegalize(SelectionDAG &DAG, CodeGenOpt::Level ol);
 
   /// getTypeAction - Return how we should legalize values of this type, either
   /// it is already legal or we need to expand it into multiple registers of
@@ -351,9 +349,9 @@
 }
 
 SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag,
-                                           bool types, CodeGenOpt::Level ol)
+                                           CodeGenOpt::Level ol)
   : TLI(dag.getTargetLoweringInfo()), DAG(dag), OptLevel(ol),
-    TypesNeedLegalizing(types), ValueTypeActions(TLI.getValueTypeActions()) {
+    ValueTypeActions(TLI.getValueTypeActions()) {
   assert(MVT::LAST_VALUETYPE <= 32 &&
          "Too many value types for ValueTypeActions to hold!");
 }
@@ -491,13 +489,12 @@
 /// HandleOp - Legalize, Promote, Widen, or Expand the specified operand as
 /// appropriate for its type.
 void SelectionDAGLegalize::HandleOp(SDValue Op) {
+  // Don't touch TargetConstants
+  if (Op.getOpcode() == ISD::TargetConstant)
+    return;
   MVT VT = Op.getValueType();
-  // If the type legalizer was run then we should never see any illegal result
-  // types here except for target constants (the type legalizer does not touch
-  // those) or for build vector used as a mask for a vector shuffle.
-  assert((TypesNeedLegalizing || getTypeAction(VT) == Legal ||
-          IsLegalizingCallArgs || Op.getOpcode() == ISD::TargetConstant) &&
-         "Illegal type introduced after type legalization?");
+  // We should never see any illegal result types here.
+  assert(isTypeLegal(VT) && "Illegal type introduced after type legalization?");
   switch (getTypeAction(VT)) {
   default: assert(0 && "Bad type action!");
   case Legal:   (void)LegalizeOp(Op); break;
@@ -986,22 +983,17 @@
   if (Op.getOpcode() == ISD::TargetConstant) // Allow illegal target nodes.
     return Op;
 
-  assert(isTypeLegal(Op.getValueType()) &&
-         "Caller should expand or promote operands that are not legal!");
   SDNode *Node = Op.getNode();
   DebugLoc dl = Node->getDebugLoc();
 
-  // If this operation defines any values that cannot be represented in a
-  // register on this target, make sure to expand or promote them.
-  if (Node->getNumValues() > 1) {
-    for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
-      if (getTypeAction(Node->getValueType(i)) != Legal) {
-        HandleOp(Op.getValue(i));
-        assert(LegalizedNodes.count(Op) &&
-               "Handling didn't add legal operands!");
-        return LegalizedNodes[Op];
-      }
-  }
+  for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
+    assert(getTypeAction(Node->getValueType(i)) == Legal &&
+           "Unexpected illegal type!");
+
+  for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
+    assert((isTypeLegal(Node->getOperand(i).getValueType()) || 
+            Node->getOperand(i).getOpcode() == ISD::TargetConstant) &&
+           "Unexpected illegal type!");
 
   // Note that LegalizeOp may be reentered even from single-use nodes, which
   // means that we always must cache transformed nodes.
@@ -1744,9 +1736,10 @@
     break;
 
   case ISD::EXTRACT_SUBVECTOR:
-    Tmp1 = Node->getOperand(0);
+    Tmp1 = LegalizeOp(Node->getOperand(0));
     Tmp2 = LegalizeOp(Node->getOperand(1));
     Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2);
+
     switch (TLI.getOperationAction(ISD::EXTRACT_SUBVECTOR,
                                    Node->getValueType(0))) {
     default: assert(0 && "Unknown operation action!");
@@ -3990,47 +3983,17 @@
     break;
   }
   case ISD::BIT_CONVERT:
-    if (!isTypeLegal(Node->getOperand(0).getValueType())) {
+    switch (TLI.getOperationAction(ISD::BIT_CONVERT,
+                                   Node->getOperand(0).getValueType())) {
+    default: assert(0 && "Unknown operation action!");
+    case TargetLowering::Expand:
       Result = EmitStackConvert(Node->getOperand(0), Node->getValueType(0),
                                 Node->getValueType(0), dl);
-    } else if (Op.getOperand(0).getValueType().isVector()) {
-      // The input has to be a vector type, we have to either scalarize it, pack
-      // it, or convert it based on whether the input vector type is legal.
-      SDNode *InVal = Node->getOperand(0).getNode();
-      int InIx = Node->getOperand(0).getResNo();
-      unsigned NumElems = InVal->getValueType(InIx).getVectorNumElements();
-      MVT EVT = InVal->getValueType(InIx).getVectorElementType();
-
-      // Figure out if there is a simple type corresponding to this Vector
-      // type.  If so, convert to the vector type.
-      MVT TVT = MVT::getVectorVT(EVT, NumElems);
-      if (TLI.isTypeLegal(TVT)) {
-        // Turn this into a bit convert of the vector input.
-        Tmp1 = LegalizeOp(Node->getOperand(0));
-        Result = DAG.getNode(ISD::BIT_CONVERT, dl, Node->getValueType(0), Tmp1);
-        break;
-      } else if (NumElems == 1) {
-        // Turn this into a bit convert of the scalar input.
-        Result = DAG.getNode(ISD::BIT_CONVERT, dl, Node->getValueType(0),
-                             ScalarizeVectorOp(Node->getOperand(0)));
-        break;
-      } else {
-        // FIXME: UNIMP!  Store then reload
-        assert(0 && "Cast from unsupported vector type not implemented yet!");
-      }
-    } else {
-      switch (TLI.getOperationAction(ISD::BIT_CONVERT,
-                                     Node->getOperand(0).getValueType())) {
-      default: assert(0 && "Unknown operation action!");
-      case TargetLowering::Expand:
-        Result = EmitStackConvert(Node->getOperand(0), Node->getValueType(0),
-                                  Node->getValueType(0), dl);
-        break;
-      case TargetLowering::Legal:
-        Tmp1 = LegalizeOp(Node->getOperand(0));
-        Result = DAG.UpdateNodeOperands(Result, Tmp1);
-        break;
-      }
+      break;
+    case TargetLowering::Legal:
+      Tmp1 = LegalizeOp(Node->getOperand(0));
+      Result = DAG.UpdateNodeOperands(Result, Tmp1);
+      break;
     }
     break;
   case ISD::CONVERT_RNDSAT: {
@@ -4243,13 +4206,8 @@
     MVT SrcVT = Op.getOperand(0).getValueType();
     if (TLI.getConvertAction(SrcVT, DstVT) == TargetLowering::Expand) {
       if (SrcVT == MVT::ppcf128) {
-        SDValue Lo;
-        ExpandOp(Node->getOperand(0), Lo, Result);
-        // Round it the rest of the way (e.g. to f32) if needed.
-        if (DstVT!=MVT::f64)
-          Result = DAG.getNode(ISD::FP_ROUND, dl,
-                               DstVT, Result, Op.getOperand(1));
-        break;
+        // FIXME: Figure out how to extract the double without
+        // help from type legalization
       }
       // The only other way we can lower this is to turn it into a STORE,
       // LOAD pair, targetting a temporary location (a stack slot).
@@ -4533,6 +4491,7 @@
 /// have the correct bits for the low portion of the register, but no guarantee
 /// is made about the top bits: it may be zero, sign-extended, or garbage.
 SDValue SelectionDAGLegalize::PromoteOp(SDValue Op) {
+  assert(0 && "This should be dead!");
   MVT VT = Op.getValueType();
   MVT NVT = TLI.getTypeToTransformTo(VT);
   assert(getTypeAction(VT) == Promote &&
@@ -5057,29 +5016,11 @@
     break;
   }
 
-  if (NumElems == 1) {
+  if (NumElems == 1)
     // This must be an access of the only element.  Return it.
-    Op = ScalarizeVectorOp(Vec);
-  } else if (!TLI.isTypeLegal(TVT) && isa<ConstantSDNode>(Idx)) {
-    unsigned NumLoElts =  1 << Log2_32(NumElems-1);
-    ConstantSDNode *CIdx = cast<ConstantSDNode>(Idx);
-    SDValue Lo, Hi;
-    SplitVectorOp(Vec, Lo, Hi);
-    if (CIdx->getZExtValue() < NumLoElts) {
-      Vec = Lo;
-    } else {
-      Vec = Hi;
-      Idx = DAG.getConstant(CIdx->getZExtValue() - NumLoElts,
-                            Idx.getValueType());
-    }
-
-    // It's now an extract from the appropriate high or low part.  Recurse.
-    Op = DAG.UpdateNodeOperands(Op, Vec, Idx);
-    Op = ExpandEXTRACT_VECTOR_ELT(Op);
-  } else {
-    Op = ExpandExtractFromVectorThroughStack(Op);
-  }
-  return Op;
+    return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Vec);
+  else
+    return ExpandExtractFromVectorThroughStack(Op);
 }
 
 SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
@@ -6448,6 +6389,7 @@
 /// ExpandedNodes map is filled in for any results that are expanded, and the
 /// Lo/Hi values are returned.
 void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
+  assert(0 && "This should be dead!");
   MVT VT = Op.getValueType();
   MVT NVT = TLI.getTypeToTransformTo(VT);
   SDNode *Node = Op.getNode();
@@ -7503,6 +7445,7 @@
 /// two smaller values, still of vector type.
 void SelectionDAGLegalize::SplitVectorOp(SDValue Op, SDValue &Lo,
                                          SDValue &Hi) {
+  assert(0 && "This should be dead!");
   assert(Op.getValueType().isVector() && "Cannot split non-vector type!");
   SDNode *Node = Op.getNode();
   DebugLoc dl = Node->getDebugLoc();
@@ -7857,6 +7800,7 @@
 /// (e.g. v1f32), convert it into the equivalent operation that returns a
 /// scalar (e.g. f32) value.
 SDValue SelectionDAGLegalize::ScalarizeVectorOp(SDValue Op) {
+  assert(0 && "This should be dead!");
   assert(Op.getValueType().isVector() && "Bad ScalarizeVectorOp invocation!");
   SDNode *Node = Op.getNode();
   DebugLoc dl = Node->getDebugLoc();
@@ -8026,6 +7970,7 @@
 
 
 SDValue SelectionDAGLegalize::WidenVectorOp(SDValue Op, MVT WidenVT) {
+  assert(0 && "This should be dead!");
   std::map<SDValue, SDValue>::iterator I = WidenNodes.find(Op);
   if (I != WidenNodes.end()) return I->second;
 
@@ -8643,6 +8588,6 @@
                             CodeGenOpt::Level OptLevel) {
   /// run - This is the main entry point to this class.
   ///
-  SelectionDAGLegalize(*this, TypesNeedLegalizing, OptLevel).LegalizeDAG();
+  SelectionDAGLegalize(*this, OptLevel).LegalizeDAG();
 }