查找LLVM中指令的后继列表

时间:2017-01-12 04:01:03

标签: llvm

我想获取llvm中每条指令的后继列表。如果我理解正确,除了branch(br)之外的所有指令,后继指令是下一个指令。但是对于分支指令来说有点棘手。

例如,如果我有以下C代码:

int main() {
  int a = 7;
  int b = a * 2;

  int x;
  if (a < 3) {
    x = 10 + b;
  } else {
    x = 20 + a;
  }
  return b;

}

我得到以下ByteCode:

define i32 @main() #0 {
%1 = mul nsw i32 7, 2
%2 = icmp slt i32 7, 3
br i1 %2, label %3, label %5

; <label>:3:                                      ; preds = %0
%4 = add nsw i32 10, %1
br label %7

; <label>:5:                                      ; preds = %0
%6 = add nsw i32 20, 7
br label %7

; <label>:7:                                      ; preds = %5, %3
ret i32 %1
}

所以说明

  

br i1%2,标签%3,标签%5

有两个接班人:

  

{%4 =添加新的i32 10,%1,%6 =添加nsw i32 20,7}

如何从指令中访问后继者?

注意:我实际上要做的是消除死代码。我知道llvm在实时分析库中有一些方法,比如IsInstructionTriviallyDead()。出于练习目的,我不打算使用它们。

1 个答案:

答案 0 :(得分:2)

您可以使用getSuccessor(unsigned) & getNumSuccessors() methods on BranchInst获取指令可以分支到的基本块。给定BasicBlock *BB,您可以通过BB->front()访问第一条指令。