LLVM的内存布局中向量和数组之间有什么区别?

时间:2013-10-21 05:35:35

标签: c++ llvm llvm-ir

我有一个数组和一个向量,它们都拥有相同的数据,如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

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

2 个答案:

答案 0 :(得分:2)

您可以使用bitcast后跟gep来获取向量中的第4项,但这是多余的 - 您可以单独使用gep,完全相同就像你完成数组一样。

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

答案 1 :(得分:1)

根据&#34;经常被误解的GEP指令&#34; (http://llvm.org/docs/GetElementPtr.html)问题&#34; GEP可以将索引转换为向量元素吗?&#34;,&#34;虽然不建议这样做但并非总是被强制禁止。它导致优化器中的特殊情况尴尬,并且IR中的基本不一致。在未来,它可能会被彻底禁止。&#34;

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

http://llvm.org/docs/doxygen/html/classllvm_1_1SequentialType.html中,它表示&#34;所有这些代表&#34;数组&#34;在记忆中。数组类型表示特定大小的数组,指针类型是未大小/未知大小的数组,向量类型表示允许使用SIMD指令的特定大小的数组。 &#34;

因此,最好决定是否需要矢量。如果确实如此,那么&#39; extractelement&#39;指令可能更好(http://llvm.org/docs/LangRef.html#extractelement-instruction)。