Говорят, что при преобразовании промежуточного кода в статическую форму одиночного присваивания
Необходимо вычислить доминаторы базовых блоков
Несколько очевидный способ сделать это в виде фиксированной точки уравнений — медленный.
Чтобы сделать это быстро, вам нужно использовать довольно сложный алгоритм Ленгауэра-Тарьяна.
Я вижу первые два пункта, но мне не ясна причина, стоящая за третьим. В частности, есть ли причина, по которой вы не можете сделать это просто в процессе вычисления дерева доминаторов предзаказа? Я реализовал версию этого в 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])
Есть ли какой-то недостаток этого метода, которого я не вижу?