summaryrefslogtreecommitdiff
path: root/lib/Target/ARM/ARMConstantIslandPass.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-04-30 20:19:00 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-04-30 20:19:00 +0000
commit887d095fb6c6fb0980ab90a9211fb2420d0da7c0 (patch)
treeba04dea17aff266a5aa9470836f4e0a365b10d38 /lib/Target/ARM/ARMConstantIslandPass.cpp
parente4f1b370bfbebcb88092caec54450e90f37c100d (diff)
downloadllvm-887d095fb6c6fb0980ab90a9211fb2420d0da7c0.tar.gz
llvm-887d095fb6c6fb0980ab90a9211fb2420d0da7c0.tar.bz2
llvm-887d095fb6c6fb0980ab90a9211fb2420d0da7c0.tar.xz
Fix address calculation error from r155744.
This was exposed by SingleSource/UnitTests/Vector/constpool.c. The computed size of a basic block isn't always a multiple of its known alignment, and that can introduce extra alignment padding after the block. <rdar://problem/11347135> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155845 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMConstantIslandPass.cpp')
-rw-r--r--lib/Target/ARM/ARMConstantIslandPass.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/Target/ARM/ARMConstantIslandPass.cpp b/lib/Target/ARM/ARMConstantIslandPass.cpp
index 3e4e732ddb..10e9da42a9 100644
--- a/lib/Target/ARM/ARMConstantIslandPass.cpp
+++ b/lib/Target/ARM/ARMConstantIslandPass.cpp
@@ -124,7 +124,12 @@ namespace {
/// This number should be used to predict worst case padding when
/// splitting the block.
unsigned internalKnownBits() const {
- return Unalign ? Unalign : KnownBits;
+ unsigned Bits = Unalign ? Unalign : KnownBits;
+ // If the block size isn't a multiple of the known bits, assume the
+ // worst case padding.
+ if (Size & ((1u << Bits) - 1))
+ Bits = CountTrailingZeros_32(Size);
+ return Bits;
}
/// Compute the offset immediately following this block. If LogAlign is