From 8552821e578d693ec14007b21e9468010485ae76 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Mon, 12 Dec 2011 19:25:54 +0000 Subject: [PATCH] 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 --- lib/Target/ARM/ARMConstantIslandPass.cpp | 29 ++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/Target/ARM/ARMConstantIslandPass.cpp b/lib/Target/ARM/ARMConstantIslandPass.cpp index fb8a76d27e9..3bdaa3e3e45 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;