Вам нужно взглянуть на множественный набор идентификаторов SSA , сходящихся на узле (базовый блок). Сохраните структуру промежуточного базового блока, чтобы вы могли легко использовать (например, запрос) все идентификаторы в блоке.
Я не уверен, что вы имеете в виду под столкновением, но я предполагаю, что вы хотите решить что-то вроде
if (bExp) if (bExp)
x := 1 x1 := 1
else SSA: else
x := 2 x2 := 2
y := x; y := Phi(x1,x2)
то есть вы хотите Фи в этом месте. Поймите, что в исполняемом коде нет Фи! Используя информацию о том, что y (зависит) от x1 или x2, вы можете переписать это на следующем шаге. Например, в представлении, ориентированном на память, Phi (x1, x2) говорит вам, что x1 и x2 должны быть двумя псевдонимами в одной и той же ячейке памяти, а именно у y. Фи просто связывает информацию.
if (bExp)
stackframe[y_index] = 1 (y_index being some offset)
else
stackframe[y_index] = 2
nop
Надеюсь, это немного поможет!