18#define DEBUG_TYPE "arm-bb-utils"
28 switch(
MI->getOpcode()) {
52 BBI.
Size += TII->getInstSizeInBytes(
I);
63 if (!
MBB->empty() &&
MBB->back().getOpcode() == ARM::tBR_JTr) {
65 MBB->getParent()->ensureAlignment(
Align(4));
78 unsigned Offset = BBInfo[
MBB->getNumber()].Offset;
82 assert(
I !=
MBB->end() &&
"Didn't find MI in its own basic block?");
83 Offset += TII->getInstSizeInBytes(*
I);
92 unsigned MaxDisp)
const {
93 unsigned PCAdj = isThumb ? 4 : 8;
95 unsigned DestOffset = BBInfo[DestBB->
getNumber()].Offset;
100 <<
" to " << DestOffset <<
" offset "
101 <<
int(DestOffset - BrOffset) <<
"\t" << *
MI);
103 if (BrOffset <= DestOffset) {
105 if (DestOffset-BrOffset <= MaxDisp)
108 if (BrOffset-DestOffset <= MaxDisp)
116 "Basic block is not a child of the current function.\n");
120 <<
" - name: " << BB->
getName() <<
"\n"
121 <<
" - number: " << BB->
getNumber() <<
"\n"
122 <<
" - function: " << MF.getName() <<
"\n"
123 <<
" - blocks: " << MF.getNumBlockIDs() <<
"\n");
125 for(
unsigned i = BBNum + 1, e = MF.getNumBlockIDs(); i < e; ++i) {
128 const Align Align = MF.getBlockNumbered(i)->getAlignment();
129 const unsigned Offset = BBInfo[i - 1].postOffset(
Align);
140 BBInfo[i].Offset =
Offset;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
bool isBBInRange(MachineInstr *MI, MachineBasicBlock *DestBB, unsigned MaxDisp) const
isBBInRange - Returns true if the distance between specific MI and specific BB can fit in MI's displa...
void adjustBBOffsetsAfter(MachineBasicBlock *MBB)
void computeBlockSize(MachineBasicBlock *MBB)
unsigned getOffsetOf(MachineInstr *MI) const
getOffsetOf - Return the current offset of the specified machine instruction from the start of the fu...
MachineInstrBundleIterator< const MachineInstr > const_iterator
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
Representation of each machine instruction.
This is an optimization pass for GlobalISel generic memory operations.
static bool mayOptimizeThumb2Instruction(const MachineInstr *MI)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
This struct is a compact representation of a valid (non-zero power of two) alignment.
BasicBlockInfo - Information about the offset and size of a single basic block.
unsigned Size
Size - Size of the basic block in bytes.
Align PostAlign
PostAlign - When > 1, the block terminator contains a .align directive, so the end of the block is al...
uint8_t Unalign
Unalign - When non-zero, the block contains instructions (inline asm) of unknown size.