45 const char *getPassName()
const {
return "Hexagon Hardware Loop Fixup"; }
55 static const unsigned MAX_LOOP_DISTANCE = 200;
73 "Hexagon Hardware Loops Fixup",
false,
false)
76 return new HexagonFixupHwLoops();
82 return MI->
getOpcode() == Hexagon::LOOP0_r ||
88 bool Changed = fixupLoopInstrs(MF);
104 unsigned InstOffset = 0;
110 MBB != MBBe; ++MBB) {
111 BlockToInstOffset[MBB] = InstOffset;
112 InstOffset += (MBB->size() * 4);
118 bool Changed =
false;
123 MBB != MBBe; ++MBB) {
124 InstOffset = BlockToInstOffset[MBB];
133 assert(MII->getOperand(0).isMBB() &&
134 "Expect a basic block as loop operand");
135 int Sub = InstOffset - BlockToInstOffset[MII->getOperand(0).getMBB()];
136 unsigned Dist = Sub > 0 ? Sub : -Sub;
137 if (Dist > MAX_LOOP_DISTANCE) {
139 convertLoopInstr(MF, MII, RS);
140 MII = MBB->erase(MII);
167 if (MII->getOperand(1).isReg()) {
169 BuildMI(*MBB, MII, DL, TII->
get(Hexagon::TFCR), Hexagon::LC0)
170 .addReg(MII->getOperand(1).getReg());
173 BuildMI(*MBB, MII, DL, TII->
get(Hexagon::TFRI), Scratch)
174 .addImm(MII->getOperand(1).getImm());
175 BuildMI(*MBB, MII, DL, TII->
get(Hexagon::TFCR), Hexagon::LC0)
179 BuildMI(*MBB, MII, DL, TII->
get(Hexagon::CONST32_Label), Scratch)
180 .addMBB(MII->getOperand(0).getMBB());
181 BuildMI(*MBB, MII, DL, TII->
get(Hexagon::TFCR), Hexagon::SA0)
const MachineFunction * getParent() const
static PassRegistry * getPassRegistry()
void initializeHexagonFixupHwLoopsPass(PassRegistry &)
static bool isHardwareLoop(const MachineInstr *MI)
Returns true if the instruction is a hardware loop instruction.
const HexagonInstrInfo * TII
ID
LLVM Calling Convention Representation.
void forward()
forward - Move the internal MBB iterator and update register states.
FunctionPass * createHexagonFixupHwLoops()
void enterBasicBlock(MachineBasicBlock *mbb)
bundle_iterator< MachineInstr, instr_iterator > iterator
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
const MCInstrDesc & get(unsigned Opcode) const
virtual const TargetInstrInfo * getInstrInfo() const
virtual void getAnalysisUsage(AnalysisUsage &AU) const
const TargetMachine & getTarget() const
BasicBlockListType::iterator iterator
INITIALIZE_PASS(HexagonFixupHwLoops,"hwloopsfixup","Hexagon Hardware Loops Fixup", false, false) FunctionPass *llvm
unsigned scavengeRegister(const TargetRegisterClass *RegClass, MachineBasicBlock::iterator I, int SPAdj)