[llvm-commits] [llvm] r70560 - in /llvm/trunk/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp TargetLowering.cpp

Bob Wilson bob.wilson at apple.com
Fri May 1 10:55:45 PDT 2009


Author: bwilson
Date: Fri May  1 12:55:32 2009
New Revision: 70560

URL: http://llvm.org/viewvc/llvm-project?rev=70560&view=rev
Log:
Allow CONCAT_VECTORS nodes to be legal or have custom lowering for some targets.
Changes to take advantage of this will come later.

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=70560&r1=70559&r2=70560&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri May  1 12:55:32 2009
@@ -1750,23 +1750,46 @@
     break;
 
   case ISD::CONCAT_VECTORS: {
-    // Use extract/insert/build vector for now. We might try to be
-    // more clever later.
-    MVT PtrVT = TLI.getPointerTy();
+    // Legalize the operands.
     SmallVector<SDValue, 8> Ops;
-    unsigned NumOperands = Node->getNumOperands();
-    for (unsigned i=0; i < NumOperands; ++i) {
-      SDValue SubOp = Node->getOperand(i);
-      MVT VVT = SubOp.getNode()->getValueType(0);
-      MVT EltVT = VVT.getVectorElementType();
-      unsigned NumSubElem = VVT.getVectorNumElements();
-      for (unsigned j=0; j < NumSubElem; ++j) {
-        Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, SubOp,
-                                  DAG.getConstant(j, PtrVT)));
+    for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i)
+      Ops.push_back(LegalizeOp(Node->getOperand(i)));
+    Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size());
+
+    switch (TLI.getOperationAction(ISD::CONCAT_VECTORS,
+                                   Node->getValueType(0))) {
+    default: assert(0 && "Unknown operation action!");
+    case TargetLowering::Legal:
+      break;
+    case TargetLowering::Custom:
+      Tmp3 = TLI.LowerOperation(Result, DAG);
+      if (Tmp3.getNode()) {
+        Result = Tmp3;
+        break;
+      }
+      // FALLTHROUGH
+    case TargetLowering::Expand: {
+      // Use extract/insert/build vector for now. We might try to be
+      // more clever later.
+      MVT PtrVT = TLI.getPointerTy();
+      SmallVector<SDValue, 8> Ops;
+      unsigned NumOperands = Node->getNumOperands();
+      for (unsigned i=0; i < NumOperands; ++i) {
+        SDValue SubOp = Node->getOperand(i);
+        MVT VVT = SubOp.getNode()->getValueType(0);
+        MVT EltVT = VVT.getVectorElementType();
+        unsigned NumSubElem = VVT.getVectorNumElements();
+        for (unsigned j=0; j < NumSubElem; ++j) {
+          Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, SubOp,
+                                    DAG.getConstant(j, PtrVT)));
+        }
       }
+      return LegalizeOp(DAG.getNode(ISD::BUILD_VECTOR, dl,
+                                    Node->getValueType(0),
+                                    &Ops[0], Ops.size()));
     }
-    return LegalizeOp(DAG.getNode(ISD::BUILD_VECTOR, dl, Node->getValueType(0),
-                      &Ops[0], Ops.size()));
+    }
+    break;
   }
 
   case ISD::CALLSEQ_START: {

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=70560&r1=70559&r2=70560&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Fri May  1 12:55:32 2009
@@ -443,6 +443,7 @@
     
     // These operations default to expand.
     setOperationAction(ISD::FGETSIGN, (MVT::SimpleValueType)VT, Expand);
+    setOperationAction(ISD::CONCAT_VECTORS, (MVT::SimpleValueType)VT, Expand);
   }
 
   // Most targets ignore the @llvm.prefetch intrinsic.





More information about the llvm-commits mailing list