在LLVM中查找指令的后续命令列表

在LLVM中查找指令的后续命令列表,llvm,Llvm,我想获得llvm中每条指令的后续指令列表。如果我理解正确,对于除分支(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; intmain(){ INTA=7; int b=a*2; int

我想获得llvm中每条指令的后续指令列表。如果我理解正确,对于除分支(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;
intmain(){
INTA=7;
int b=a*2;
int x;
if(a<3){
x=10+b;
}否则{
x=20+a;
}
返回b;
}

我得到以下字节码:

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
}
define i32@main()#0{
%1=新南威尔士州mul i32 7,2
%2=icmp slt i32 7,3
br i1%2,标签%3,标签%5
;:3:;preds=%0
%4=添加新南威尔士州i32 10,%1
br标签%7
;:5:;preds=%0
%6=添加新南威尔士州i32 20,7
br标签%7
;:7:;preds=%5,%3
ret i32%1
}
那么说明书呢

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

有2名继任者:

{%4=添加新的i32 10,%1,%6=添加新南威尔士i32 20,7}

我如何从指令中访问后续指令


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

您可以使用上的&methods获得指令可以分支到的基本块。给定一个
BasicBlock*BB
,然后您可以通过访问第一条指令。

非常感谢:)是的,可以。出于好奇,有没有一种方法可以使用迭代器来实现这一点?比如说把所有基本块的指令放在一个向量中,然后遍历它们?