[llvm] r277431 - AArch64: Consolidate branch inversion logic

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 2 01:30:07 PDT 2016


Author: arsenm
Date: Tue Aug  2 03:30:06 2016
New Revision: 277431

URL: http://llvm.org/viewvc/llvm-project?rev=277431&view=rev
Log:
AArch64: Consolidate branch inversion logic

Modified:
    llvm/trunk/lib/Target/AArch64/AArch64BranchRelaxation.cpp

Modified: llvm/trunk/lib/Target/AArch64/AArch64BranchRelaxation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64BranchRelaxation.cpp?rev=277431&r1=277430&r2=277431&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64BranchRelaxation.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64BranchRelaxation.cpp Tue Aug  2 03:30:06 2016
@@ -73,8 +73,10 @@ class AArch64BranchRelaxation : public M
   MachineBasicBlock *splitBlockBeforeInstr(MachineInstr &MI);
   void adjustBlockOffsets(MachineBasicBlock &MBB);
   bool isBlockInRange(const MachineInstr &MI, const MachineBasicBlock &BB) const;
-  void invertConditionalBranch(MachineInstr &MI) const;
-  unsigned insertInvertedConditionalBranch(MachineBasicBlock &MBB,
+
+  unsigned insertInvertedConditionalBranch(MachineBasicBlock &SrcBB,
+                                           MachineBasicBlock::iterator InsPt,
+                                           const DebugLoc &DL,
                                            const MachineInstr &OldBr,
                                            MachineBasicBlock &NewDestBB) const;
   unsigned insertUnconditionalBranch(MachineBasicBlock &MBB,
@@ -226,7 +228,7 @@ AArch64BranchRelaxation::splitBlockBefor
   // Note the new unconditional branch is not being recorded.
   // There doesn't seem to be meaningful DebugInfo available; this doesn't
   // correspond to anything in the source.
-  BuildMI(OrigBB, DebugLoc(), TII->get(AArch64::B)).addMBB(NewBB);
+  insertUnconditionalBranch(*OrigBB, *NewBB, DebugLoc());
 
   // Insert an entry into BlockInfo to align it properly with the block numbers.
   BlockInfo.insert(BlockInfo.begin() + NewBB->getNumber(), BasicBlockInfo());
@@ -315,25 +317,19 @@ static inline void invertBccCondition(Ma
   CCOp.setImm(AArch64CC::getInvertedCondCode(CC));
 }
 
-/// Invert the branch condition of \p MI and change the destination to \p NewB
-void AArch64BranchRelaxation::invertConditionalBranch(MachineInstr &MI) const {
-  MI.setDesc(TII->get(getOppositeConditionOpcode(MI.getOpcode())));
-
-  if (MI.getOpcode() == AArch64::Bcc)
-    invertBccCondition(MI);
-}
-
 /// Insert a conditional branch at the end of \p MBB to \p NewDestBB, using the
 /// inverse condition of branch \p OldBr.
 /// \returns The number of bytes added to the block.
 unsigned AArch64BranchRelaxation::insertInvertedConditionalBranch(
-  MachineBasicBlock &MBB,
+  MachineBasicBlock &SrcMBB,
+  MachineBasicBlock::iterator InsPt,
+  const DebugLoc &DL,
   const MachineInstr &OldBr,
   MachineBasicBlock &NewDestBB) const {
   unsigned OppositeCondOpc = getOppositeConditionOpcode(OldBr.getOpcode());
 
   MachineInstrBuilder MIB =
-    BuildMI(&MBB, OldBr.getDebugLoc(), TII->get(OppositeCondOpc))
+    BuildMI(SrcMBB, InsPt, DL, TII->get(OppositeCondOpc))
     .addOperand(OldBr.getOperand(0));
 
   unsigned Opc = OldBr.getOpcode();
@@ -414,8 +410,13 @@ bool AArch64BranchRelaxation::fixupCondi
         DEBUG(dbgs() << "  Invert condition and swap its destination with "
                      << *BMI);
         changeBranchDestBlock(*BMI, *DestBB);
-        invertConditionalBranch(MI);
-        changeBranchDestBlock(MI, *NewDest);
+
+        int NewSize =
+          insertInvertedConditionalBranch(*MBB, MI.getIterator(),
+                                          MI.getDebugLoc(), MI, *NewDest);
+        int OldSize = TII->getInstSizeInBytes(MI);
+        BlockInfo[MBB->getNumber()].Size += (NewSize - OldSize);
+        MI.eraseFromParent();
         return true;
       }
     }
@@ -447,15 +448,16 @@ bool AArch64BranchRelaxation::fixupCondi
                << ", invert condition and change dest. to BB#"
                << NextBB.getNumber() << '\n');
 
+  unsigned &MBBSize = BlockInfo[MBB->getNumber()].Size;
+
   // Insert a new conditional branch and a new unconditional branch.
-  BlockInfo[MBB->getNumber()].Size
-    += insertInvertedConditionalBranch(*MBB, MI, NextBB);
+  MBBSize += insertInvertedConditionalBranch(*MBB, MBB->end(),
+                                             MI.getDebugLoc(), MI, NextBB);
 
-  BlockInfo[MBB->getNumber()].Size +=
-    insertUnconditionalBranch(*MBB, *DestBB, MI.getDebugLoc());
+  MBBSize += insertUnconditionalBranch(*MBB, *DestBB, MI.getDebugLoc());
 
   // Remove the old conditional branch.  It may or may not still be in MBB.
-  BlockInfo[MBB->getNumber()].Size -= TII->getInstSizeInBytes(MI);
+  MBBSize -= TII->getInstSizeInBytes(MI);
   MI.eraseFromParent();
 
   // Finally, keep the block offsets up to date.




More information about the llvm-commits mailing list