请考虑以下程序:
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
将该变量用作函数的返回值(与编写代码时保持一致)。但是,我们看到它%1
定义了另一个 int
大小变量,并将其初始化为0,尽管从未使用过。这个额外的变量在C ++源代码中找不到。
我应该注意的是,使用clang
而不是进行编译时,会生成相同的内容clang++
。
这个额外的变量是什么?
我认为您使用的是旧版本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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句