Clang 从整数到字符向量的比特广播

Clang 从整数到字符向量的比特广播,clang,llvm,simd,llvm-ir,Clang,Llvm,Simd,Llvm Ir,我刚刚用clang 3.7编译了一小段C代码: typedef unsigned char char4 __attribute__ ((vector_size (4))); char4 f1 (char4 v) { return v / 2; } 函数编译为(我删除了debuginfo): define@f1(%v){ 条目: %div=udiv%v,比特广播(到) 回收率%div } 根据llvm,比特广播操作不会改变比特,这意味着应该产生(或)。我说得对吗? 因此,我将得到除零

我刚刚用clang 3.7编译了一小段C代码:

typedef unsigned char char4  __attribute__ ((vector_size (4)));

char4 f1 (char4  v)
{
  return v / 2;
}
函数编译为(我删除了debuginfo):

define@f1(%v){
条目:
%div=udiv%v,比特广播(到)
回收率%div
}
根据llvm,比特广播操作不会改变比特,这意味着应该产生(或)。我说得对吗? 因此,我将得到除零异常

我编写的代码旨在进行广播(或splat),而不是比特广播

有人能解释一下发生了什么事吗


谢谢

实际上它看起来像叮当作响的虫子:


此输入代码不应编译,或生成警告,或编译为向量splat

实际上,它看起来像一个叮当作响的bug:


这个输入代码要么不编译,要么生成警告,要么编译成向量splat

,显然这是clang和gcc之间的不一致行为。上面的代码使用gcc正确运行,并使用clang生成浮点异常。显然,这是clang和gcc之间的不一致行为。上面的代码使用gcc正确运行,并生成一个带有clang的浮点异常。
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
}