我正在编写一个LLVM通证,需要将一个整数类型转换为各种浮点类型。 我试图使用UIToFp指令将整数值转换为浮点值。 作为一个基本的测试案例,我使用的代码类似于
Value* promotedRandom = Builder.CreateUIToFP(ConstantInt::get(Type::getInt32Ty(M.getContext()), 4), Type::getFloatTy(M.getContext()));
其中Builder是我的函数IRBuilder的一个实例。 但是由于某些原因,在转换后这个值是0而不是4,我可以通过打印这个值来确认。 奇怪的是,如果CreateUIToFP的类型参数是double类型而不是float类型,正确的答案是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时,它们会被提升为双数。 当我取了浮点值,然后将其提升为双倍值时,代码就能正常工作。