LLVM 20.0.0git
Macros | Functions | Variables
ARMConstantIslandPass.cpp File Reference
#include "ARM.h"
#include "ARMBaseInstrInfo.h"
#include "ARMBasicBlockInfo.h"
#include "ARMMachineFunctionInfo.h"
#include "ARMSubtarget.h"
#include "MCTargetDesc/ARMBaseInfo.h"
#include "MVETailPredUtils.h"
#include "Thumb2InstrInfo.h"
#include "Utils/ARMBaseInfo.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <iterator>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "arm-cp-islands"
 
#define ARM_CP_ISLANDS_OPT_NAME    "ARM constant island placement and branch shortening pass"
 

Functions

 STATISTIC (NumCPEs, "Number of constpool entries")
 
 STATISTIC (NumSplit, "Number of uncond branches inserted")
 
 STATISTIC (NumCBrFixed, "Number of cond branches fixed")
 
 STATISTIC (NumUBrFixed, "Number of uncond branches fixed")
 
 STATISTIC (NumTBs, "Number of table branches generated")
 
 STATISTIC (NumT2CPShrunk, "Number of Thumb2 constantpool instructions shrunk")
 
 STATISTIC (NumT2BrShrunk, "Number of Thumb2 immediate branches shrunk")
 
 STATISTIC (NumCBZ, "Number of CBZ / CBNZ formed")
 
 STATISTIC (NumJTMoved, "Number of jump table destination blocks moved")
 
 STATISTIC (NumJTInserted, "Number of jump table intermediate blocks inserted")
 
 STATISTIC (NumLEInserted, "Number of LE backwards branches inserted")
 
static bool AlignBlocks (MachineFunction *MF, const ARMSubtarget *STI)
 
static bool isAlwaysIndirectTarget (const MachineBasicBlock &MBB)
 
static bool CompareMBBNumbers (const MachineBasicBlock *LHS, const MachineBasicBlock *RHS)
 CompareMBBNumbers - Little predicate function to sort the WaterList by MBB ID.
 
static bool BBIsJumpedOver (MachineBasicBlock *MBB)
 BBIsJumpedOver - Return true of the specified basic block's only predecessor unconditionally branches to its only successor.
 
static unsigned getUnconditionalBrDisp (int Opc)
 getUnconditionalBrDisp - Returns the maximum displacement that can fit in the specific unconditional branch instruction.
 
static bool isSimpleIndexCalc (MachineInstr &I, unsigned EntryReg, unsigned BaseReg)
 
static bool jumpTableFollowsTB (MachineInstr *JTMI, MachineInstr *CPEMI)
 Returns whether CPEMI is the first instruction in the block immediately following JTMI (assumed to be a TBB or TBH terminator).
 
static void RemoveDeadAddBetweenLEAAndJT (MachineInstr *LEAMI, MachineInstr *JumpMI, unsigned &DeadSize)
 

Variables

static cl::opt< boolAdjustJumpTableBlocks ("arm-adjust-jump-tables", cl::Hidden, cl::init(true), cl::desc("Adjust basic block layout to better use TB[BH]"))
 
static cl::opt< unsignedCPMaxIteration ("arm-constant-island-max-iteration", cl::Hidden, cl::init(30), cl::desc("The max number of iteration for converge"))
 
static cl::opt< boolSynthesizeThumb1TBB ("arm-synthesize-thumb-1-tbb", cl::Hidden, cl::init(true), cl::desc("Use compressed jump tables in Thumb-1 by synthesizing an " "equivalent to the TBB/TBH instructions"))
 

Macro Definition Documentation

◆ ARM_CP_ISLANDS_OPT_NAME

#define ARM_CP_ISLANDS_OPT_NAME    "ARM constant island placement and branch shortening pass"

Definition at line 62 of file ARMConstantIslandPass.cpp.

◆ DEBUG_TYPE

#define DEBUG_TYPE   "arm-cp-islands"

Definition at line 60 of file ARMConstantIslandPass.cpp.

Function Documentation

◆ AlignBlocks()

static bool AlignBlocks ( MachineFunction MF,
const ARMSubtarget STI 
)
static

◆ BBIsJumpedOver()

static bool BBIsJumpedOver ( MachineBasicBlock MBB)
static

◆ CompareMBBNumbers()

static bool CompareMBBNumbers ( const MachineBasicBlock LHS,
const MachineBasicBlock RHS 
)
static

CompareMBBNumbers - Little predicate function to sort the WaterList by MBB ID.

