26#define DEBUG_TYPE "aarch64-jump-tables"
28STATISTIC(NumJT8,
"Number of jump-tables with 1-byte entries");
29STATISTIC(NumJT16,
"Number of jump-tables with 2-byte entries");
30STATISTIC(NumJT32,
"Number of jump-tables with 4-byte entries");
58 return "AArch64 Compress Jump Tables";
61char AArch64CompressJumpTables::ID = 0;
65 "AArch64 compress jump tables pass",
false,
false)
74 if (
MI.getOpcode() == AArch64::INLINEASM ||
75 MI.getOpcode() == AArch64::INLINEASM_BR)
82bool AArch64CompressJumpTables::scanFunction() {
84 BlockInfo.resize(MF->getNumBlockIDs());
91 unsigned OffsetAfterAlignment =
Offset;
93 if (Alignment >
Align(4))
94 OffsetAfterAlignment += Alignment.
value() - 4;
104bool AArch64CompressJumpTables::compressJumpTable(
MachineInstr &
MI,
106 if (
MI.getOpcode() != AArch64::JumpTableDest32)
109 int JTIdx =
MI.getOperand(4).getIndex();
110 auto &JTInfo = *MF->getJumpTableInfo();
117 int MaxOffset = std::numeric_limits<int>::min(),
118 MinOffset = std::numeric_limits<int>::max();
121 int BlockOffset = BlockInfo[
Block->getNumber()];
122 assert(BlockOffset % 4 == 0 &&
"misaligned basic block");
124 MaxOffset = std::max(MaxOffset, BlockOffset);
125 if (BlockOffset <= MinOffset) {
126 MinOffset = BlockOffset;
130 assert(MinBlock &&
"Failed to find minimum offset block");
134 if (!isInt<21>(MinOffset -
Offset)) {
139 int Span = MaxOffset - MinOffset;
141 if (isUInt<8>(Span / 4)) {
143 MI.setDesc(
TII->get(AArch64::JumpTableDest8));
147 if (isUInt<16>(Span / 4)) {
148 AFI->setJumpTableEntryInfo(JTIdx, 2, MinBlock->
getSymbol());
149 MI.setDesc(
TII->get(AArch64::JumpTableDest16));
158bool AArch64CompressJumpTables::runOnMachineFunction(
MachineFunction &MFIn) {
159 bool Changed =
false;
163 TII =
ST.getInstrInfo();
165 if (
ST.force32BitJumpTables() && !MF->getFunction().hasMinSize())
174 Changed |= compressJumpTable(
MI,
Offset);
183 return new AArch64CompressJumpTables();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
const HexagonInstrInfo * TII
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static const int BlockSize
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
void setJumpTableEntryInfo(int Idx, unsigned Size, MCSymbol *PCRelSym)
FunctionPass class - This class is used to implement most global optimizations.
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
Align getAlignment() const
Return alignment of the basic block.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
virtual MachineFunctionProperties getRequiredProperties() const
Properties which a MachineFunction may have at a given point in time.
Representation of each machine instruction.
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
FunctionPass * createAArch64CompressJumpTablesPass()
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.
MachineJumpTableEntry - One jump table in the jump table info.