Могу ли я перевести AST на SSA или мне нужно перевести на CFG, а затем на SSA?

Могу ли я перевести абстрактное синтаксическое дерево непосредственно в форму SSA, или мне нужно будет создать граф потока управления, а затем создать форму статического одиночного назначения из указанного CFG?

И в контексте графа потока управления: как мне представить это для c-like программы? Я думаю, что мог бы сохранить график CFG для всех основных блоков в каждой функции, но затем, когда я вызываю функцию, например, это может усложнить ситуацию. Другой способ, которым я могу придумать, - это CFG для всей программы, то есть для всех исходных файлов, но как тогда хранить информацию о функциях? Могу ли я сохранить указатель на функцию в базовом блоке (то есть родительском узле)?

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

1 ответ

Решение

Да, вы можете создать форму SSA без предварительного создания CFG, но вы не можете использовать классический алгоритм построения SSA от Cytron et al. Есть еще один алгоритм, описанный в статье " Простое и эффективное построение статической формы единого назначения" (отказ от ответственности: я один из авторов). Этот алгоритм используется в libFirm, в OpenJDK и в компиляторе Go.

Большинство компиляторов (afaik) используют модель с одним CFG на функцию. Каждый базовый блок является узлом. Операторы (или операции / инструкции / и т. Д.) Принадлежат одному базовому блоку. Некоторые хранят инструкции в виде списка в каждом базовом блоке. Некоторые хранят инструкции в виде частично упорядоченного графа, похожего на CFG.

Другие вопросы по тегам