Говорят, что при преобразовании промежуточного кода в статической форме единого назначения,Быстрый расчет покорителей
Необходимо рассчитать доминаторов основных блоков
Несколько очевидный способ сделать это как неподвижная точка уравнений медленно
чтобы сделать это быстро, вам нужно использовать в достаточно сложной Lengauer-Tarján алгоритм
Я вижу первые два момента, но я не совсем понимаю, что касается третьего. В частности, есть ли какая-то причина, по которой вы не можете сделать это только в процессе вычисления дерева доминантного предзаказа? Я реализовал версию, что в JavaScript, и это, кажется, работает:
var domPreorder = [];
function doms(b) {
b.children = [];
for (var c of b[b.length - 1].targets)
if (c.i == null) {
c.i = domPreorder.length
domPreorder.push(c)
b.children.push(c)
c.parent = b
doms(c)
}
}
f[0].i = 0
domPreorder.push(f[0])
doms(f[0])
Есть некоторые недостатки этого метода, что я не вижу?
На боковой ноте вам необязательно вычислять доминанты. В сравнительно недавней статье представлен [алгоритм построения формы SSA непосредственно из байт-кода или AST] (http://compilers.cs.uni-saarland.de/papers/bbhlmz13cc.pdf). –