【发布时间】:2016-07-10 10:40:48
【问题描述】:
我刚刚使用 clang 3.7 编译了一小段 C 代码:
typedef unsigned char char4 __attribute__ ((vector_size (4)));
char4 f1 (char4 v)
{
return v / 2;
}
该函数编译为(我删除了调试信息):
define <4 x i8> @f1(<4 x i8> %v) {
entry:
%div = udiv <4 x i8> %v, bitcast (<1 x i32> <i32 2> to <4 x i8>)
ret <4 x i8> %div
}
根据 llvm documentation,bitcast 操作不会改变位,这意味着 应该产生 (或 )。我对吗? 因此,我会得到除零异常。
我编写的代码旨在进行广播(或 splat),而不是位广播。
有人能解释一下发生了什么吗?
谢谢!
【问题讨论】:
-
显然这是clang和gcc之间的不一致行为。上面的代码用gcc正确运行,用clang生成浮点异常。