Size: a a a

Compiler Development

2019 December 31

PS

Peter Sovietov in Compiler Development
Построение и выход из SSA — затратные этапы. И если в форме SSA делается практически все остальное и преобразований хочется много, то выгода от SSA становится ощутимой. А вот если это JIT с небольшим набором оптимизаций по принципу Парето 80/20, то тут ситуация уже не столь однозначна.
источник

E

EgorBo in Compiler Development
у нас не затратная - не видел особо в профайлере жалобы на этот этап, а решение задач удаления ненужных чеков - это важная вещь, не уверен что можно граммотно решить без сса (вернее не знаю как)
источник

E

EgorBo in Compiler Development
самая большая проблема нетрассирующих джитов — это что нельзя так фривольно как ллвм гонять одни и те же проходы взад-вперед на кажды чих (чуть ли не у каждого второго пасса есть депенденси пассы)
источник

PS

Peter Sovietov in Compiler Development
EgorBo
у нас не затратная - не видел особо в профайлере жалобы на этот этап, а решение задач удаления ненужных чеков - это важная вещь, не уверен что можно граммотно решить без сса (вернее не знаю как)
Для построения SSA у вас классический алгоритм используется с доминаторами?
источник

E

EgorBo in Compiler Development
Peter Sovietov
Для построения SSA у вас классический алгоритм используется с доминаторами?
не знаком со всеми алгоритмами, но там да, на доминаторах
источник

PS

Peter Sovietov in Compiler Development
EgorBo
не знаком со всеми алгоритмами, но там да, на доминаторах
Видимо, остальные этапы трансляции сильно тяжелее и нет смысла улучшать этап построения SSA.

Сегодня есть более изящные подходы к построению SSA: http://compilers.cs.uni-saarland.de/papers/bbhlmz13cc.pdf
источник

E

EgorBo in Compiler Development
ну у нас вот этот https://www.cs.rice.edu/~keith/Embed/dom.pdf
источник

PS

Peter Sovietov in Compiler Development
Да, это тоже неплохой вариант, особенно, если уже есть универсальный и эффективный решатель  задач анализа потоков данных. И поучительный момент в статье:

"...an implementation of an O(N^2) algorithm that runs faster, in practice, than the classic Lengauer-Tarjan algorithm, which has a timebound of O(E ∗ log(N))" :)
источник

E

EgorBo in Compiler Development
источник

E

EgorBo in Compiler Development
там же наврное сразу и value numbering, но не уверен - возможно он в другом файле
источник

PS

Peter Sovietov in Compiler Development
EgorBo
там же наврное сразу и value numbering, но не уверен - возможно он в другом файле
Это по моей ссылке как раз делается — целый набор локальных преобразований прямо на лету, во время построения SSA. А тут все по учебнику. Но — по хорошему учебнику :)

/**
* Build SSA form.
*
* Sorts the graph topologically.
*   - Collects them in postOrder array.
*
* Identifies each block's immediate dominator.
*   - Computes this in bbIDom of each BasicBlock.
*
* Computes DOM tree relation.
*   - Computes domTree as block -> set of blocks.
*   - Computes pre/post order traversal of the DOM tree.
*
* Inserts phi nodes.
*   - Computes dominance frontier as block -> set of blocks.
*   - Allocates block use/def/livein/liveout and computes it.
*   - Inserts phi nodes with only rhs at the beginning of the blocks.
*
* Renames variables.
*   - Walks blocks in evaluation order and gives uses and defs names.
*   - Gives empty phi nodes their rhs arguments as they become known while renaming.
*
* @return true if successful, for now, this must always be true.
*
* @see "A simple, fast dominance algorithm" by Keith D. Cooper, Timothy J. Harvey, Ken Kennedy.
* @see Briggs, Cooper, Harvey and Simpson "Practical Improvements to the Construction
*      and Destruction of Static Single Assignment Form."
*/
источник

PS

Peter Sovietov in Compiler Development
Вообще забавно. В интернете все друг другу советуют "книгу дракона", а в коде реальных компиляторов — ссылки на Купера :)
источник

VY

Vasiliy Yorkin in Compiler Development
Никак не получается найти эту книгу Купера на либгене...
nvm, загуглил, нашёл
источник

VY

Vasiliy Yorkin in Compiler Development
В книге Аппеля про это не написано (или я не нашёл где), но интересно, считать ли семантически корректной следующую конструкцию:
let
 function main() =
   while 1 do
     let
       function nested1() =
         break
      in
        nested1()
      end
in
 main()
end
источник

VY

Vasiliy Yorkin in Compiler Development
источник

VY

Vasiliy Yorkin in Compiler Development
Я думаю, разумно было бы сделать так, чтобы break прерывал while в таком случае (как это сделано в некоторых языках).

Мб глупый вопрос, но это мой первый блин и я не знаю, что меня ждёт дальше и насколько мне будет сложно генерировать IR с поддержкой этого.

Ну я, наверное, пока буду считать это корректным, там видно будет, если что — уберу %)
источник

МБ

Михаил Бахтерев in Compiler Development
Vasiliy Yorkin
В книге Аппеля про это не написано (или я не нашёл где), но интересно, считать ли семантически корректной следующую конструкцию:
let
 function main() =
   while 1 do
     let
       function nested1() =
         break
      in
        nested1()
      end
in
 main()
end
Ну, как бы, если это всё интерпретировать в continuation passing style, то код вполне вменяемый. Но надо аккуратно определить, что такое while и break.
источник

SS

Sergey Sikorskiy in Compiler Development
Vasiliy Yorkin
Никак не получается найти эту книгу Купера на либгене...
nvm, загуглил, нашёл
источник

VY

Vasiliy Yorkin in Compiler Development
Спасибо
источник

EG

E G in Compiler Development
Peter Sovietov
Они, например, предоставили интересные данные по скорости компиляции для вариантов без SSA и с поддержкой SSA. Любопытно было бы "столкнуть лбами" их с автором MIR, который считает, что для быстрого JIT форма SSA вредна :)
Есть где почитать об этом?
источник