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一个指针,所以在你的代码中%x
是double*
类型。您必须从 double*
load
得到 double
。
在您的情况下,应该可以创建一个具有 4.930000e+00
值的 double
常量,并直接将此值用作 printf
参数。
通过对您的第一个代码段进行 运行 优化传递可以达到相同的效果。
我想要一个相当于
的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一个指针,所以在你的代码中%x
是double*
类型。您必须从 double*
load
得到 double
。
在您的情况下,应该可以创建一个具有 4.930000e+00
值的 double
常量,并直接将此值用作 printf
参数。
通过对您的第一个代码段进行 运行 优化传递可以达到相同的效果。