【问题标题】:llvm: visitInstruction does not visit every instruction in a basic block?llvm:visitInstruction 不会访问基本块中的每条指令?
【发布时间】: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


【解决方案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 !最后一行来自您的void visitBranchInst(BranchInst&amp; I),它优先于visitInstruction。更具体的访问者优先于更一般的访问者。如果您希望无论如何都调用visitInstruction,您必须从更具体的访问者那里明确地执行此操作 - 它不会自动发生。

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

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2012-03-14
    相关资源
    最近更新 更多