Ваша первая проблема в том, что вы определили @a
как функцию, особенно ту, которая всегда возвращает значение <1.0, 2.0, 3.0>
.Поэтому независимо от того, что вы делаете в другом месте, вы никогда не сможете позвонить @a()
и получить что-либо, кроме этого значения.Поэтому первое, что вам нужно сделать, - это превратить @a
в глобальную переменную, чтобы вы могли изменить ее значение.
Теперь ваша следующая проблема заключается в том, что insertelement
не меняет заданный вектор.Это невозможно, потому что векторы хранятся в регистрах, и вы не можете переназначить регистры (LLVM использует статическую форму одиночного назначения).Поэтому вместо insertelement
создается новый вектор с измененным заданным индексом.В своем коде вы сохраняете этот новый вектор в %0
, а затем ничего не делаете с ним.Как только вы сделали @a
глобальной переменной, вы можете сохранить значение %0
в @a
.Это решит вашу непосредственную проблему.
Однако, как мы уже обсуждали в комментариях, векторы не совсем подходят для того, что вы делаете по нескольким причинам:
- Поскольку вы не можете иметь указатели на векторы, вы не можете легко написать функции, которые перебирают векторы произвольного размера.
- Как я уже указывал,
insertelement
создает новый вектор с одним измененным элементом,Это означает, что весь вектор копируется.Если вы создаете большие векторы, это может быть довольно дорогостоящим. - Похоже, вы на самом деле не используете ни одно из преимуществ векторов.Векторы позволяют вам выполнять точечную арифметику для векторов чисел одинакового размера, которые будут соответствовать инструкциям SIMD, где это необходимо.Вот как они должны использоваться, а не как замены массивов общего назначения.
Если вы сделаете @a
массив, вы можете получить указатель на его второй элемент и сохранить новыйзначение непосредственно в это.Таким образом, вместо того, чтобы создавать новый массив и заменять его @a
, вы просто меняете один элемент, который хотите изменить.Это то, что вы действительно хотите.