diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-12-12 19:25:54 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-12-12 19:25:54 +0000 |
commit | 8552821e578d693ec14007b21e9468010485ae76 (patch) | |
tree | dd3f41bffa7577f45eb4ea32467dfe758f2631d2 | |
parent | bd1ec17caf8fc393b112e6c01fe0e9cd7db213ae (diff) | |
download | llvm-8552821e578d693ec14007b21e9468010485ae76.tar.gz llvm-8552821e578d693ec14007b21e9468010485ae76.tar.bz2 llvm-8552821e578d693ec14007b21e9468010485ae76.tar.xz |
Add a postOffset() alignment argument.
This computes the offset of the layout sucessor block, considering its
alignment as well.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146401 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMConstantIslandPass.cpp | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/lib/Target/ARM/ARMConstantIslandPass.cpp b/lib/Target/ARM/ARMConstantIslandPass.cpp index fb8a76d27e..3bdaa3e3e4 100644 --- a/lib/Target/ARM/ARMConstantIslandPass.cpp +++ b/lib/Target/ARM/ARMConstantIslandPass.cpp @@ -142,21 +142,26 @@ namespace { return Unalign ? Unalign : KnownBits; } - /// Compute the offset immediately following this block. - unsigned postOffset() const { + /// Compute the offset immediately following this block. If LogAlign is + /// specified, return the offset the successor block will get if it has + /// this alignment. + unsigned postOffset(unsigned LogAlign = 0) const { unsigned PO = Offset + Size; - if (!PostAlign) + unsigned LA = std::max(unsigned(PostAlign), LogAlign); + if (!LA) return PO; // Add alignment padding from the terminator. - return WorstCaseAlign(PO, PostAlign, internalKnownBits()); + return WorstCaseAlign(PO, LA, internalKnownBits()); } /// Compute the number of known low bits of postOffset. If this block /// contains inline asm, the number of known bits drops to the /// instruction alignment. An aligned terminator may increase the number /// of know bits. - unsigned postKnownBits() const { - return std::max(unsigned(PostAlign), internalKnownBits()); + /// If LogAlign is given, also consider the alignment of the next block. + unsigned postKnownBits(unsigned LogAlign = 0) const { + return std::max(std::max(unsigned(PostAlign), LogAlign), + internalKnownBits()); } }; @@ -1020,14 +1025,10 @@ static bool BBIsJumpedOver(MachineBasicBlock *MBB) { void ARMConstantIslands::AdjustBBOffsetsAfter(MachineBasicBlock *BB) { for(unsigned i = BB->getNumber() + 1, e = MF->getNumBlockIDs(); i < e; ++i) { // Get the offset and known bits at the end of the layout predecessor. - unsigned Offset = BBInfo[i - 1].postOffset(); - unsigned KnownBits = BBInfo[i - 1].postKnownBits(); - - // Add padding before an aligned block. This may teach us more bits. - if (unsigned Align = MF->getBlockNumbered(i)->getAlignment()) { - Offset = WorstCaseAlign(Offset, Align, KnownBits); - KnownBits = std::max(KnownBits, Align); - } + // Include the alignment of the current block. + unsigned LogAlign = MF->getBlockNumbered(i)->getAlignment(); + unsigned Offset = BBInfo[i - 1].postOffset(LogAlign); + unsigned KnownBits = BBInfo[i - 1].postKnownBits(LogAlign); // This is where block i begins. BBInfo[i].Offset = Offset; |