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 MachineFunctionProperties::Property::NoVRegs);
61 return "AArch64 Compress Jump Tables";
64char AArch64CompressJumpTables::ID = 0;
68 "AArch64 compress jump tables pass",
false,
false)
77 if (
MI.getOpcode() == AArch64::INLINEASM ||
78 MI.getOpcode() == AArch64::INLINEASM_BR)
85bool AArch64CompressJumpTables::scanFunction() {
94 unsigned OffsetAfterAlignment =
Offset;
96 if (Alignment >
Align(4))
97 OffsetAfterAlignment += Alignment.
value() - 4;
107bool AArch64CompressJumpTables::compressJumpTable(
MachineInstr &
MI,
109 if (
MI.getOpcode() != AArch64::JumpTableDest32)
112 int JTIdx =
MI.getOperand(4).getIndex();
113 auto &JTInfo = *MF->getJumpTableInfo();
120 int MaxOffset = std::numeric_limits<int>::min(),
121 MinOffset = std::numeric_limits<int>::max();
124 int BlockOffset = BlockInfo[
Block->getNumber()];
125 assert(BlockOffset % 4 == 0 &&
"misaligned basic block");
127 MaxOffset = std::max(MaxOffset, BlockOffset);
128 if (BlockOffset <= MinOffset) {
129 MinOffset = BlockOffset;
133 assert(MinBlock &&
"Failed to find minimum offset block");
137 if (!isInt<21>(MinOffset -
Offset)) {
142 int Span = MaxOffset - MinOffset;
144 if (isUInt<8>(Span / 4)) {
146 MI.setDesc(
TII->get(AArch64::JumpTableDest8));
150 if (isUInt<16>(Span / 4)) {
151 AFI->setJumpTableEntryInfo(JTIdx, 2, MinBlock->
getSymbol());
152 MI.setDesc(
TII->get(AArch64::JumpTableDest16));
161bool AArch64CompressJumpTables::runOnMachineFunction(
MachineFunction &MFIn) {
162 bool Changed =
false;
166 TII =
ST.getInstrInfo();
168 if (
ST.force32BitJumpTables() && !MF->getFunction().hasMinSize())
177 Changed |= compressJumpTable(
MI,
Offset);
186 return new AArch64CompressJumpTables();
const HexagonInstrInfo * TII
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
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.
MachineFunctionProperties & set(Property P)
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
Representation of each machine instruction.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
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()
void initializeAArch64CompressJumpTablesPass(PassRegistry &)
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.