Я изучаю основы LLVM. Я пытаюсь попасть в рамки строителя и настроить модуль, заголовок функции и т.д., но я не мог еще придумать способ, чтобы создать простую последовательность, как это в строителе:Как создать эту последовательность в структуре построителя LLVM?
%0 = 41
%1 = add i32 42, %0
Смысл, как я могу использовать псевдо-регистрационную запись через каркас строителя?
Я попытался создать инструкцию на основе двух констант. Ядро линии я использую для создания (целое число) Сложение:
Value *L = (Value *)m_left->Create_LLVM();
Value *R = (Value *)m_right->Create_LLVM();
if (L == 0 || R == 0) return 0;
llvm::Value *p_instruction = Get_Builder().CreateAdd(L, R, "addtmp");
Это содержит много моих собственных функций, но я предполагаю, что основы ясно. Я получаю указатель Value для левого и правого операндов, которые являются константами, а затем создает операцию добавления с каркасной конструкцией. Опять модуль и построитель настроены правильно, когда я вызываю dump(), я вижу все остальное, что я делаю, но эта строка выше не создает никакого ИК-кода.
Я бы ожидать, что она совместно создать что-то вроде
%4 = add i32 %3, %2
или что-то подобное. Не понимаю ли я что-то фундаментальное в отношении того, как операции должны быть построены с помощью строителя или это просто небольшой контроль над некоторыми деталями?
Благодаря
После очередного дня экспериментирования я несколько дальше, и я понимаю, что строитель теперь просто создает оператор возврата с постоянным значением без фактического выполнения сложения, который раздраженное меня сначала, потому что я не ожидал этого без явного запроса на оптимизацию, но, вероятно, для LLVM это тривиально и само собой разумеется. –
Моя главная проблема теперь первая, хотя. Я не могу фактически сохранить значение в переменной. На самом деле я еще не нашел никакого производного класса Value, который похож на переменную, поэтому я предполагаю, что обрабатывать переменные таким образом, который совместим с основными учебными пособиями об ИК, должен быть какой-то сложный способ справиться с этим, который каким-то образом запутан и нелегко найти. –
Строитель имеет постоянную папку, которая выполняет постоянную фальцовку только во время генерации IR, и это, скорее всего, станет причиной того, что вы видите такую оптимизацию без пропусков оптимизатора. –