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; }