So why does the code produced in the last exercise contain the labels .LBB0_2 and .LBB0_3 but no .LBB0_1?
Well that is because I have added a code generation pass that deletes useless jumps like:
JNC .LBB0_1
.LBB0_1:
Code snippets:
void HP41MCODEPassConfig::addPreEmitPass() {
addPass(new RemoveUselessJMP()); }
...
bool RemoveUselessJMP::runOnMachineBasicBlock(
MachineBasicBlock &MBB, MachineBasicBlock &MBBN) {
bool Modified = false;
MachineBasicBlock::iterator I = MBB.end();
if (I != MBB.begin())
I--;
else
return Modified;
if (I->getOpcode() == HP41MCODE::JNC &&
I->getOperand(0).getMBB() == &MBBN) {
MBB.erase(I);
Modified = true;
}
return Modified;
}
bool RemoveUselessJMP::runOnMachineFunction(MachineFunction &MF) {
bool Modified = false;
MachineFunction::iterator FJ = MF.begin();
if (FJ != MF.end())
FJ++;
if (FJ == MF.end())
return Modified;
for (MachineFunction::iterator FI = MF.begin(),
FE = MF.end(); FJ != FE; ++FI, ++FJ)
Modified |= runOnMachineBasicBlock(*FI, *FJ);
return Modified;
}