[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Evan Cheng evan.cheng at apple.com
Wed May 17 11:16:51 PDT 2006



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.244 -> 1.245
---
Log message:

Fixed a LowerCallTo and LowerArguments bug. They were introducing illegal
VBIT_VECTOR nodes. There were some confusion about the semantics of 
getPackedTypeBreakdown(). e.g. for <4 x f32> it returns 1 and v4f32, not 4,
and f32.


---
Diffs of the changes:  (+27 -12)

 SelectionDAGISel.cpp |   39 +++++++++++++++++++++++++++------------
 1 files changed, 27 insertions(+), 12 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.244 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.245
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.244	Tue May 16 18:39:44 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Wed May 17 13:16:39 2006
@@ -2455,20 +2455,25 @@
 
         // Figure out if there is a Packed type corresponding to this Vector
         // type.  If so, convert to the packed type.
+        bool Supported = false;
         MVT::ValueType TVT = MVT::getVectorType(getValueType(EltTy), NumElems);
-        if (TVT != MVT::Other && isTypeLegal(TVT)) {
+        if (TVT != MVT::Other) {
           SDOperand N = SDOperand(Result, i++);
           // Handle copies from generic vectors to registers.
           MVT::ValueType PTyElementVT, PTyLegalElementVT;
           unsigned NE = getPackedTypeBreakdown(PTy, PTyElementVT,
                                                PTyLegalElementVT);
-          // Insert a VBIT_CONVERT of the FORMAL_ARGUMENTS to a
-          // "N x PTyElementVT" MVT::Vector type.
-          N = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, N,
-                          DAG.getConstant(NE, MVT::i32), 
-                          DAG.getValueType(PTyElementVT));
-          Ops.push_back(N);
-        } else {
+          // FIXME: handle NE > 1 cases.
+          if (NE == 1) {
+            N = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, N,
+                            DAG.getConstant(NumElems, MVT::i32), 
+                            DAG.getValueType(getValueType(EltTy)));
+            Ops.push_back(N);
+            Supported = true;
+          }
+        }
+
+        if (!Supported) {
           assert(0 && "Don't support illegal by-val vector arguments yet!");
           abort();
         }
@@ -2546,15 +2551,25 @@
         
         // Figure out if there is a Packed type corresponding to this Vector
         // type.  If so, convert to the packed type.
+        bool Supported = false;
         MVT::ValueType TVT = MVT::getVectorType(getValueType(EltTy), NumElems);
-        if (TVT != MVT::Other && isTypeLegal(TVT)) {
+        if (TVT != MVT::Other) {
           // Handle copies from generic vectors to registers.
           MVT::ValueType PTyElementVT, PTyLegalElementVT;
           unsigned NE = getPackedTypeBreakdown(PTy, PTyElementVT,
                                                PTyLegalElementVT);
-          // Insert a VBIT_CONVERT of the MVT::Vector type to the packed type.
-          Ops.push_back(DAG.getNode(ISD::VBIT_CONVERT, TVT, Op));
-        } else {
+          // FIXME: handle NE > 1 cases.
+          if (NE == 1) {
+            // Insert a VBIT_CONVERT of the MVT::Vector type to the packed type.
+            Op = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, Op,
+                             DAG.getConstant(NumElems, MVT::i32), 
+                             DAG.getValueType(getValueType(EltTy)));
+            Ops.push_back(Op);
+            Supported = true;
+          }
+        }
+
+        if (!Supported) {
           assert(0 && "Don't support illegal by-val vector call args yet!");
           abort();
         }






More information about the llvm-commits mailing list