经过llvm opt优化,函数中的代码全部删除

After optimized by llvm opt, all the code in the function has been deleted

有一段llvm ir代码,相当于汇编中的"lea eax, [ebx + ecx]" :

@eax = internal global i32 0
@ecx = internal global i32 0
@ebx = internal global i32 0

define void @root() {
entry:
  %0 = load i32, i32* @ebx
  %1 = load i32, i32* @ecx
  %2 = mul i32 %1, 1
  %3 = add i32 %0, %2
  store i32 %3, i32* @eax
  ret void
}

不管我用-O3,-O2还是-O1,结果都是这样的:

define void @root() local_unnamed_addr #0 {
entry:
  ret void
}

函数里面什么都没有,到底发生了什么?为什么opt认为@root函数中的上述代码是无用代码?

编译器发现这些全局变量只能在模块内使用,模块中没有任何东西使用它们或将它们导出到模块外,因此写入它们毫无意义。

LLVM 将使用 -print-after-all 选项回答大多数此类问题,该选项告诉您每条指令通过 adds/changes/removes。通行证的名称通常会告诉您通行证试图做什么。