为什么LLVM分配一个冗余变量? [英] Why does LLVM allocate a redundant variable?
本文介绍了为什么LLVM分配一个冗余变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面是一个简单的C文件,其中包含一个枚举定义和一个main
函数:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
它转换为以下LLVM IR:
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 2, i32* %2, align 4
ret i32 0
}
%2
显然是d
变量,它被赋值为2。如果直接返回零,%1
对应于什么?
推荐答案
此%1
寄存器由clang生成,用于处理函数中的多个返回语句。假设您正在编写一个函数来计算整数的阶乘。而不是这个
int factorial(int n){
int result;
if(n < 2)
result = 1;
else{
result = n * factorial(n-1);
}
return result;
}
您可能会这样做
int factorial(int n){
if(n < 2)
return 1;
return n * factorial(n-1);
}
为什么?因为Clang将插入为您保存返回值的result
变量。耶。这就是%1
变量的原因。查看IR以获取略微修改过的代码版本。
修改代码,
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
if(d) return 1;
return 0;
}
IR,
define dso_local i32 @main() #0 !dbg !15 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 2, i32* %2, align 4, !dbg !22
%3 = load i32, i32* %2, align 4, !dbg !23
%4 = icmp ne i32 %3, 0, !dbg !23
br i1 %4, label %5, label %6, !dbg !25
5: ; preds = %0
store i32 1, i32* %1, align 4, !dbg !26
br label %7, !dbg !26
6: ; preds = %0
store i32 0, i32* %1, align 4, !dbg !27
br label %7, !dbg !27
7: ; preds = %6, %5
%8 = load i32, i32* %1, align 4, !dbg !28
ret i32 %8, !dbg !28
}
现在您看到%1
变得有用了吧?大多数只有一条RETURN语句的函数都会被llvm的一次传递删除此变量。
这篇关于为什么LLVM分配一个冗余变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文