<div dir="ltr"><div><div><div><div><div>Залил набросанную пока что на коленке проверку на эквивалентность двух ssa-форм.<br><br></div>Работает вкратце так:<br></div>Исходим из предположения, что исходная форма верна. Проверям, что ни одно из имён в проверяемой не инициализируется дважды.<br></div>Затем для каждого блока сравниваем фи функции:<br></div>Строим набор фи функций для исходной формы, затем проходим по всем фи в проверяемой, и если в наборе из исходной не нашлось эквивалентной фи, то возвращаем false, иначе удаляем совпавшую. Если после этого список из исходной не пуст, возвращаем false. Проверка на эквивалентность фи - следующим образом: строим набор аргументов фи функции их исходной формы. Затем строим набор переменных, переведённых из имён проверяемой формы в исходную. Перевод осуществляется следующим образом - смотрим в блок, где переменная из проверяемой формы, ищем первую инструкцию, в которой инициализируется эта переменная, затем берём ту же по счёту инструкцию из исходной формы (Здесь, кажется, не очень красиво, надо потестить этот момент).<br><br></div>Заранее говорю, что не претендую на верность. Думаю, требует доработки, но хоть что-то.<br></div>