LLVM中的回溯操作和操作数

时间:2016-09-16 07:54:37

标签: llvm llvm-clang llvm-ir

我正在努力分析使用过的说明。鉴于我找到了 一个感兴趣的指令,我想回溯所有使用过的操作和 变量。例如,在LLVM IR中给出以下循环。

%i.01 = phi i32 [ 0, %0 ], [ %4, %2 ]
%3 = icmp eq i32 %i.01, 0
%bar.foobar.i = select i1 %3, void ()* @bar, void ()* @foobar
tail call void %bar.foobar.i() #2
%4 = add nuw nsw i32 %i.01, 1
%exitcond = icmp eq i32 %4, 10
br i1 %exitcond, label %1, label %2

我对最后一个分支中所有涉及的数据感兴趣。在使用涉及变量ICompInst和常量%4的{​​{1}}之前,计算条件一条指令。在使用添加之前计算10一步。依此类推......

鉴于我找到了感兴趣的指令,在这种情况下是%4,我想开始回溯。

BranchInst

要实现这样的算法,我有两个问题。有了分支指令,我怎样才能获得开始回溯的条件? 其次,如何确定在先前的指令中是否使用了该条件?为了更容易理解,我有以下伪代码:

if(BranchInst* BI = dyn_cast<BranchInst>(&I)) {
  if(BI->isConditional()) {
    backtrack(BI, &I);
  }
}

那么我怎样才能实现void backtrack(BranchInst* BI, Instruction* I) { Value* condition = BI->getCondition(); Instruction* prevInst = I; do { prevInst = prev(prevInst); if(prevInst->prevInst(condition)) { backTrackOperand(prevInst->getOperand(0), prevInst); backTrackOperand(prevInst->getOperand(1), prevInst); break; } } while(1); } void backTrackOperand(Value* operand, Instruction* I) { Instruction* prevInst = I; do { prevInst = prev(prevInst); if(prevInst->usesOperand(operand)) { ... } } } getCondition()computesCondition()函数?

1 个答案:

答案 0 :(得分:0)

  • getCondition()是getOperand(0)。
  • 我在代码中没有看到computesCondition()?
  • usesOperand()类似llvm::find_if(prevInst->operands(), [&] (Uses &U) { return isa<Instruction>(&U) && cast<Instruction>(&U) == I; });。但请注意,从条件或任何值,您可以轻松找到所有用途。