29 cl::desc(
"Restrict range of loopN instructions (testing only)"));
38 bool runOnMachineFunction(MachineFunction &MF)
override;
40 MachineFunctionProperties getRequiredProperties()
const override {
41 return MachineFunctionProperties().setNoVRegs();
44 StringRef getPassName()
const override {
45 return "Hexagon Hardware Loop Fixup";
48 void getAnalysisUsage(AnalysisUsage &AU)
const override {
57 bool fixupLoopInstrs(MachineFunction &MF);
61 void useExtLoopInstr(MachineFunction &MF,
65 char HexagonFixupHwLoops::ID = 0;
69 "Hexagon Hardware Loops Fixup",
false,
false)
72 return new HexagonFixupHwLoops();
77 return MI.getOpcode() == Hexagon::J2_loop0r ||
78 MI.getOpcode() == Hexagon::J2_loop0i ||
79 MI.getOpcode() == Hexagon::J2_loop1r ||
80 MI.getOpcode() == Hexagon::J2_loop1i;
86 return fixupLoopInstrs(MF);
97bool HexagonFixupHwLoops::fixupLoopInstrs(MachineFunction &MF) {
100 unsigned InstOffset = 0;
102 DenseMap<const MachineBasicBlock *, unsigned> BlockToInstOffset;
104 const HexagonInstrInfo *HII =
105 static_cast<const HexagonInstrInfo *
>(MF.
getSubtarget().getInstrInfo());
108 for (
const MachineBasicBlock &
MBB : MF) {
116 BlockToInstOffset[&
MBB] = InstOffset;
117 for (
const MachineInstr &
MI :
MBB)
124 for (MachineBasicBlock &
MBB : MF) {
125 InstOffset = BlockToInstOffset[&
MBB];
131 unsigned InstSize = HII->
getSize(*MII);
132 if (MII->isMetaInstruction()) {
137 assert(MII->getOperand(0).isMBB() &&
138 "Expect a basic block as loop operand");
139 MachineBasicBlock *TargetBB = MII->getOperand(0).getMBB();
141 BlockToInstOffset[TargetBB]);
143 useExtLoopInstr(MF, MII);
152 InstOffset += InstSize;
160void HexagonFixupHwLoops::useExtLoopInstr(MachineFunction &MF,
163 MachineBasicBlock *
MBB = MII->getParent();
165 MachineInstrBuilder MIB;
167 switch (MII->getOpcode()) {
168 case Hexagon::J2_loop0r:
169 newOp = Hexagon::J2_loop0rext;
171 case Hexagon::J2_loop0i:
172 newOp = Hexagon::J2_loop0iext;
174 case Hexagon::J2_loop1r:
175 newOp = Hexagon::J2_loop1rext;
177 case Hexagon::J2_loop1i:
178 newOp = Hexagon::J2_loop1iext;
185 for (
unsigned i = 0; i < MII->getNumOperands(); ++i)
186 MIB.
add(MII->getOperand(i));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file defines the DenseMap class.
const HexagonInstrInfo * TII
static cl::opt< unsigned > MaxLoopRange("hexagon-loop-range", cl::Hidden, cl::init(200), cl::desc("Restrict range of loopN instructions (testing only)"))
static bool isHardwareLoop(const MachineInstr &MI)
Returns true if the instruction is a hardware loop instruction.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
FunctionPass class - This class is used to implement most global optimizations.
unsigned getSize(const MachineInstr &MI) const
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
Align getAlignment() const
Return alignment of the basic block.
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & add(const MachineOperand &MO) const
Representation of each machine instruction.
virtual const TargetInstrInfo * getInstrInfo() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
FunctionPass * createHexagonFixupHwLoops()
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
constexpr T AbsoluteDifference(U X, V Y)
Subtract two unsigned integers, X and Y, of type T and return the absolute value of the result.