diff options
author | Duncan Sands <baldrick@free.fr> | 2011-11-29 18:26:38 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2011-11-29 18:26:38 +0000 |
commit | d3a38ccfbb6be0edad037961df77649db2cb9597 (patch) | |
tree | 5f10e303496ad46ac2743a1576b6568257e1552a /lib/Analysis/ValueTracking.cpp | |
parent | 116bc795da4b10773235a89cc251d31651b3851d (diff) |
Fix a theoretical problem (not seen in the wild): if different instances of a
weak variable are compiled by different compilers, such as GCC and LLVM, while
LLVM may increase the alignment to the preferred alignment there is no reason to
think that GCC will use anything more than the ABI alignment. Since it is the
GCC version that might end up in the final program (as the linkage is weak), it
is wrong to increase the alignment of loads from the global up to the preferred
alignment as the alignment might only be the ABI alignment.
Increasing alignment up to the ABI alignment might be OK, but I'm not totally
convinced that it is. It seems better to just leave the alignment of weak
globals alone.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145413 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | lib/Analysis/ValueTracking.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 8192c1471f..58adc26a1d 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -108,7 +108,7 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask, // 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 (!GVar->isDeclaration() && !GVar->mayBeOverridden()) + if (!GVar->isDeclaration() && !GVar->isWeakForLinker()) Align = TD->getPreferredAlignment(GVar); else Align = TD->getABITypeAlignment(ObjectType); |