Алгоритмы восстановления формы ssaa после модификации графа потока вызовов
Я изучаю оптимизацию компилятора в форме ssa. Одна трудность, с которой я сталкиваюсь, заключается в том, как сохранить/восстановить/восстановить форму ssa после изменения структуры графа потока вызовов.
Предположим, у меня есть следующий cfg (переменные a, b, c являются фиктивными, не обращайте на них внимания):
![](/images/5c4c3d8c4934b9e8dad2f6794ecbf4d5f217d483.png)
Теперь я хочу вставить узел, который предшествует узлу while, чтобы результат был таким:
![](/images/212117f3e298edd36f0153094cf9eced6f758547.png)
Как видно, новый узел меняет границы доминирования для x_1 и x_2 и требует, чтобы phi-узел для блока while был «разделен» на два.
Какими алгоритмами это можно сделать? Я просмотрел книги и слайды, но не нашел ничего, что объясняло бы, как это сделать эффективно.
1 ответ
Я, вероятно, опаздываю на вечеринку, но в книге Inria Forge SSA есть глава «Реконструкция SSA» ( зеркало ), в которой говорится об этой теме.