【问题标题】:CLang++ generating spurious vars in LLVM_IRCLang++ 在 LLVM_IR 中生成虚假变量
【发布时间】:2019-02-08 07:40:25
【问题描述】:

请考虑以下程序:

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 定义了 another int 大小的变量,并将其初始化为 0,尽管从未使用它。这个额外的变量在 C++ 源代码中是看不到的。

我应该注意到,当我使用 clang 而不是 clang++ 进行编译时,我会看到同样的结果。

这个额外的变量是什么?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 实际上,这是 LLVM 7。不过,感谢您提供的有用选项。
    猜你喜欢
    • 2013-03-11
    • 2018-05-28
    • 2020-06-22
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多