12cab237bSDimitry Andric //===- BranchRelaxation.cpp -----------------------------------------------===// 2d88c1a5aSDimitry Andric // 3d88c1a5aSDimitry Andric // The LLVM Compiler Infrastructure 4d88c1a5aSDimitry Andric // 5d88c1a5aSDimitry Andric // This file is distributed under the University of Illinois Open Source 6d88c1a5aSDimitry Andric // License. See LICENSE.TXT for details. 7d88c1a5aSDimitry Andric // 8d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===// 9d88c1a5aSDimitry Andric 10d88c1a5aSDimitry Andric #include "llvm/ADT/SmallVector.h" 11d88c1a5aSDimitry Andric #include "llvm/ADT/Statistic.h" 12d88c1a5aSDimitry Andric #include "llvm/CodeGen/LivePhysRegs.h" 132cab237bSDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h" 142cab237bSDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 15d88c1a5aSDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 162cab237bSDimitry Andric #include "llvm/CodeGen/MachineInstr.h" 17d88c1a5aSDimitry Andric #include "llvm/CodeGen/RegisterScavenging.h" 182cab237bSDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h" 192cab237bSDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h" 202cab237bSDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h" 212cab237bSDimitry Andric #include "llvm/IR/DebugLoc.h" 222cab237bSDimitry Andric #include "llvm/Pass.h" 232cab237bSDimitry Andric #include "llvm/Support/Compiler.h" 24d88c1a5aSDimitry Andric #include "llvm/Support/Debug.h" 25d88c1a5aSDimitry Andric #include "llvm/Support/Format.h" 262cab237bSDimitry Andric #include "llvm/Support/MathExtras.h" 27d88c1a5aSDimitry Andric #include "llvm/Support/raw_ostream.h" 282cab237bSDimitry Andric #include <cassert> 292cab237bSDimitry Andric #include <cstdint> 302cab237bSDimitry Andric #include <iterator> 312cab237bSDimitry Andric #include <memory> 32d88c1a5aSDimitry Andric 33d88c1a5aSDimitry Andric using namespace llvm; 34d88c1a5aSDimitry Andric 35d88c1a5aSDimitry Andric #define DEBUG_TYPE "branch-relaxation" 36d88c1a5aSDimitry Andric 37d88c1a5aSDimitry Andric STATISTIC(NumSplit, "Number of basic blocks split"); 38d88c1a5aSDimitry Andric STATISTIC(NumConditionalRelaxed, "Number of conditional branches relaxed"); 39d88c1a5aSDimitry Andric STATISTIC(NumUnconditionalRelaxed, "Number of unconditional branches relaxed"); 40d88c1a5aSDimitry Andric 41d88c1a5aSDimitry Andric #define BRANCH_RELAX_NAME "Branch relaxation pass" 42d88c1a5aSDimitry Andric 43d88c1a5aSDimitry Andric namespace { 442cab237bSDimitry Andric 45d88c1a5aSDimitry Andric class BranchRelaxation : public MachineFunctionPass { 46d88c1a5aSDimitry Andric /// BasicBlockInfo - Information about the offset and size of a single 47d88c1a5aSDimitry Andric /// basic block. 48d88c1a5aSDimitry Andric struct BasicBlockInfo { 49d88c1a5aSDimitry Andric /// Offset - Distance from the beginning of the function to the beginning 50d88c1a5aSDimitry Andric /// of this basic block. 51d88c1a5aSDimitry Andric /// 52d88c1a5aSDimitry Andric /// The offset is always aligned as required by the basic block. 532cab237bSDimitry Andric unsigned Offset = 0; 54d88c1a5aSDimitry Andric 55d88c1a5aSDimitry Andric /// Size - Size of the basic block in bytes. If the block contains 56d88c1a5aSDimitry Andric /// inline assembly, this is a worst case estimate. 57d88c1a5aSDimitry Andric /// 58d88c1a5aSDimitry Andric /// The size does not include any alignment padding whether from the 59d88c1a5aSDimitry Andric /// beginning of the block, or from an aligned jump table at the end. 602cab237bSDimitry Andric unsigned Size = 0; 61d88c1a5aSDimitry Andric 622cab237bSDimitry Andric BasicBlockInfo() = default; 63d88c1a5aSDimitry Andric 64d88c1a5aSDimitry Andric /// Compute the offset immediately following this block. \p MBB is the next 65d88c1a5aSDimitry Andric /// block. 66d88c1a5aSDimitry Andric unsigned postOffset(const MachineBasicBlock &MBB) const { 67d88c1a5aSDimitry Andric unsigned PO = Offset + Size; 68d88c1a5aSDimitry Andric unsigned Align = MBB.getAlignment(); 69d88c1a5aSDimitry Andric if (Align == 0) 70d88c1a5aSDimitry Andric return PO; 71d88c1a5aSDimitry Andric 72d88c1a5aSDimitry Andric unsigned AlignAmt = 1 << Align; 73d88c1a5aSDimitry Andric unsigned ParentAlign = MBB.getParent()->getAlignment(); 74d88c1a5aSDimitry Andric if (Align <= ParentAlign) 75d88c1a5aSDimitry Andric return PO + OffsetToAlignment(PO, AlignAmt); 76d88c1a5aSDimitry Andric 77d88c1a5aSDimitry Andric // The alignment of this MBB is larger than the function's alignment, so we 78d88c1a5aSDimitry Andric // can't tell whether or not it will insert nops. Assume that it will. 79d88c1a5aSDimitry Andric return PO + AlignAmt + OffsetToAlignment(PO, AlignAmt); 80d88c1a5aSDimitry Andric } 81d88c1a5aSDimitry Andric }; 82d88c1a5aSDimitry Andric 83d88c1a5aSDimitry Andric SmallVector<BasicBlockInfo, 16> BlockInfo; 84d88c1a5aSDimitry Andric std::unique_ptr<RegScavenger> RS; 85d88c1a5aSDimitry Andric LivePhysRegs LiveRegs; 86d88c1a5aSDimitry Andric 87d88c1a5aSDimitry Andric MachineFunction *MF; 88d88c1a5aSDimitry Andric const TargetRegisterInfo *TRI; 89d88c1a5aSDimitry Andric const TargetInstrInfo *TII; 90d88c1a5aSDimitry Andric 91d88c1a5aSDimitry Andric bool relaxBranchInstructions(); 92d88c1a5aSDimitry Andric void scanFunction(); 93d88c1a5aSDimitry Andric 94d88c1a5aSDimitry Andric MachineBasicBlock *createNewBlockAfter(MachineBasicBlock &BB); 95d88c1a5aSDimitry Andric 96d88c1a5aSDimitry Andric MachineBasicBlock *splitBlockBeforeInstr(MachineInstr &MI, 97d88c1a5aSDimitry Andric MachineBasicBlock *DestBB); 98d88c1a5aSDimitry Andric void adjustBlockOffsets(MachineBasicBlock &MBB); 99d88c1a5aSDimitry Andric bool isBlockInRange(const MachineInstr &MI, const MachineBasicBlock &BB) const; 100d88c1a5aSDimitry Andric 101d88c1a5aSDimitry Andric bool fixupConditionalBranch(MachineInstr &MI); 102d88c1a5aSDimitry Andric bool fixupUnconditionalBranch(MachineInstr &MI); 103d88c1a5aSDimitry Andric uint64_t computeBlockSize(const MachineBasicBlock &MBB) const; 104d88c1a5aSDimitry Andric unsigned getInstrOffset(const MachineInstr &MI) const; 105d88c1a5aSDimitry Andric void dumpBBs(); 106d88c1a5aSDimitry Andric void verify(); 107d88c1a5aSDimitry Andric 108d88c1a5aSDimitry Andric public: 109d88c1a5aSDimitry Andric static char ID; 1102cab237bSDimitry Andric 111d88c1a5aSDimitry Andric BranchRelaxation() : MachineFunctionPass(ID) {} 112d88c1a5aSDimitry Andric 113d88c1a5aSDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 114d88c1a5aSDimitry Andric 1152cab237bSDimitry Andric StringRef getPassName() const override { return BRANCH_RELAX_NAME; } 116d88c1a5aSDimitry Andric }; 117d88c1a5aSDimitry Andric 1182cab237bSDimitry Andric } // end anonymous namespace 119d88c1a5aSDimitry Andric 120d88c1a5aSDimitry Andric char BranchRelaxation::ID = 0; 1212cab237bSDimitry Andric 122d88c1a5aSDimitry Andric char &llvm::BranchRelaxationPassID = BranchRelaxation::ID; 123d88c1a5aSDimitry Andric 124d88c1a5aSDimitry Andric INITIALIZE_PASS(BranchRelaxation, DEBUG_TYPE, BRANCH_RELAX_NAME, false, false) 125d88c1a5aSDimitry Andric 126d88c1a5aSDimitry Andric /// verify - check BBOffsets, BBSizes, alignment of islands 127d88c1a5aSDimitry Andric void BranchRelaxation::verify() { 128d88c1a5aSDimitry Andric #ifndef NDEBUG 129d88c1a5aSDimitry Andric unsigned PrevNum = MF->begin()->getNumber(); 130d88c1a5aSDimitry Andric for (MachineBasicBlock &MBB : *MF) { 131d88c1a5aSDimitry Andric unsigned Align = MBB.getAlignment(); 132d88c1a5aSDimitry Andric unsigned Num = MBB.getNumber(); 133d88c1a5aSDimitry Andric assert(BlockInfo[Num].Offset % (1u << Align) == 0); 134d88c1a5aSDimitry Andric assert(!Num || BlockInfo[PrevNum].postOffset(MBB) <= BlockInfo[Num].Offset); 135d88c1a5aSDimitry Andric assert(BlockInfo[Num].Size == computeBlockSize(MBB)); 136d88c1a5aSDimitry Andric PrevNum = Num; 137d88c1a5aSDimitry Andric } 138d88c1a5aSDimitry Andric #endif 139d88c1a5aSDimitry Andric } 140d88c1a5aSDimitry Andric 1417a7e6055SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 142d88c1a5aSDimitry Andric /// print block size and offset information - debugging 1437a7e6055SDimitry Andric LLVM_DUMP_METHOD void BranchRelaxation::dumpBBs() { 144d88c1a5aSDimitry Andric for (auto &MBB : *MF) { 145d88c1a5aSDimitry Andric const BasicBlockInfo &BBI = BlockInfo[MBB.getNumber()]; 1462cab237bSDimitry Andric dbgs() << format("%bb.%u\toffset=%08x\t", MBB.getNumber(), BBI.Offset) 147d88c1a5aSDimitry Andric << format("size=%#x\n", BBI.Size); 148d88c1a5aSDimitry Andric } 149d88c1a5aSDimitry Andric } 1507a7e6055SDimitry Andric #endif 151d88c1a5aSDimitry Andric 152d88c1a5aSDimitry Andric /// scanFunction - Do the initial scan of the function, building up 153d88c1a5aSDimitry Andric /// information about each block. 154d88c1a5aSDimitry Andric void BranchRelaxation::scanFunction() { 155d88c1a5aSDimitry Andric BlockInfo.clear(); 156d88c1a5aSDimitry Andric BlockInfo.resize(MF->getNumBlockIDs()); 157d88c1a5aSDimitry Andric 158d88c1a5aSDimitry Andric // First thing, compute the size of all basic blocks, and see if the function 159d88c1a5aSDimitry Andric // has any inline assembly in it. If so, we have to be conservative about 160d88c1a5aSDimitry Andric // alignment assumptions, as we don't know for sure the size of any 161d88c1a5aSDimitry Andric // instructions in the inline assembly. 162d88c1a5aSDimitry Andric for (MachineBasicBlock &MBB : *MF) 163d88c1a5aSDimitry Andric BlockInfo[MBB.getNumber()].Size = computeBlockSize(MBB); 164d88c1a5aSDimitry Andric 165d88c1a5aSDimitry Andric // Compute block offsets and known bits. 166d88c1a5aSDimitry Andric adjustBlockOffsets(*MF->begin()); 167d88c1a5aSDimitry Andric } 168d88c1a5aSDimitry Andric 169d88c1a5aSDimitry Andric /// computeBlockSize - Compute the size for MBB. 170d88c1a5aSDimitry Andric uint64_t BranchRelaxation::computeBlockSize(const MachineBasicBlock &MBB) const { 171d88c1a5aSDimitry Andric uint64_t Size = 0; 172d88c1a5aSDimitry Andric for (const MachineInstr &MI : MBB) 173d88c1a5aSDimitry Andric Size += TII->getInstSizeInBytes(MI); 174d88c1a5aSDimitry Andric return Size; 175d88c1a5aSDimitry Andric } 176d88c1a5aSDimitry Andric 177d88c1a5aSDimitry Andric /// getInstrOffset - Return the current offset of the specified machine 178d88c1a5aSDimitry Andric /// instruction from the start of the function. This offset changes as stuff is 179d88c1a5aSDimitry Andric /// moved around inside the function. 180d88c1a5aSDimitry Andric unsigned BranchRelaxation::getInstrOffset(const MachineInstr &MI) const { 181d88c1a5aSDimitry Andric const MachineBasicBlock *MBB = MI.getParent(); 182d88c1a5aSDimitry Andric 183d88c1a5aSDimitry Andric // The offset is composed of two things: the sum of the sizes of all MBB's 184d88c1a5aSDimitry Andric // before this instruction's block, and the offset from the start of the block 185d88c1a5aSDimitry Andric // it is in. 186d88c1a5aSDimitry Andric unsigned Offset = BlockInfo[MBB->getNumber()].Offset; 187d88c1a5aSDimitry Andric 188d88c1a5aSDimitry Andric // Sum instructions before MI in MBB. 189d88c1a5aSDimitry Andric for (MachineBasicBlock::const_iterator I = MBB->begin(); &*I != &MI; ++I) { 190d88c1a5aSDimitry Andric assert(I != MBB->end() && "Didn't find MI in its own basic block?"); 191d88c1a5aSDimitry Andric Offset += TII->getInstSizeInBytes(*I); 192d88c1a5aSDimitry Andric } 193d88c1a5aSDimitry Andric 194d88c1a5aSDimitry Andric return Offset; 195d88c1a5aSDimitry Andric } 196d88c1a5aSDimitry Andric 197d88c1a5aSDimitry Andric void BranchRelaxation::adjustBlockOffsets(MachineBasicBlock &Start) { 198d88c1a5aSDimitry Andric unsigned PrevNum = Start.getNumber(); 199d88c1a5aSDimitry Andric for (auto &MBB : make_range(MachineFunction::iterator(Start), MF->end())) { 200d88c1a5aSDimitry Andric unsigned Num = MBB.getNumber(); 201d88c1a5aSDimitry Andric if (!Num) // block zero is never changed from offset zero. 202d88c1a5aSDimitry Andric continue; 203d88c1a5aSDimitry Andric // Get the offset and known bits at the end of the layout predecessor. 204d88c1a5aSDimitry Andric // Include the alignment of the current block. 205d88c1a5aSDimitry Andric BlockInfo[Num].Offset = BlockInfo[PrevNum].postOffset(MBB); 206d88c1a5aSDimitry Andric 207d88c1a5aSDimitry Andric PrevNum = Num; 208d88c1a5aSDimitry Andric } 209d88c1a5aSDimitry Andric } 210d88c1a5aSDimitry Andric 211d88c1a5aSDimitry Andric /// Insert a new empty basic block and insert it after \BB 212d88c1a5aSDimitry Andric MachineBasicBlock *BranchRelaxation::createNewBlockAfter(MachineBasicBlock &BB) { 213d88c1a5aSDimitry Andric // Create a new MBB for the code after the OrigBB. 214d88c1a5aSDimitry Andric MachineBasicBlock *NewBB = 215d88c1a5aSDimitry Andric MF->CreateMachineBasicBlock(BB.getBasicBlock()); 216d88c1a5aSDimitry Andric MF->insert(++BB.getIterator(), NewBB); 217d88c1a5aSDimitry Andric 218d88c1a5aSDimitry Andric // Insert an entry into BlockInfo to align it properly with the block numbers. 219d88c1a5aSDimitry Andric BlockInfo.insert(BlockInfo.begin() + NewBB->getNumber(), BasicBlockInfo()); 220d88c1a5aSDimitry Andric 221d88c1a5aSDimitry Andric return NewBB; 222d88c1a5aSDimitry Andric } 223d88c1a5aSDimitry Andric 224d88c1a5aSDimitry Andric /// Split the basic block containing MI into two blocks, which are joined by 225d88c1a5aSDimitry Andric /// an unconditional branch. Update data structures and renumber blocks to 226d88c1a5aSDimitry Andric /// account for this change and returns the newly created block. 227d88c1a5aSDimitry Andric MachineBasicBlock *BranchRelaxation::splitBlockBeforeInstr(MachineInstr &MI, 228d88c1a5aSDimitry Andric MachineBasicBlock *DestBB) { 229d88c1a5aSDimitry Andric MachineBasicBlock *OrigBB = MI.getParent(); 230d88c1a5aSDimitry Andric 231d88c1a5aSDimitry Andric // Create a new MBB for the code after the OrigBB. 232d88c1a5aSDimitry Andric MachineBasicBlock *NewBB = 233d88c1a5aSDimitry Andric MF->CreateMachineBasicBlock(OrigBB->getBasicBlock()); 234d88c1a5aSDimitry Andric MF->insert(++OrigBB->getIterator(), NewBB); 235d88c1a5aSDimitry Andric 236d88c1a5aSDimitry Andric // Splice the instructions starting with MI over to NewBB. 237d88c1a5aSDimitry Andric NewBB->splice(NewBB->end(), OrigBB, MI.getIterator(), OrigBB->end()); 238d88c1a5aSDimitry Andric 239d88c1a5aSDimitry Andric // Add an unconditional branch from OrigBB to NewBB. 240d88c1a5aSDimitry Andric // Note the new unconditional branch is not being recorded. 241d88c1a5aSDimitry Andric // There doesn't seem to be meaningful DebugInfo available; this doesn't 242d88c1a5aSDimitry Andric // correspond to anything in the source. 243d88c1a5aSDimitry Andric TII->insertUnconditionalBranch(*OrigBB, NewBB, DebugLoc()); 244d88c1a5aSDimitry Andric 245d88c1a5aSDimitry Andric // Insert an entry into BlockInfo to align it properly with the block numbers. 246d88c1a5aSDimitry Andric BlockInfo.insert(BlockInfo.begin() + NewBB->getNumber(), BasicBlockInfo()); 247d88c1a5aSDimitry Andric 248d88c1a5aSDimitry Andric NewBB->transferSuccessors(OrigBB); 249d88c1a5aSDimitry Andric OrigBB->addSuccessor(NewBB); 250d88c1a5aSDimitry Andric OrigBB->addSuccessor(DestBB); 251d88c1a5aSDimitry Andric 252d88c1a5aSDimitry Andric // Cleanup potential unconditional branch to successor block. 253d88c1a5aSDimitry Andric // Note that updateTerminator may change the size of the blocks. 254d88c1a5aSDimitry Andric NewBB->updateTerminator(); 255d88c1a5aSDimitry Andric OrigBB->updateTerminator(); 256d88c1a5aSDimitry Andric 257d88c1a5aSDimitry Andric // Figure out how large the OrigBB is. As the first half of the original 258d88c1a5aSDimitry Andric // block, it cannot contain a tablejump. The size includes 259d88c1a5aSDimitry Andric // the new jump we added. (It should be possible to do this without 260d88c1a5aSDimitry Andric // recounting everything, but it's very confusing, and this is rarely 261d88c1a5aSDimitry Andric // executed.) 262d88c1a5aSDimitry Andric BlockInfo[OrigBB->getNumber()].Size = computeBlockSize(*OrigBB); 263d88c1a5aSDimitry Andric 264d88c1a5aSDimitry Andric // Figure out how large the NewMBB is. As the second half of the original 265d88c1a5aSDimitry Andric // block, it may contain a tablejump. 266d88c1a5aSDimitry Andric BlockInfo[NewBB->getNumber()].Size = computeBlockSize(*NewBB); 267d88c1a5aSDimitry Andric 268d88c1a5aSDimitry Andric // All BBOffsets following these blocks must be modified. 269d88c1a5aSDimitry Andric adjustBlockOffsets(*OrigBB); 270d88c1a5aSDimitry Andric 271d88c1a5aSDimitry Andric // Need to fix live-in lists if we track liveness. 272d88c1a5aSDimitry Andric if (TRI->trackLivenessAfterRegAlloc(*MF)) 2732cab237bSDimitry Andric computeAndAddLiveIns(LiveRegs, *NewBB); 274d88c1a5aSDimitry Andric 275d88c1a5aSDimitry Andric ++NumSplit; 276d88c1a5aSDimitry Andric 277d88c1a5aSDimitry Andric return NewBB; 278d88c1a5aSDimitry Andric } 279d88c1a5aSDimitry Andric 280d88c1a5aSDimitry Andric /// isBlockInRange - Returns true if the distance between specific MI and 281d88c1a5aSDimitry Andric /// specific BB can fit in MI's displacement field. 282d88c1a5aSDimitry Andric bool BranchRelaxation::isBlockInRange( 283d88c1a5aSDimitry Andric const MachineInstr &MI, const MachineBasicBlock &DestBB) const { 284d88c1a5aSDimitry Andric int64_t BrOffset = getInstrOffset(MI); 285d88c1a5aSDimitry Andric int64_t DestOffset = BlockInfo[DestBB.getNumber()].Offset; 286d88c1a5aSDimitry Andric 287d88c1a5aSDimitry Andric if (TII->isBranchOffsetInRange(MI.getOpcode(), DestOffset - BrOffset)) 288d88c1a5aSDimitry Andric return true; 289d88c1a5aSDimitry Andric 2902cab237bSDimitry Andric DEBUG(dbgs() << "Out of range branch to destination " 2912cab237bSDimitry Andric << printMBBReference(DestBB) << " from " 2922cab237bSDimitry Andric << printMBBReference(*MI.getParent()) << " to " << DestOffset 2932cab237bSDimitry Andric << " offset " << DestOffset - BrOffset << '\t' << MI); 294d88c1a5aSDimitry Andric 295d88c1a5aSDimitry Andric return false; 296d88c1a5aSDimitry Andric } 297d88c1a5aSDimitry Andric 298d88c1a5aSDimitry Andric /// fixupConditionalBranch - Fix up a conditional branch whose destination is 299d88c1a5aSDimitry Andric /// too far away to fit in its displacement field. It is converted to an inverse 300d88c1a5aSDimitry Andric /// conditional branch + an unconditional branch to the destination. 301d88c1a5aSDimitry Andric bool BranchRelaxation::fixupConditionalBranch(MachineInstr &MI) { 302d88c1a5aSDimitry Andric DebugLoc DL = MI.getDebugLoc(); 303d88c1a5aSDimitry Andric MachineBasicBlock *MBB = MI.getParent(); 304d88c1a5aSDimitry Andric MachineBasicBlock *TBB = nullptr, *FBB = nullptr; 305d88c1a5aSDimitry Andric SmallVector<MachineOperand, 4> Cond; 306d88c1a5aSDimitry Andric 307d88c1a5aSDimitry Andric bool Fail = TII->analyzeBranch(*MBB, TBB, FBB, Cond); 308d88c1a5aSDimitry Andric assert(!Fail && "branches to be relaxed must be analyzable"); 309d88c1a5aSDimitry Andric (void)Fail; 310d88c1a5aSDimitry Andric 311d88c1a5aSDimitry Andric // Add an unconditional branch to the destination and invert the branch 312d88c1a5aSDimitry Andric // condition to jump over it: 313d88c1a5aSDimitry Andric // tbz L1 314d88c1a5aSDimitry Andric // => 315d88c1a5aSDimitry Andric // tbnz L2 316d88c1a5aSDimitry Andric // b L1 317d88c1a5aSDimitry Andric // L2: 318d88c1a5aSDimitry Andric 319d88c1a5aSDimitry Andric if (FBB && isBlockInRange(MI, *FBB)) { 320d88c1a5aSDimitry Andric // Last MI in the BB is an unconditional branch. We can simply invert the 321d88c1a5aSDimitry Andric // condition and swap destinations: 322d88c1a5aSDimitry Andric // beq L1 323d88c1a5aSDimitry Andric // b L2 324d88c1a5aSDimitry Andric // => 325d88c1a5aSDimitry Andric // bne L2 326d88c1a5aSDimitry Andric // b L1 327d88c1a5aSDimitry Andric DEBUG(dbgs() << " Invert condition and swap " 328d88c1a5aSDimitry Andric "its destination with " << MBB->back()); 329d88c1a5aSDimitry Andric 330d88c1a5aSDimitry Andric TII->reverseBranchCondition(Cond); 331d88c1a5aSDimitry Andric int OldSize = 0, NewSize = 0; 332d88c1a5aSDimitry Andric TII->removeBranch(*MBB, &OldSize); 333d88c1a5aSDimitry Andric TII->insertBranch(*MBB, FBB, TBB, Cond, DL, &NewSize); 334d88c1a5aSDimitry Andric 335d88c1a5aSDimitry Andric BlockInfo[MBB->getNumber()].Size += (NewSize - OldSize); 336d88c1a5aSDimitry Andric return true; 337d88c1a5aSDimitry Andric } else if (FBB) { 338d88c1a5aSDimitry Andric // We need to split the basic block here to obtain two long-range 339d88c1a5aSDimitry Andric // unconditional branches. 340d88c1a5aSDimitry Andric auto &NewBB = *MF->CreateMachineBasicBlock(MBB->getBasicBlock()); 341d88c1a5aSDimitry Andric MF->insert(++MBB->getIterator(), &NewBB); 342d88c1a5aSDimitry Andric 343d88c1a5aSDimitry Andric // Insert an entry into BlockInfo to align it properly with the block 344d88c1a5aSDimitry Andric // numbers. 345d88c1a5aSDimitry Andric BlockInfo.insert(BlockInfo.begin() + NewBB.getNumber(), BasicBlockInfo()); 346d88c1a5aSDimitry Andric 347d88c1a5aSDimitry Andric unsigned &NewBBSize = BlockInfo[NewBB.getNumber()].Size; 348d88c1a5aSDimitry Andric int NewBrSize; 349d88c1a5aSDimitry Andric TII->insertUnconditionalBranch(NewBB, FBB, DL, &NewBrSize); 350d88c1a5aSDimitry Andric NewBBSize += NewBrSize; 351d88c1a5aSDimitry Andric 352d88c1a5aSDimitry Andric // Update the successor lists according to the transformation to follow. 353d88c1a5aSDimitry Andric // Do it here since if there's no split, no update is needed. 354d88c1a5aSDimitry Andric MBB->replaceSuccessor(FBB, &NewBB); 355d88c1a5aSDimitry Andric NewBB.addSuccessor(FBB); 356302affcbSDimitry Andric 357302affcbSDimitry Andric // Need to fix live-in lists if we track liveness. 358302affcbSDimitry Andric if (TRI->trackLivenessAfterRegAlloc(*MF)) 3592cab237bSDimitry Andric computeAndAddLiveIns(LiveRegs, NewBB); 360d88c1a5aSDimitry Andric } 361d88c1a5aSDimitry Andric 362d88c1a5aSDimitry Andric // We now have an appropriate fall-through block in place (either naturally or 363d88c1a5aSDimitry Andric // just created), so we can invert the condition. 364d88c1a5aSDimitry Andric MachineBasicBlock &NextBB = *std::next(MachineFunction::iterator(MBB)); 365d88c1a5aSDimitry Andric 3662cab237bSDimitry Andric DEBUG(dbgs() << " Insert B to " << printMBBReference(*TBB) 3672cab237bSDimitry Andric << ", invert condition and change dest. to " 3682cab237bSDimitry Andric << printMBBReference(NextBB) << '\n'); 369d88c1a5aSDimitry Andric 370d88c1a5aSDimitry Andric unsigned &MBBSize = BlockInfo[MBB->getNumber()].Size; 371d88c1a5aSDimitry Andric 372d88c1a5aSDimitry Andric // Insert a new conditional branch and a new unconditional branch. 373d88c1a5aSDimitry Andric int RemovedSize = 0; 374d88c1a5aSDimitry Andric TII->reverseBranchCondition(Cond); 375d88c1a5aSDimitry Andric TII->removeBranch(*MBB, &RemovedSize); 376d88c1a5aSDimitry Andric MBBSize -= RemovedSize; 377d88c1a5aSDimitry Andric 378d88c1a5aSDimitry Andric int AddedSize = 0; 379d88c1a5aSDimitry Andric TII->insertBranch(*MBB, &NextBB, TBB, Cond, DL, &AddedSize); 380d88c1a5aSDimitry Andric MBBSize += AddedSize; 381d88c1a5aSDimitry Andric 382d88c1a5aSDimitry Andric // Finally, keep the block offsets up to date. 383d88c1a5aSDimitry Andric adjustBlockOffsets(*MBB); 384d88c1a5aSDimitry Andric return true; 385d88c1a5aSDimitry Andric } 386d88c1a5aSDimitry Andric 387d88c1a5aSDimitry Andric bool BranchRelaxation::fixupUnconditionalBranch(MachineInstr &MI) { 388d88c1a5aSDimitry Andric MachineBasicBlock *MBB = MI.getParent(); 389d88c1a5aSDimitry Andric 390d88c1a5aSDimitry Andric unsigned OldBrSize = TII->getInstSizeInBytes(MI); 391d88c1a5aSDimitry Andric MachineBasicBlock *DestBB = TII->getBranchDestBlock(MI); 392d88c1a5aSDimitry Andric 393d88c1a5aSDimitry Andric int64_t DestOffset = BlockInfo[DestBB->getNumber()].Offset; 394d88c1a5aSDimitry Andric int64_t SrcOffset = getInstrOffset(MI); 395d88c1a5aSDimitry Andric 396d88c1a5aSDimitry Andric assert(!TII->isBranchOffsetInRange(MI.getOpcode(), DestOffset - SrcOffset)); 397d88c1a5aSDimitry Andric 398d88c1a5aSDimitry Andric BlockInfo[MBB->getNumber()].Size -= OldBrSize; 399d88c1a5aSDimitry Andric 400d88c1a5aSDimitry Andric MachineBasicBlock *BranchBB = MBB; 401d88c1a5aSDimitry Andric 402d88c1a5aSDimitry Andric // If this was an expanded conditional branch, there is already a single 403d88c1a5aSDimitry Andric // unconditional branch in a block. 404d88c1a5aSDimitry Andric if (!MBB->empty()) { 405d88c1a5aSDimitry Andric BranchBB = createNewBlockAfter(*MBB); 406d88c1a5aSDimitry Andric 407d88c1a5aSDimitry Andric // Add live outs. 408d88c1a5aSDimitry Andric for (const MachineBasicBlock *Succ : MBB->successors()) { 409d88c1a5aSDimitry Andric for (const MachineBasicBlock::RegisterMaskPair &LiveIn : Succ->liveins()) 410d88c1a5aSDimitry Andric BranchBB->addLiveIn(LiveIn); 411d88c1a5aSDimitry Andric } 412d88c1a5aSDimitry Andric 413d88c1a5aSDimitry Andric BranchBB->sortUniqueLiveIns(); 414d88c1a5aSDimitry Andric BranchBB->addSuccessor(DestBB); 415d88c1a5aSDimitry Andric MBB->replaceSuccessor(DestBB, BranchBB); 416d88c1a5aSDimitry Andric } 417d88c1a5aSDimitry Andric 418d88c1a5aSDimitry Andric DebugLoc DL = MI.getDebugLoc(); 419d88c1a5aSDimitry Andric MI.eraseFromParent(); 420d88c1a5aSDimitry Andric BlockInfo[BranchBB->getNumber()].Size += TII->insertIndirectBranch( 421d88c1a5aSDimitry Andric *BranchBB, *DestBB, DL, DestOffset - SrcOffset, RS.get()); 422d88c1a5aSDimitry Andric 423d88c1a5aSDimitry Andric adjustBlockOffsets(*MBB); 424d88c1a5aSDimitry Andric return true; 425d88c1a5aSDimitry Andric } 426d88c1a5aSDimitry Andric 427d88c1a5aSDimitry Andric bool BranchRelaxation::relaxBranchInstructions() { 428d88c1a5aSDimitry Andric bool Changed = false; 429d88c1a5aSDimitry Andric 430d88c1a5aSDimitry Andric // Relaxing branches involves creating new basic blocks, so re-eval 431d88c1a5aSDimitry Andric // end() for termination. 432d88c1a5aSDimitry Andric for (MachineFunction::iterator I = MF->begin(); I != MF->end(); ++I) { 433d88c1a5aSDimitry Andric MachineBasicBlock &MBB = *I; 434d88c1a5aSDimitry Andric 435d88c1a5aSDimitry Andric // Empty block? 436d88c1a5aSDimitry Andric MachineBasicBlock::iterator Last = MBB.getLastNonDebugInstr(); 437d88c1a5aSDimitry Andric if (Last == MBB.end()) 438d88c1a5aSDimitry Andric continue; 439d88c1a5aSDimitry Andric 440d88c1a5aSDimitry Andric // Expand the unconditional branch first if necessary. If there is a 441d88c1a5aSDimitry Andric // conditional branch, this will end up changing the branch destination of 442d88c1a5aSDimitry Andric // it to be over the newly inserted indirect branch block, which may avoid 443d88c1a5aSDimitry Andric // the need to try expanding the conditional branch first, saving an extra 444d88c1a5aSDimitry Andric // jump. 445d88c1a5aSDimitry Andric if (Last->isUnconditionalBranch()) { 446d88c1a5aSDimitry Andric // Unconditional branch destination might be unanalyzable, assume these 447d88c1a5aSDimitry Andric // are OK. 448d88c1a5aSDimitry Andric if (MachineBasicBlock *DestBB = TII->getBranchDestBlock(*Last)) { 449d88c1a5aSDimitry Andric if (!isBlockInRange(*Last, *DestBB)) { 450d88c1a5aSDimitry Andric fixupUnconditionalBranch(*Last); 451d88c1a5aSDimitry Andric ++NumUnconditionalRelaxed; 452d88c1a5aSDimitry Andric Changed = true; 453d88c1a5aSDimitry Andric } 454d88c1a5aSDimitry Andric } 455d88c1a5aSDimitry Andric } 456d88c1a5aSDimitry Andric 457d88c1a5aSDimitry Andric // Loop over the conditional branches. 458d88c1a5aSDimitry Andric MachineBasicBlock::iterator Next; 459d88c1a5aSDimitry Andric for (MachineBasicBlock::iterator J = MBB.getFirstTerminator(); 460d88c1a5aSDimitry Andric J != MBB.end(); J = Next) { 461d88c1a5aSDimitry Andric Next = std::next(J); 462d88c1a5aSDimitry Andric MachineInstr &MI = *J; 463d88c1a5aSDimitry Andric 464d88c1a5aSDimitry Andric if (MI.isConditionalBranch()) { 465d88c1a5aSDimitry Andric MachineBasicBlock *DestBB = TII->getBranchDestBlock(MI); 466d88c1a5aSDimitry Andric if (!isBlockInRange(MI, *DestBB)) { 467d88c1a5aSDimitry Andric if (Next != MBB.end() && Next->isConditionalBranch()) { 468d88c1a5aSDimitry Andric // If there are multiple conditional branches, this isn't an 469d88c1a5aSDimitry Andric // analyzable block. Split later terminators into a new block so 470d88c1a5aSDimitry Andric // each one will be analyzable. 471d88c1a5aSDimitry Andric 472d88c1a5aSDimitry Andric splitBlockBeforeInstr(*Next, DestBB); 473d88c1a5aSDimitry Andric } else { 474d88c1a5aSDimitry Andric fixupConditionalBranch(MI); 475d88c1a5aSDimitry Andric ++NumConditionalRelaxed; 476d88c1a5aSDimitry Andric } 477d88c1a5aSDimitry Andric 478d88c1a5aSDimitry Andric Changed = true; 479d88c1a5aSDimitry Andric 480d88c1a5aSDimitry Andric // This may have modified all of the terminators, so start over. 481d88c1a5aSDimitry Andric Next = MBB.getFirstTerminator(); 482d88c1a5aSDimitry Andric } 483d88c1a5aSDimitry Andric } 484d88c1a5aSDimitry Andric } 485d88c1a5aSDimitry Andric } 486d88c1a5aSDimitry Andric 487d88c1a5aSDimitry Andric return Changed; 488d88c1a5aSDimitry Andric } 489d88c1a5aSDimitry Andric 490d88c1a5aSDimitry Andric bool BranchRelaxation::runOnMachineFunction(MachineFunction &mf) { 491d88c1a5aSDimitry Andric MF = &mf; 492d88c1a5aSDimitry Andric 493d88c1a5aSDimitry Andric DEBUG(dbgs() << "***** BranchRelaxation *****\n"); 494d88c1a5aSDimitry Andric 495d88c1a5aSDimitry Andric const TargetSubtargetInfo &ST = MF->getSubtarget(); 496d88c1a5aSDimitry Andric TII = ST.getInstrInfo(); 497d88c1a5aSDimitry Andric 498d88c1a5aSDimitry Andric TRI = ST.getRegisterInfo(); 499d88c1a5aSDimitry Andric if (TRI->trackLivenessAfterRegAlloc(*MF)) 500d88c1a5aSDimitry Andric RS.reset(new RegScavenger()); 501d88c1a5aSDimitry Andric 502d88c1a5aSDimitry Andric // Renumber all of the machine basic blocks in the function, guaranteeing that 503d88c1a5aSDimitry Andric // the numbers agree with the position of the block in the function. 504d88c1a5aSDimitry Andric MF->RenumberBlocks(); 505d88c1a5aSDimitry Andric 506d88c1a5aSDimitry Andric // Do the initial scan of the function, building up information about the 507d88c1a5aSDimitry Andric // sizes of each block. 508d88c1a5aSDimitry Andric scanFunction(); 509d88c1a5aSDimitry Andric 510d88c1a5aSDimitry Andric DEBUG(dbgs() << " Basic blocks before relaxation\n"; dumpBBs();); 511d88c1a5aSDimitry Andric 512d88c1a5aSDimitry Andric bool MadeChange = false; 513d88c1a5aSDimitry Andric while (relaxBranchInstructions()) 514d88c1a5aSDimitry Andric MadeChange = true; 515d88c1a5aSDimitry Andric 516d88c1a5aSDimitry Andric // After a while, this might be made debug-only, but it is not expensive. 517d88c1a5aSDimitry Andric verify(); 518d88c1a5aSDimitry Andric 519d88c1a5aSDimitry Andric DEBUG(dbgs() << " Basic blocks after relaxation\n\n"; dumpBBs()); 520d88c1a5aSDimitry Andric 521d88c1a5aSDimitry Andric BlockInfo.clear(); 522d88c1a5aSDimitry Andric 523d88c1a5aSDimitry Andric return MadeChange; 524d88c1a5aSDimitry Andric } 525