diff options
| author | Duncan Sands <baldrick@free.fr> | 2007-11-05 00:35:07 +0000 | 
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2007-11-05 00:35:07 +0000 | 
| commit | f07fa24289555a3300ed9d701958a68d69ad979d (patch) | |
| tree | 04cc8ab35a54434f67aa528c48fa109b0b32554f /llvm/lib/Transforms | |
| parent | 3865e4d8b48166678f03efdd5dde4c740ef87001 (diff) | |
| download | bcm5719-llvm-f07fa24289555a3300ed9d701958a68d69ad979d.tar.gz bcm5719-llvm-f07fa24289555a3300ed9d701958a68d69ad979d.zip | |
If a long double is in a packed struct, it may be
that there is no padding.
llvm-svn: 43691
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp | 12 | 
1 files changed, 7 insertions, 5 deletions
| diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 3da4b56b9b5..8312274a438 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -733,7 +733,8 @@ void SROA::RewriteBitCastUserOfAlloca(Instruction *BCInst, AllocationInst *AI,  /// HasPadding - Return true if the specified type has any structure or  /// alignment padding, false otherwise. -static bool HasPadding(const Type *Ty, const TargetData &TD) { +static bool HasPadding(const Type *Ty, const TargetData &TD, +                       bool inPacked = false) {    if (const StructType *STy = dyn_cast<StructType>(Ty)) {      const StructLayout *SL = TD.getStructLayout(STy);      unsigned PrevFieldBitOffset = 0; @@ -741,7 +742,7 @@ static bool HasPadding(const Type *Ty, const TargetData &TD) {        unsigned FieldBitOffset = SL->getElementOffsetInBits(i);        // Padding in sub-elements? -      if (HasPadding(STy->getElementType(i), TD)) +      if (HasPadding(STy->getElementType(i), TD, STy->isPacked()))          return true;        // Check to see if there is any padding between this element and the @@ -765,11 +766,12 @@ static bool HasPadding(const Type *Ty, const TargetData &TD) {      }    } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { -    return HasPadding(ATy->getElementType(), TD); +    return HasPadding(ATy->getElementType(), TD, false);    } else if (const VectorType *VTy = dyn_cast<VectorType>(Ty)) { -    return HasPadding(VTy->getElementType(), TD); +    return HasPadding(VTy->getElementType(), TD, false);    } -  return TD.getTypeSizeInBits(Ty) != TD.getABITypeSizeInBits(Ty); +  return inPacked ? +    false : TD.getTypeSizeInBits(Ty) != TD.getABITypeSizeInBits(Ty);  }  /// isSafeStructAllocaToScalarRepl - Check to see if the specified allocation of | 

