【问题标题】:strange optimize in LLVM IRLLVM IR 中的奇怪优化
【发布时间】:2021-02-22 04:57:25
【问题描述】:

发现问题,原来我忘记在set_array中设置vari的初始值了。

这是

  store i32 0, i32* %vari

在代码中

不过奇怪的是opt优化出来了。

// ----- 原创 ---------

以下是 LLVM IR 中生成的代码。注意我在main 函数中调用了malloc

当我使用 opt 优化代码时,malloc 消失了,优化后生成的代码与我的预期不符。 (即使我使用printf 在分配的数组中打印一些值以防止它被优化)。

使用 llc 也会发生同样的事情。

我应该如何完全在 LLVM IR 中创建一个“完整”程序(能够调用malloc),并将其编译为可执行二进制文件。

; ModuleID = 'my_module'
source_filename = "my_module"
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"

define i32 @main(i32 %0, i8** %1) {
main_basicblock:
  %malloc_ret = call i8* @malloc(i64 30)
  %temp = bitcast i8* %malloc_ret to i32*
  call void @set_array(i32* %temp, i32 30, i32 2)
  %temp1 = getelementptr i32, i32* %temp, i32 2
  %f2 = load i32, i32* %temp1
  %temp2 = getelementptr i32, i32* %temp, i32 10
  %f23 = load i32, i32* %temp2
  ret i32 0
}

define void @set_array(i32* %0, i32 %1, i32 %2) {
set_array_basicblock:
  %vari = alloca i32
  **store i32 0, i32* %vari**
  br label %loop_basicblock

loop_basicblock:                                          ; preds = %set_array_basicblock, %set_array_basicblock2
  %temp = load i32, i32* %vari
  %temp1 = icmp slt i32 %temp, %1
  br i1 %temp1, label %set_array_basicblock2, label %set_array_basicblock4

set_array_basicblock2:                                    ; preds = %loop_basicblock
  %i_value = load i32, i32* %vari
  %ptr = getelementptr i32, i32* %0, i32 %i_value
  store i32 %1, i32* %ptr
  %temp3 = add i32 %i_value, 1
  store i32 %temp3, i32* %vari
  br label %loop_basicblock

set_array_basicblock4:                                    ; preds = %loop_basicblock
  ret void
}

declare i8* @malloc(i64)

【问题讨论】:

    标签: optimization clang llvm compiler-optimization llvm-ir


    【解决方案1】:

    分配的内存不用于任何可观察的内容,因此优化器可以将其完全删除。

    您可以避免禁用优化或使用它做一些有意义的事情。例如,您可以打印它、调用外部函数、执行 volatile 存储...

    store volatile i32 0, i32* %temp
    

    即使我使用printf 在分配的数组中打印一些值以防止它被优化

    如果优化器可以在编译期间计算所有内容,则可能会发生这种情况。您可以添加来自某些输入源的未知值、增加代码的复杂性或使用其他解决方案之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多