[llvm-commits] [llvm] r45796 - in /llvm/trunk: include/llvm/Target/TargetData.h lib/Target/TargetData.cpp

Chris Lattner sabre at nondot.org
Wed Jan 9 16:30:58 PST 2008


Author: lattner
Date: Wed Jan  9 18:30:57 2008
New Revision: 45796

URL: http://llvm.org/viewvc/llvm-project?rev=45796&view=rev
Log:
Fix PR1845 and rdar://5676945.  Generic vectors smaller
than hardware supported type will be scalarized, so we
can infer their alignment from that info.

We now codegen pr1845 into:

_boolVectorSelect:
	lbz r2, 0(r3)
	stb r2, -16(r1)
	blr 


Modified:
    llvm/trunk/include/llvm/Target/TargetData.h
    llvm/trunk/lib/Target/TargetData.cpp

Modified: llvm/trunk/include/llvm/Target/TargetData.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetData.h?rev=45796&r1=45795&r2=45796&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Target/TargetData.h (original)
+++ llvm/trunk/include/llvm/Target/TargetData.h Wed Jan  9 18:30:57 2008
@@ -92,7 +92,7 @@
   void setAlignment(AlignTypeEnum align_type, unsigned char abi_align,
                     unsigned char pref_align, uint32_t bit_width);
   unsigned getAlignmentInfo(AlignTypeEnum align_type, uint32_t bit_width,
-                            bool ABIAlign) const;
+                            bool ABIAlign, const Type *Ty) const;
   //! Internal helper method that returns requested alignment for type.
   unsigned char getAlignment(const Type *Ty, bool abi_or_pref) const;
 

Modified: llvm/trunk/lib/Target/TargetData.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetData.cpp?rev=45796&r1=45795&r2=45796&view=diff

==============================================================================
--- llvm/trunk/lib/Target/TargetData.cpp (original)
+++ llvm/trunk/lib/Target/TargetData.cpp Wed Jan  9 18:30:57 2008
@@ -154,7 +154,8 @@
  <i>p:@verbatim<size>:<abi_align>:<pref_align>@endverbatim</i>: Pointer size, 
  ABI and preferred alignment.
  <br><br>
- <i>@verbatim<type><size>:<abi_align>:<pref_align>@endverbatim</i>: Numeric type alignment. Type is
+ <i>@verbatim<type><size>:<abi_align>:<pref_align>@endverbatim</i>: Numeric type
+ alignment. Type is
  one of <i>i|f|v|a</i>, corresponding to integer, floating point, vector (aka
  packed) or aggregate.  Size indicates the size, e.g., 32 or 64 bits.
  \p
@@ -258,7 +259,8 @@
 /// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or 
 /// preferred if ABIInfo = false) the target wants for the specified datatype.
 unsigned TargetData::getAlignmentInfo(AlignTypeEnum AlignType, 
-                                      uint32_t BitWidth, bool ABIInfo) const {
+                                      uint32_t BitWidth, bool ABIInfo,
+                                      const Type *Ty) const {
   // Check to see if we have an exact match and remember the best match we see.
   int BestMatchIdx = -1;
   int LargestInt = -1;
@@ -293,14 +295,22 @@
     }
   }
 
-  // For integers, if we didn't find a best match, use the largest one found.
-  if (BestMatchIdx == -1)
-    BestMatchIdx = LargestInt;
-
   // Okay, we didn't find an exact solution.  Fall back here depending on what
   // is being looked for.
-  assert(BestMatchIdx != -1 && "Didn't find alignment info for this datatype!");
-
+  if (BestMatchIdx == -1) {
+    // If we didn't find an integer alignment, fall back on most conservative.
+    if (AlignType == INTEGER_ALIGN) {
+      BestMatchIdx = LargestInt;
+    } else {
+      assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
+      
+      // If we didn't find a vector size that is smaller or equal to this type,
+      // then we will end up scalarizing this to its element type.  Just return
+      // the alignment of the element.
+      return getAlignment(cast<VectorType>(Ty)->getElementType(), ABIInfo);
+    }    
+  }
+    
   // Since we got a "best match" index, just return it.
   return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
                  : Alignments[BestMatchIdx].PrefAlign;
@@ -474,7 +484,7 @@
     
     // Get the layout annotation... which is lazily created on demand.
     const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
-    unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref);
+    unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
     return std::max(Align, (unsigned)Layout->getAlignment());
   }
   case Type::IntegerTyID:
@@ -490,22 +500,16 @@
   case Type::X86_FP80TyID:
     AlignType = FLOAT_ALIGN;
     break;
-  case Type::VectorTyID: {
-    const VectorType *VTy = cast<VectorType>(Ty);
-    // Degenerate vectors are assumed to be scalar-ized
-    if (VTy->getNumElements() == 1)
-      return getAlignment(VTy->getElementType(), abi_or_pref);
-    else
-      AlignType = VECTOR_ALIGN;
+  case Type::VectorTyID:
+    AlignType = VECTOR_ALIGN;
     break;
-  }
   default:
     assert(0 && "Bad type for getAlignment!!!");
     break;
   }
 
   return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
-                          abi_or_pref);
+                          abi_or_pref, Ty);
 }
 
 unsigned char TargetData::getABITypeAlignment(const Type *Ty) const {





More information about the llvm-commits mailing list