在LLVM中查找指令的后续命令列表
我想获得llvm中每条指令的后续指令列表。如果我理解正确,对于除分支(br)之外的所有指令,后续指令是下一条指令。但是对于分支指令来说有点棘手 例如,如果我有以下C代码:在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
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
,然后您可以通过访问第一条指令。非常感谢:)是的,可以。出于好奇,有没有一种方法可以使用迭代器来实现这一点?比如说把所有基本块的指令放在一个向量中,然后遍历它们?