经过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。通行证的名称通常会告诉您通行证试图做什么。
有一段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。通行证的名称通常会告诉您通行证试图做什么。