分支指令的结构

The structure of a branch instruction

我目前正在为 'llvm-ir' 构建静态分析器并处理分支指令。分支指令的'condition'似乎是比较指令的结果,或者是比较指令的一些逻辑运算的结果,看起来像

 %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 是否只使用比较值或者它也可能只使用原始整数值。有没有我可以找到它如何构造分支指令条件的文档?

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
}