From 18b0ca854fbeebbc48cf1f4473daa428e68f748c Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Mon, 5 Nov 2007 00:35:07 +0000 Subject: [PATCH] If a long double is in a packed struct, it may be that there is no padding. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43691 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/ScalarReplAggregates.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 3da4b56b9b5..8312274a438 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/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(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(Ty)) { - return HasPadding(ATy->getElementType(), TD); + return HasPadding(ATy->getElementType(), TD, false); } else if (const VectorType *VTy = dyn_cast(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 -- 2.34.1