CLang ++在LLVM_IR中生成伪变量

沙迦·谢麦什(Shachar Shemesh)

请考虑以下程序:

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来自哪里在未优化的代码中,编译器将初始化retval0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章