0

我正在尝试在基本块上编写一个简单的传递,代码如下:

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函数有时不会访问一个基本块的最后一条指令,为什么会出现这种情况呢?这应该发生吗?

4

1 回答 1

1

在第一个块中:

Visiting every single instruction:call
Visiting every single instruction:load
Visiting every single instruction:add
Visiting every single instruction:store
Encountered an unconditional branch!

虽然5!最后一行来自 yourvoid visitBranchInst(BranchInst& I)优先于visitInstruction. 更具体的访问者优先于更一般的访问者。如果您visitInstruction无论如何都想被调用,则必须从更具体的访问者那里明确地进行调用 - 它不会自动发生。

至于下一个块,也许它以一个有条件的分支结束?然后你visitBranchInst不会打印任何东西,也不会传播到visitInstruction.

于 2014-10-24T16:39:58.290 回答