请考虑以下程序:
int main() {
int test = 17;
return test;
}
编译为LLVM_IR:clang++ -S -emit-llvm test.cpp
看IR,函数main定义如下:
; Function Attrs: noinline norecurse nounwind optnone uwtable
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 17, i32* %2, align 4
%3 = load i32, i32* %2, align 4
ret i32 %3
}
我们可以看到%2
是我们的test
变量的分配,将17
加载到其中,而%3
使用该变量作为函数的返回值(在keep加上我们编写的代码)。但是,我们看到%1
定义了另一个 int
大小的变量,并将其初始化为0,尽管从未使用过。在C ++源代码中找不到这个额外的变量。
我应该注意,我在使用clang
而不是clang++
进行编译时会看到相同的结果。
这个额外的变量是什么?
答案 0 :(得分:1)
我假设您使用的是旧版本的clang
。在新版本(我的意思是v7.0及更高版本)中,默认情况下会打印值名称。但是要明确打印,您可以-fno-discard-value-names
。使用此选项,您将获得以下IR:
define dso_local i32 @main() #0 {
entry:
%retval = alloca i32, align 4
%test = alloca i32, align 4
store i32 0, i32* %retval, align 4
store i32 17, i32* %test, align 4
%0 = load i32, i32* %test, align 4
ret i32 %0
}
现在可以清楚地知道store 0
的来源。在未优化的代码中,编译器将retval
初始化为0
。