aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2007-11-05 00:35:07 +0000
committerDuncan Sands <baldrick@free.fr>2007-11-05 00:35:07 +0000
commit18b0ca854fbeebbc48cf1f4473daa428e68f748c (patch)
treeb058e3eb5c91828e4c709d8b0ec0e22ea6f4d446
parent62a709d74b6e50e10329cec09a99c846aeb07da3 (diff)
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
-rw-r--r--lib/Transforms/Scalar/ScalarReplAggregates.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp
index 3da4b56b9b..8312274a43 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<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