LLVM:将 alloca 作为函数参数传递

LLVM: passing alloca as a function argument

我想要一个相当于

的LLVM IR代码
double x = 4.93;
printf("hello world: %f", x);

在我的 LLVM IR 代码中,我从 godbolt 获得,整理代码后,它会变成

%x = alloca double, align 8
store double 4.930000e+00, double* %x, align 8
%1 = load double, double* %x, align 8
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i32 0, i32 0), double %1)

没有错误。目前没问题。


但对我来说,%1 看起来多余。但是,看起来我无法删除此媒体。以下代码

%x = alloca double, align 8
store double 4.930000e+00, double* %x, align 8
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i32 0, i32 0), double %x)

导致错误

llvm-as-9: test.ll:26:113: error: '%x' defined with type 'double*' but expected 'double'
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i32 0, i32 0), double %x)
                                                                                                                ^

现在我想知道我正在做的删除 %1 是否真的可行?

alloca指令returns一个指针,所以在你的代码中%xdouble*类型。您必须从 double* load 得到 double

在您的情况下,应该可以创建一个具有 4.930000e+00 值的 double 常量,并直接将此值用作 printf 参数。

通过对您的第一个代码段进行 运行 优化传递可以达到相同的效果。