Dominância
Um bloco domina outro quando todo caminho passa por ele — e a fronteira da dominância é onde os φ vão.
No grafo de fluxo, o bloco A domina B quando todo caminho da entrada até B passa por A. Alcançar é poder chegar; dominar é não haver como chegar por outro lado. A distinção decide onde duas definições de um nome se encontram — e portanto onde o SSA põe um φ.
dataforge
adopt Arcane.Compilador as Comp
fonte := "action f(x):\n given x bigger 0:\n y := 1\n otherwise:\n y := 2\n yield y\n"
d := Comp.dominancia(fonte, "f")
assert d["dominadores"]["1"] is [0, 1] // o ramo 'sim' só é dominado pela entrada e por si
assert d["imediato"]["3"] is 0 // a junção: nenhum dos ramos a domina
assert d["fronteira"]["1"] is [3] // a dominância do ramo acaba na junção
assert d["fronteira"]["2"] is [3] // e a do outro também: ali vai o φ de 'y' | Pergunta | Campo |
|---|---|
| por quais blocos todo caminho até B passa? | dominadores |
| qual é o mais próximo deles? | imediato — a árvore de dominância |
| onde a dominância de B acaba? | fronteira — onde os φ vão |
As três respostas saem do mesmo cálculo que o SSA usa. Duas contas independentes poderiam discordar, e aí o que esta página mostra e o que o compilador faz seriam coisas diferentes. Ver SSA e o nó φ.