我想问一个关于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
这样好吗?任何人都可以谈论背后的原因吗?
我的描述可能模糊不清。如果你对它有疑问,我可以更清楚地解释一下。
由于
答案 0 :(得分:0)
可以从其他基本块引用虚拟寄存器。
由于您提供了一个不完整的示例,我可以推测%7
是否可以直接用于比较:
如果使用LLVM的opt工具优化代码,则可能无法存储和重新加载寄存器,并且比较将直接使用%7
(或取决于值的phi函数)。
您可以尝试mem2reg寄存器传递:
opt -mem2reg <your file>.ll -o <target file>.ll