Есть ли разница между вектором и массивом в макете памяти LLVM?

У меня есть массив и вектор, и оба они содержат одни и те же данные, как 0, 1, 2, 3, 4.
Затем я использую GEP, чтобы получить ptr массива,

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

Итак,% 0 является указателем 4-го элемента в массиве, на который указывает% arr, а значение% 1 равно 3.

Но теперь я вставил указатель на вектор в указатель на i32:

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

а также:

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

Я не знаю точно, есть ли какая-либо разница в расположении в памяти между массивом и вектором.
Если нет никакой разницы, я думаю, что способ получить элемент из вектора в порядке.
Итак, я на правильном пути, чтобы сделать это?

3

Решение

Вы можете использовать bitcast с последующим gep чтобы получить 4-й элемент в векторе, но это избыточно — вы можете просто использовать gep само по себе, точно так же, как вы сделали с массивом.

Когда используешь gepВам не нужно ничего знать о макетах памяти. В любом случае память для векторов всегда размещается последовательно, что можно сделать из того, как bitcast ведет себя между векторами и целыми числами; и так как вы не можете bitcast массивы, их расположение памяти не имеет значения.

2

Другие решения

Согласно «Часто неверно понимаемой инструкции GEP» (http://llvm.org/docs/GetElementPtr.html) вопрос «Может ли GEP индексировать векторные элементы?», «Это не всегда было категорически запрещено, хотя и не рекомендуется. Это приводит к неловким особым случаям в оптимизаторах и фундаментальной несогласованности в IR. В будущем это будет вероятно, быть полностью запрещен «.

Так что, вероятно, не очень хорошая идея использовать GEP против векторов, но это выполнимо.

И в http://llvm.org/docs/doxygen/html/classllvm_1_1SequentialType.html, он говорит: «Все они представляют собой« массивы »в памяти. Тип массива представляет массив определенного размера, типы указателей представляют собой массивы неизвестного размера / неизвестного размера, векторные типы представляют массивы определенного размера, которые позволяют использовать инструкции SIMD».

Поэтому лучше решить, нужен ли вектор. Если это так, то инструкция ‘extractelement’, вероятно, лучше (http://llvm.org/docs/LangRef.html#extractelement-instruction).

1

По вопросам рекламы [email protected]