Jon*_*her 1 c compiler-construction llvm-clang
我试图理解C语言的clang编译器及其产生的中间代码.
我有一系列编译,生成LLVM-IR的函数,我不明白为什么.
这是第一个:
int f(int x){
}
这会生成LLVM代码
define i32 @f(i32 %x) nounwind uwtable readnone{
  ret i32 undef
}
我认为这完全可以理解.函数体未定义!
这是下一个C函数:
int f(int x){
  if (x < 0) 
    {}
  else
    {}
}
当clang编译它时,它会生成完全相同的LLVM-IR.编译器识别出正文是垃圾,并返回undefined!LLVM知道这是垃圾的方式是它的优化器.Clang - > LLVM使用"返回值收集器"约定 - 在定义函数时 - %1被分配为"返回值".所有返回语句都会更新此值,最终,在函数体末尾的LLVM中有一个ret语句,它基本上返回此值.LLVM发现变量在没有更新或初始化的情况下被分配和返回,并将其设置为undefined.
现在为踢球者!!
int f(int x){
  if (x<0)
    {}
  else
    {           
      return 3;
    }
}
转换为以下LLVM-IR.
define i32 @f(i32 %x) nounwind uwtable readnone {
  ret i32 3
}
出于某种原因,未修改的代码被删除.当(x <0)时,C函数应该是未定义的!任何人都可以解释为什么这个代码被修剪掉了?
| 归档时间: | 
 | 
| 查看次数: | 114 次 | 
| 最近记录: |