Я пытаюсь написать простой проход в базовом блоке, и код выглядит следующим образом:
struct SimplePass : BasicBlockPass, InstVisitor<SimplePass>
{
... some initialisation and some finalization code
virtual bool runOnBasicBlock(BasicBlock& B) {
std::cout << "---This is a block divider---" << B.size() << std::endl;
visit(B);
return false;
}
void visitInstruction(Instruction& I){
std::cout << "Visiting every single instruction:" << I.getOpcodeName(I.getOpcode()) << std::endl;
}
void visitBranchInst(BranchInst& I) {
if(I.isUnconditional()) {
std::cout << "Encountered an unconditional branch!" << std::endl;
}
}
}
и очень странно я получаю такой вывод:
...
---This is a block divider---5
Visiting every single instruction:call
Visiting every single instruction:load
Visiting every single instruction:add
Visiting every single instruction:store
Encountered an unconditional branch!
---This is a block divider---7
Visiting every single instruction:phi
Visiting every single instruction:load
Visiting every single instruction:sub
Visiting every single instruction:call
Visiting every single instruction:load
Visiting every single instruction:icmp
---This is a block divider---3
......
Легко заметить, что в обоих блоках выше фактическое количество инструкций должно быть 5 и 7, однако функция visitInstrucion иногда не посещает последнюю инструкцию базового блока, почему это происходит? Это должно произойти?