LLVM中间表示:fptoui与fptosi

LLVM Intermediate representation: fptoui vs. fptosi

本文关键字:fptosi fptoui 中间 表示 LLVM      更新时间:2023-10-16

我很难理解LLVM-IR指令之间的区别。To"and"…"。

为了更好地理解这些指令的语义,我编写了一个示例程序。
#include <stdio.h>
int main(int argc, char** argv)
{
    double d = -3.5 - 4;
    unsigned int ui = (unsigned int) d;
    int si = (int) d;
    printf("unsigned %u, 0x%xn", ui, ui);
    printf("signed   %i, 0x%xn", si, si);      
    return 0;    
}
如预期的那样,clang生成了这两种指令
...
%5 = fptoui double %4 to i32
store i32 %5, i32* %ui, align 4
%6 = load double* %d, align 8
%7 = fptosi double %6 to i32
store i32 %7, i32* %si, align 4
...

运行程序时输出为:

unsigned 4294967289, 0xfffffff9
signed -7, 0xfffffff9

这意味着,两个指令产生相同的值(只是在一个情况下,该值稍后被解释为有符号的,而另一个被解释为无符号的)

LLVM IR文档说明:

"fptoui"指令将其浮点操作数转换为最接近的(向零四舍五入)无符号整数值。

是不是最接近的无符号整数值为负双0?有人知道在哪些情况下这些指令有不同的语义吗?

将负浮点值转换为unsigned类型会导致C和c++中未定义的行为,我相信fptoui的意图是相同的。

我认为它应该像这样指定:

"fptoui"指令将其浮点操作数转换为最接近的整数值(向负无穷四舍五入)。如果该值不能用ty2表示,则结果为undefined

最好在llvm邮件列表中询问这个问题,以获得更权威的澄清。