位转换整数到 char 的向量

bitcast integer to vector of char

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

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

char4 f1 (char4  v)
{
  return v / 2;
}

函数编译为(我删除了 debuginfo):

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,位转换操作不会更改位,这意味着 <4 x i8> 应该产生 <2, 0, 0, 0>(或 <0, 0, 0, 2 >).我对吗? 因此,我将得到除零异常。

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

有人可以解释一下发生了什么吗?

谢谢!

实际上它看起来像是 clang 中的一个错误:

https://llvm.org/bugs/show_bug.cgi?id=27085

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