了解 LLVM 强制转换指令

Understanding the LLVM cast instruction

假设我有两个 llvm 值指针 x 和 y,其中 x 是双精度数,y 是有符号整数。我希望将 y 转换为 x 的类型。我必须做

y = builder.CreateCast(Instruction::SIToFP, y, x->getType());

或等效

y = builder.CreateCast(Instruction::SIToFP, y, Type::getDoubleTy(context));

为什么要明确指定指令?在这种情况下是 Instruction::SIToFP,而不是仅仅指定要转换的值和目标类型 。这对我来说似乎是多余的,因为必须事先知道 x 和 y 的类型才能指定正确的指令。

如果不显式传递 y 是有符号整数或无符号整数,则无法确定它,因为 LLVM 的整数类型既没有符号也没有无符号:它们表示固定宽度的位向量运算,并且是 operations 在该类型上有符号或无符号。当推理接近机器级别时,这是相当标准的,因为机器以相同的方式看待整数。因此,它使 LLVM 更容易推理程序优化,这是其主要设计目标之一。