LLVM 通过将整数转换为浮点数
LLVM pass converting integer to float
我正在编写一个 LLVM pass,需要将整数类型转换为各种浮点类型。我正在尝试使用 UIToFp 指令将整数值转换为浮点值。作为基本测试用例,我使用的代码类似于
Value* promotedRandom = Builder.CreateUIToFP(ConstantInt::get(Type::getInt32Ty(M.getContext()), 4), Type::getFloatTy(M.getContext()));
其中 Builder 是我函数的 IRBuilder 实例。但是由于某种原因,这个值在转换后是 0 而不是 4,我可以通过打印该值来确认。奇怪的是,如果 CreateUIToFP 的类型参数是双精度类型而不是浮点类型,则会打印正确答案 4。在下面的 UIToFP 文档中,我没有看到发生此行为的任何原因。出现这个问题的原因是什么,应该如何解决。
将无符号整数常量转换为相应的浮点常量。 TYPE 必须是标量或向量浮点类型。 CST 必须是标量或向量整数类型。 CST 和 TYPE 都必须是标量,或具有相同数量元素的向量。
此外,如果我用 clang 编译这段代码
int main(){
int test = 4;
float test2 = (float)test;
printf("%f\n", test2);
}
我得到以下说明
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca float, align 4
store i32 4, i32* %1, align 4
%3 = load i32, i32* %1, align 4
%4 = sitofp i32 %3 to float
store float %4, float* %2, align 4
%5 = load float, float* %2, align 4
%6 = fpext float %5 to double
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %6)
ret i32 0
}
这表明 sitofp 和整数到浮点数的转换工作正常。尽管我用的是 uitofp 而不是 sitofp,但我都试过了,但都不行。
我看到问题是 printf 没有将浮点数作为参数。当浮点数传递给 printf 时,它们被提升为双精度数。当我获取浮点值然后将其提升为双精度值时,代码工作正常。
我正在编写一个 LLVM pass,需要将整数类型转换为各种浮点类型。我正在尝试使用 UIToFp 指令将整数值转换为浮点值。作为基本测试用例,我使用的代码类似于
Value* promotedRandom = Builder.CreateUIToFP(ConstantInt::get(Type::getInt32Ty(M.getContext()), 4), Type::getFloatTy(M.getContext()));
其中 Builder 是我函数的 IRBuilder 实例。但是由于某种原因,这个值在转换后是 0 而不是 4,我可以通过打印该值来确认。奇怪的是,如果 CreateUIToFP 的类型参数是双精度类型而不是浮点类型,则会打印正确答案 4。在下面的 UIToFP 文档中,我没有看到发生此行为的任何原因。出现这个问题的原因是什么,应该如何解决。
将无符号整数常量转换为相应的浮点常量。 TYPE 必须是标量或向量浮点类型。 CST 必须是标量或向量整数类型。 CST 和 TYPE 都必须是标量,或具有相同数量元素的向量。
此外,如果我用 clang 编译这段代码
int main(){
int test = 4;
float test2 = (float)test;
printf("%f\n", test2);
}
我得到以下说明
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca float, align 4
store i32 4, i32* %1, align 4
%3 = load i32, i32* %1, align 4
%4 = sitofp i32 %3 to float
store float %4, float* %2, align 4
%5 = load float, float* %2, align 4
%6 = fpext float %5 to double
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %6)
ret i32 0
}
这表明 sitofp 和整数到浮点数的转换工作正常。尽管我用的是 uitofp 而不是 sitofp,但我都试过了,但都不行。
我看到问题是 printf 没有将浮点数作为参数。当浮点数传递给 printf 时,它们被提升为双精度数。当我获取浮点值然后将其提升为双精度值时,代码工作正常。