Definition at line 967 of file ARMConstantIslandPass.cpp.

References LHS, and RHS.

◆ getUnconditionalBrDisp()

static unsigned getUnconditionalBrDisp ( int  Opc)
inlinestatic

getUnconditionalBrDisp - Returns the maximum displacement that can fit in the specific unconditional branch instruction.

Definition at line 1285 of file ARMConstantIslandPass.cpp.

◆ isAlwaysIndirectTarget()

static bool isAlwaysIndirectTarget ( const MachineBasicBlock MBB)
static

◆ isSimpleIndexCalc()

static bool isSimpleIndexCalc ( MachineInstr I,
unsigned  EntryReg,
unsigned  BaseReg 
)
static

Definition at line 2081 of file ARMConstantIslandPass.cpp.

References I.

◆ jumpTableFollowsTB()

static bool jumpTableFollowsTB ( MachineInstr JTMI,
MachineInstr CPEMI 
)
static

Returns whether CPEMI is the first instruction in the block immediately following JTMI (assumed to be a TBB or TBH terminator).

If so, we can switch the first register to PC and usually remove the address calculation that preceded it.

Definition at line 2186 of file ARMConstantIslandPass.cpp.

References llvm::MachineBasicBlock::begin(), llvm::MachineBasicBlock::empty(), llvm::MachineFunction::end(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineBasicBlock::getParent(), llvm::MachineInstr::getParent(), and MBB.

◆ RemoveDeadAddBetweenLEAAndJT()

static void RemoveDeadAddBetweenLEAAndJT ( MachineInstr LEAMI,
MachineInstr JumpMI,
unsigned DeadSize 
)
static

◆ STATISTIC() [1/11]

STATISTIC ( NumCBrFixed  ,
"Number of cond branches fixed"   
)

◆ STATISTIC() [2/11]

STATISTIC ( NumCBZ  ,
"Number of CBZ / CBNZ formed"   
)

◆ STATISTIC() [3/11]

STATISTIC ( NumCPEs  ,
"Number of constpool entries"   
)

◆ STATISTIC() [4/11]

STATISTIC ( NumJTInserted  ,
"Number of jump table intermediate blocks inserted"   
)

◆ STATISTIC() [5/11]

STATISTIC ( NumJTMoved  ,
"Number of jump table destination blocks moved"   
)

◆ STATISTIC() [6/11]

STATISTIC ( NumLEInserted  ,
"Number of LE backwards branches inserted"   
)

◆ STATISTIC() [7/11]

STATISTIC ( NumSplit  ,
"Number of uncond branches inserted"   
)

◆ STATISTIC() [8/11]

STATISTIC ( NumT2BrShrunk  ,
"Number of Thumb2 immediate branches shrunk"   
)

◆ STATISTIC() [9/11]

STATISTIC ( NumT2CPShrunk  ,
"Number of Thumb2 constantpool instructions shrunk"   
)

◆ STATISTIC() [10/11]

STATISTIC ( NumTBs  ,
"Number of table branches generated"   
)

◆ STATISTIC() [11/11]

STATISTIC ( NumUBrFixed  ,
"Number of uncond branches fixed"   
)

Variable Documentation

◆ AdjustJumpTableBlocks

cl::opt< bool > AdjustJumpTableBlocks("arm-adjust-jump-tables", cl::Hidden, cl::init(true), cl::desc("Adjust basic block layout to better use TB[BH]")) ( "arm-adjust-jump-tables"  ,
cl::Hidden  ,
cl::init(true ,
cl::desc("Adjust basic block layout to better use TB[BH]")   
)
static

◆ CPMaxIteration

cl::opt< unsigned > CPMaxIteration("arm-constant-island-max-iteration", cl::Hidden, cl::init(30), cl::desc("The max number of iteration for converge")) ( "arm-constant-island-max-iteration"  ,
cl::Hidden  ,
cl::init(30)  ,
cl::desc("The max number of iteration for converge")   
)
static

◆ SynthesizeThumb1TBB

cl::opt< bool > SynthesizeThumb1TBB("arm-synthesize-thumb-1-tbb", cl::Hidden, cl::init(true), cl::desc("Use compressed jump tables in Thumb-1 by synthesizing an " "equivalent to the TBB/TBH instructions")) ( "arm-synthesize-thumb-1-tbb"  ,
cl::Hidden  ,
cl::init(true ,
cl::desc("Use compressed jump tables in Thumb-1 by synthesizing an " "equivalent to the TBB/TBH instructions")   
)
static