Fix address calculation error from r155744.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 30 Apr 2012 20:19:00 +0000 (20:19 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 30 Apr 2012 20:19:00 +0000 (20:19 +0000)
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

lib/Target/ARM/ARMConstantIslandPass.cpp

index 3e4e732ddb9d497393635533ea899cca2292b297..10e9da42a9448b364f8eb5097b371ebf8bbac9aa 100644 (file)
@@ -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