4

我有一个数组和一个向量,它们都保存相同的数据,例如 0、1、2、3、4。然后我使用 GEP 获取数组的 ptr,

%0 = getelementptr [5 x i32]* %arr, i32 0, i32 3
%1 = load i32* %0

所以,%0 是 %arr 指向的数组中第 4 个元素的指针,%1 的值为 3。

但是现在,我将指向向量的指针比特转换为指向 i32 的指针:

%2 = bitcast <5 x i32>* %Vec to i32*

和:

%3 = getelementptr i32* %2, i32 3
%4 = load i32* %3

我不确切知道数组和向量之间的内存布局是否有任何差异。如果没有区别,我认为从向量中获取元素的方式是可以的。那么,我这样做是否正确?

4

2 回答 2

3

根据“经常被误解的 GEP 指令”(http://llvm.org/docs/GetElementPtr.html)问题“GEP 可以索引向量元素吗?”,“这并不总是被强制禁止,尽管不推荐。它会在优化器中导致尴尬的特殊情况,以及 IR 中的根本不一致。在未来,它可能会被彻底禁止。

因此,对向量使用 GEP 可能不是一个好主意,但它是可行的。

http://llvm.org/docs/doxygen/html/classllvm_1_1SequentialType.html中,它说“所有这些都代表内存中的“数组”。数组类型代表一个特定大小的数组,指针类型是未调整大小/未知大小的数组,向量类型表示允许使用 SIMD 指令的特定大小的数组。”

所以最好决定是否需要向量。如果确实如此,那么“提取元素”指令可能会更好(http://llvm.org/docs/LangRef.html#extractelement-instruction)。

于 2016-10-28T21:58:19.987 回答
1

您可以使用 abitcast后跟 agep来获取向量中的第 4 项,但它是多余的 - 您可以单独使用 a gep,其方式与使用数组完全相同。

使用时gep,您无需了解任何有关内存布局的信息。在任何情况下,向量的内存总是按顺序排列的,这可以从bitcast向量和整数之间的行为方式推断出来;而且由于您不能bitcast数组,因此它们的内存布局无关紧要。

于 2013-10-21T08:05:26.877 回答