LLVM 中位播后矢量的位布局

bit layout of vector after bitcasting in llvm

本文关键字:布局 LLVM      更新时间:2023-10-16
%0 = bitcast i16 %arg1 to <2 x i8>
%2 = extractelement <2 x i8> %0, i32 1

内存中的%arg1

 00000000  11111111
|--8bit--||--8bit--|

位播后,%0是指向矢量的指针。

那么%0也是向量第一个元素的地址吗?

%2到底是什么?是vector(11111111)的第二个要素,还是, 00000000

位投射后,%0<2 x i8> 类型的Value。它不是"指针"。当代码生成为机器代码时,向量很可能存储在寄存器中。

%2i8,因为extractelement定义为:

<result> = extractelement <n x <ty>> <val>, i32 <idx>    ; yields <ty>

该向量有两个元素,每个元素的类型为 i8%2 是保存向量中第二个元素的Value

请注意,矢量在内存或寄存器中的布局方式取决于目标。LLVM IR级别并不关心这一点。它将向量视为两个值的抽象容器。

(尽管这个问题很久以前就讨论过了,但在阅读后,回复一个旧问题很好,因为回复提供了另一种验证答案的方法并引用了最近的文档更新)

%2 的值将取决于字节序和目标(向量的内存布局取决于目标和字节序,正如 Eli Bendersky 所提到的);https://gcc.godbolt.org/z/vfcGhb4EK 可能是可视化它的好方法。

<小时 />

通过阅读语言参考,这两个有助于推理上述 IR(至少对我来说)

  1. 比特播的语义
  2. 矢量类型的内存布局

1和2均从 https://reviews.llvm.org/D94964 更新(归功于作者和审稿人)

bitcast <type1> <value> to <type2>

value%arg1在您的情况下)从type1转换为type2,而不会更改位,因为两种类型的位数相同。

%0 = bitcast i16 %arg1 to <2 x i8>

这意味着%0现在是两个 8 位整数的数组/向量,而不是单个 16 位整数。 查看链接的文档,这似乎只是一个值。

extractelement <n x <type>> <value>, i32 <index> 使用 32 位整数index提取 type d value s 的 n 长度数组中的元素作为给定type

%2 = extractelement <2 x i8> %0, i32 1

这意味着%2现在是一个 8 位整数,其值为 元素 1(第二个/最后一个 8 位元素)。 假设小端硬件,我希望%2的价值是0的。