【问题标题】:After optimized by llvm opt, all the code in the function has been deleted经过llvm opt优化后,函数中的所有代码都被删除了
【发布时间】:2021-08-06 09:46:30
【问题描述】:

有一段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
}

无论我使用opt -O3、-O2还是-O1,结果都是这样的:

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

函数里面什么都没有,这是怎么回事?为什么opt认为@root函数中的上述代码是无用代码?

【问题讨论】:

  • 可能因为全局变量是内部的,llvm 检测到您的函数没有外部可见的影响。

标签: optimization llvm


【解决方案1】:

编译器看到这些全局变量只能在模块内使用,而模块中的任何内容都不会使用它们或将它们导出到模块外部,因此写入它们显然是没有意义的。

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

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2021-10-11
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2016-09-26
    • 2020-10-18
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多