LLVM中间表示:fptoui与fptosi
LLVM Intermediate representation: fptoui vs. fptosi
我很难理解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邮件列表中询问这个问题,以获得更权威的澄清。