У меня есть массив и вектор, и оба они содержат одни и те же данные, как 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
Я не знаю точно, есть ли какая-либо разница в расположении в памяти между массивом и вектором.
Если нет никакой разницы, я думаю, что способ получить элемент из вектора в порядке.
Итак, я на правильном пути, чтобы сделать это?
Вы можете использовать bitcast
с последующим gep
чтобы получить 4-й элемент в векторе, но это избыточно — вы можете просто использовать gep
само по себе, точно так же, как вы сделали с массивом.
Когда используешь gep
Вам не нужно ничего знать о макетах памяти. В любом случае память для векторов всегда размещается последовательно, что можно сделать из того, как bitcast
ведет себя между векторами и целыми числами; и так как вы не можете bitcast
массивы, их расположение памяти не имеет значения.
Согласно «Часто неверно понимаемой инструкции 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).