diff options
author | Dan Gohman <gohman@apple.com> | 2009-08-11 15:50:03 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-08-11 15:50:03 +0000 |
commit | a72f856aa40bbdf6ee16948947afc210e284a9ae (patch) | |
tree | 33a4734ea577b77c1598763dcce5834d0b243e38 /llvm/lib/Analysis | |
parent | c7c2bc9663c9e70b9e0231fee973352923ab9182 (diff) | |
download | bcm5719-llvm-a72f856aa40bbdf6ee16948947afc210e284a9ae.tar.gz bcm5719-llvm-a72f856aa40bbdf6ee16948947afc210e284a9ae.zip |
Don't assume that external global variables are aligned at their preferred
alignment. Only the minimum alignment guaranteed by the ABI may be assumed.
llvm-svn: 78668
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index dbaadd824a1..af8649499b2 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -81,8 +81,16 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask, // The address of an aligned GlobalValue has trailing zeros. if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) { unsigned Align = GV->getAlignment(); - if (Align == 0 && TD && GV->getType()->getElementType()->isSized()) - Align = TD->getPrefTypeAlignment(GV->getType()->getElementType()); + if (Align == 0 && TD && GV->getType()->getElementType()->isSized()) { + const Type *ObjectType = GV->getType()->getElementType(); + // If the object is defined in the current Module, we'll be giving + // it the preferred alignment. Otherwise, we have to assume that it + // may only have the minimum ABI alignment. + if (!GV->isDeclaration() && !GV->mayBeOverridden()) + Align = TD->getPrefTypeAlignment(ObjectType); + else + Align = TD->getABITypeAlignment(ObjectType); + } if (Align > 0) KnownZero = Mask & APInt::getLowBitsSet(BitWidth, CountTrailingZeros_32(Align)); |