我目前正在为'llvm-ir'构建静态分析器并处理分支指令。分支指令的“条件”似乎是比较指令的结果,或者是比较指令的某些逻辑运算的结果,看起来像
%cmp1377 = icmp sgt i32 %length, 0
br i1 %cmp1377, label %for.cond14.preheader.lr.ph, label %for.cond.cleanup
或者可能喜欢
%cmp2 = icmp slt i32 %rem, %div1
%cmp3 = icmp slt i32 %div, %div1
%or.cond = or i1 %cmp2, %cmp3
br i1 %or.cond, label %if.then9, label %lor.lhs.false4
但我不确定LLVM-IR是否仅使用比较值,或者它也可能只使用原始整数值。是否有任何文档可以找到它如何构造分支指令的条件?
答案 0 :(得分:1)
br
指令的条件可以是i1
类型的任何值,无论它来自全局变量的比较,逻辑运算还是load
。
clang
可以生成任何此类指令。例如,代码:
int f1(bool* a){
if ( *a ){
return 12;
}else{
return 15;
}
}
它生成以下llvm-ir:
define i32 @f(bool*)(i8* %a) #0 {
%1 = alloca i32, align 4
%2 = alloca i8*, align 8
store i8* %a, i8** %2, align 8
%3 = load i8*, i8** %2, align 8
%4 = load i8, i8* %3, align 1
%5 = trunc i8 %4 to i1 ;;condition value
br i1 %5, label %6, label %7 ;;br instruction
; <label>:6
store i32 12, i32* %1
br label %8
; <label>:7
store i32 15, i32* %1
br label %8
; <label>:8
%9 = load i32, i32* %1
ret i32 %9
}