【发布时间】:2014-10-24 10:40:03
【问题描述】:
我正在尝试在基本块上编写一个简单的传递,代码如下:
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
......
很容易看出上面两个block的实际指令数应该是5和7,但是visitInstrucion函数有时不会访问基本block的最后一条指令,为什么会这样发生?这应该发生吗?
【问题讨论】:
-
您确定块中的最后一条指令不是 TerminatorInst 指令吗? (即不代表实际代码)
-
@JoachimIsaksson 啊哈我以前不知道,谢谢,我想我现在已经解决了这个问题:)
标签: llvm llvm-clang llvm-ir llvm-c++-api