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

Dan Gohman djg at cray.com
Wed Jun 27 07:34:29 PDT 2007



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.469 -> 1.470
---
Log message:

Use getVectorTypeBreakdown in FunctionLoweringInfo::CreateRegForValue
to compute the number and type of registers needed for vector values
instead of computing it manually. This fixes PR1529: http://llvm.org/PR1529 .


---
Diffs of the changes:  (+11 -44)

 SelectionDAGISel.cpp |   55 ++++++++++-----------------------------------------
 1 files changed, 11 insertions(+), 44 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.469 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.470
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.469	Mon Jun 25 11:23:39 2007
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Wed Jun 27 09:34:07 2007
@@ -306,53 +306,20 @@
 unsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) {
   MVT::ValueType VT = TLI.getValueType(V->getType());
   
-  // The number of multiples of registers that we need, to, e.g., split up
-  // a <2 x int64> -> 4 x i32 registers.
-  unsigned NumVectorRegs = 1;
-  
-  // If this is a vector type, figure out what type it will decompose into
-  // and how many of the elements it will use.
+  unsigned NumRegisters;
+  MVT::ValueType RegisterVT;
   if (MVT::isVector(VT)) {
-    const VectorType *PTy = cast<VectorType>(V->getType());
-    unsigned NumElts = PTy->getNumElements();
-    MVT::ValueType EltTy = TLI.getValueType(PTy->getElementType());
-    MVT::ValueType VecTy = MVT::getVectorType(EltTy, NumElts);
-    
-    // Divide the input until we get to a supported size.  This will always
-    // end with a scalar if the target doesn't support vectors.
-    while (NumElts > 1 && !TLI.isTypeLegal(VecTy)) {
-      NumElts >>= 1;
-      NumVectorRegs <<= 1;
-      VecTy = MVT::getVectorType(EltTy, NumElts);
-    }
-
-    // Check that VecTy isn't a 1-element vector.
-    if (NumElts == 1 && VecTy == MVT::Other)
-      VT = EltTy;
-    else
-      VT = VecTy;
+    MVT::ValueType ElementVT;
+    NumRegisters = TLI.getVectorTypeBreakdown(VT, ElementVT, RegisterVT);
+  } else {
+    RegisterVT = TLI.getTypeToTransformTo(VT);
+    NumRegisters = TLI.getNumRegisters(VT);
   }
 
-  // The common case is that we will only create one register for this
-  // value.  If we have that case, create and return the virtual register.
-  unsigned NV = TLI.getNumRegisters(VT);
-  if (NV == 1) {
-    // If we are promoting this value, pick the next largest supported type.
-    MVT::ValueType PromotedType = TLI.getTypeToTransformTo(VT);
-    unsigned Reg = MakeReg(PromotedType);
-    // If this is a vector of supported or promoted types (e.g. 4 x i16),
-    // create all of the registers.
-    for (unsigned i = 1; i != NumVectorRegs; ++i)
-      MakeReg(PromotedType);
-    return Reg;
-  }
-  
-  // If this value is represented with multiple target registers, make sure
-  // to create enough consecutive registers of the right (smaller) type.
-  VT = TLI.getTypeToExpandTo(VT);
-  unsigned R = MakeReg(VT);
-  for (unsigned i = 1; i != NV*NumVectorRegs; ++i)
-    MakeReg(VT);
+  unsigned R = MakeReg(RegisterVT);
+  for (unsigned i = 1; i != NumRegisters; ++i)
+    MakeReg(RegisterVT);
+
   return R;
 }
 






More information about the llvm-commits mailing list