Как ответил один из комментаторов, решение состоит в том, чтобы использовать инструкцию загрузки.Когда вы используете инструкцию сохранения в LLVM, вы записываете на некоторый адрес памяти.
Чтобы прочитать указанную переменную и сохранить ее в виртуальном регистре, вы используете инструкцию загрузки.
Например, рассмотрим следующую функцию, которая добавляет два целых числа:
define i32 @add(i32, i32) {
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%5 = load i32, i32* %3
%6 = load i32, i32* %4
%7 = add i32 %5, %6
ret i32 %7
}
Первые две строки выделяют память в стеке для двух целых чисел размером четыре байта.Затем мы записываем значение аргументов функции в эти места.Прежде чем мы сможем использовать add, мы загружаем эти две переменные из памяти в виртуальные регистры% 5 и% 6.Затем выполняется инструкция добавления, а результат присваивается виртуальному регистру% 7.
Затем мы возвращаем результат вычисления, используя инструкцию ret, которая также является единственным ограничителем одного базового блока, составляющегоэтот пример функции.