【发布时间】: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