关于BasicBlock中使用的变量

时间:2015-12-04 20:00:59

标签: llvm llvm-ir

我想问一个关于LLVM IR语言的问题。对于基本块,使用的变量总是在使用之前加载,并在使用后存储。两个示例基本块如下:

 %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i8**, align 8
  %i = alloca i32, align 4
  %fact = alloca i32, align 4
  %n = alloca i32, align 4
  store i32 0, i32* %1
  store i32 %argc, i32* %2, align 4
  store i8** %argv, i8*** %3, align 8
  %4 = load i8*** %3, align 8
  %5 = getelementptr inbounds i8** %4, i64 1
  %6 = load i8** %5, align 8
  %7 = call i32 (i8*, ...)* bitcast (i32 (...)* @atoi to i32 (i8*, ...)*)(i8* %6)
  store i32 %7, i32* %n, align 4
  store i32 1, i32* %fact, align 4
  store i32 1, i32* %i, align 4
  br label %8


  %9 = load i32* %i, align 4
  %10 = load i32* %n, align 4
  %11 = icmp sle i32 %9, %10
  br i1 %11, label %12, label %19

对于控制流程,将第一个基本块定义为A,将第二个基本块定义为B,控制流程从A到B。

我想知道,对于%7的用法,程序存储%7到A中的%n指针,并加载%n指向%10的指针来访问它,如:

store i32 %7, i32* %n, align 4

%10 = load i32* %n, align 4

%11 = icmp sle i32 %9, %10

我想知道我是否可以直接使用DROP存储和加载指令,并直接使用值%7,如下所示:

%11 = icmp sle i32 %9, %7

这样好吗?任何人都可以谈论背后的原因吗?

我的描述可能模糊不清。如果你对它有疑问,我可以更清楚地解释一下。

由于

1 个答案:

答案 0 :(得分:0)

可以从其他基本块引用虚拟寄存器。

由于您提供了一个不完整的示例,我可以推测%7是否可以直接用于比较:

如果使用LLVM的opt工具优化代码,则可能无法存储和重新加载寄存器,并且比较将直接使用%7(或取决于值的phi函数)。

您可以尝试mem2reg寄存器传递:

opt -mem2reg <your file>.ll -o <target file>.ll