Skip to content

Latest commit

 

History

History
20 lines (14 loc) · 2.47 KB

ssa_without_phi.md

File metadata and controls

20 lines (14 loc) · 2.47 KB

SSA без phi-узлов

Речь идет о варианте SSA, где используются базовые блоки с аргументами, вместо phi-узлов. В результате получается простой функциональный язык ("Functional SSA" [1]), в котором переход (jump) к выполнению очередного блока можно рассматривать, как вызов хвостовой рекурсивной функции.

Один из первых вариантов функциональной формы SSA был реализован в компиляторе MLton. В сообщении [2] Matthew Fluet описывает историю создания промежуточного представления на основе SSA и критикует подход с phi-узлами. В первую очередь, можно согласиться с тем, что функциональная форма SSA оказывается проще для понимания. В этом отношении следует указать на замечательную лекцию по началам SSA от Frank Pfenning, где изложение начинается с варианта, где используются базовые блоки с аргументами [3].

Аргументы базовых блоков используются в представлении SIL компилятора Swift [4], в Cranelift [5] и LLVM MLIR. Некоторые преимущества подхода без phi-функций указаны в документе, описывающем представление LLVM MLIR [6].

В работе [7] имеется формализация данного подхода в контексте языка Haskell, а ее критику см. в работе [8].

Источники

  1. https://www.cs.purdue.edu/homes/suresh/papers/hosc08.pdf
  2. http://mlton.org/pipermail/mlton/2007-February/029597.html
  3. https://www.cs.cmu.edu/~rjsimmon/15411-f15/lec/10-ssa.pdf
  4. https://github.com/apple/swift/blob/master/docs/SIL.rst
  5. https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/docs/ir.md
  6. https://mlir.llvm.org/docs/Rationale/Rationale/#block-arguments-vs-phi-nodes
  7. https://www.microsoft.com/en-us/research/wp-content/uploads/2016/11/compiling-without-continuations.pdf
  8. https://www.cs.purdue.edu/homes/rompf/papers/cong-icfp19.pdf