OSDN Git Service

Add a postOffset() alignment argument.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 12 Dec 2011 19:25:54 +0000 (19:25 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 12 Dec 2011 19:25:54 +0000 (19:25 +0000)
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

index fb8a76d..3bdaa3e 100644 (file)
@@ -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;