Глобальные переменные в единой статической форме назначения

Я работаю над компилятором, который использует SSA для языка, содержащего глобальные переменные. Мне интересно, как мне реализовать использование и определения глобальных переменных, например, как мне преобразовать приведенный ниже код?

Форма без SSA:

x;
y;

main () {
  x = 0;
  foo();
  y = x;
  x = 2;
  foo();
}

foo () {
  print x;
  x = 1;
}

В форме SSA есть места, где я не уверен, какие индексы использовать:

main () {
  x.0 = 0;
  foo()
  y.0 = x.?
  x.1 = 2;
  foo();
}

foo () {
  print x.?;
  x.? = 1;
}

Я думал о добавлении фи-функций, но это, похоже, не решает проблему того, на какие индексы ссылаются эти фи-функции.

Большое спасибо, Бен


person BenJacob    schedule 30.04.2017    source источник


Ответы (1)


Классический SSA на самом деле не охватывает глобальные переменные или любые другие области памяти, которые могут быть прочитаны и записаны кодом, который вы не видите. Есть расширения, которые пытаются покрыть динамическую память, но не похоже, что вы преследуете одно из них.

LLVM, для сравнения, не пытается привести глобальные переменные в форму SSA. Глобальная переменная — это ячейка памяти, а ее «имя» — это указатель на эту ячейку памяти, поэтому доступ к глобальным переменным — это обычная операция загрузки/сохранения.

person Community    schedule 01.05.2017
comment
В таком случае означает ли это, что при выполнении анализа и оптимизации потока данных мы игнорируем глобальные переменные, как массивы? - person BenJacob; 05.05.2017
comment
@BenJacob Да, по крайней мере, для анализа, основанного исключительно на переменных SSA. Вы по-прежнему можете использовать алгоритмы, не относящиеся к SSA, которые рассуждают об изменяемых местах хранения (например, для двух загрузок с одного и того же адреса можно считать эквивалентными, если между двумя местами нет промежуточных записей). Как я уже сказал, существуют также расширения SSA для областей памяти, но LLVM, по крайней мере, не реализует их (на уровне IR; у него есть утилита памяти SSA в настоящее время). - person ; 09.05.2017