CLang ++在LLVM_IR中生成伪变量

时间:2019-02-08 07:40:26

标签: clang clang++ llvm-clang llvm-ir

请考虑以下程序:

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++进行编译时会看到相同的结果。

这个额外的变量是什么?

1 个答案:

答案 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