Clang C到LLVM汇编修剪"错误代码"

Jon*_*her 1 c compiler-construction llvm-clang

我试图理解C语言的clang编译器及其产生的中间代码.

我有一系列编译,生成LLVM-IR的函数,我不明白为什么.

这是第一个:

int f(int x){
}
Run Code Online (Sandbox Code Playgroud)

这会生成LLVM代码

define i32 @f(i32 %x) nounwind uwtable readnone{
  ret i32 undef
}
Run Code Online (Sandbox Code Playgroud)

我认为这完全可以理解.函数体未定义!

这是下一个C函数:

int f(int x){
  if (x < 0) 
    {}
  else
    {}
}
Run Code Online (Sandbox Code Playgroud)

当clang编译它时,它会生成完全相同的LLVM-IR.编译器识别出正文是垃圾,并返回undefined!LLVM知道这是垃圾的方式是它的优化器.Clang - > LLVM使用"返回值收集器"约定 - 在定义函数时 - %1被分配为"返回值".所有返回语句都会更新此值,最终,在函数体末尾的LLVM中有一个ret语句,它基本上返回此值.LLVM发现变量在没有更新或初始化的情况下被分配和返回,并将其设置为undefined.

现在为踢球者!!

int f(int x){
  if (x<0)
    {}
  else
    {           
      return 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

转换为以下LLVM-IR.

define i32 @f(i32 %x) nounwind uwtable readnone {
  ret i32 3
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,未修改的代码被删除.当(x <0)时,C函数应该是未定义的!任何人都可以解释为什么这个代码被修剪掉了?

Car*_*rum 5

3对于具有未定义行为的函数,它是一个完全合理的返回值.从字面上看,任何返回值都是允许的.