- Пусть set R_eff всегда содержит все регистры, которые действуют в текущей позиции программы. R_eff: = {r | r - выходной регистр}. Начните с последней инструкции программы и двигайтесь назад.
- Отметить следующую предыдущую операцию в программе: регистр назначения r_dest element-of R_eff. Если такая инструкция не найдена, перейдите к 5.
- . Если операция следует непосредственно за ветвью или последовательностью ветвей, отметьте и эти инструкции. В противном случае удалите r_dest
от R_eff.
- Вставить каждый регистр источника (операнда) r_op вновь отмеченных
инструкции в R_eff, если они еще не содержатся. Перейти к 2.
- Stop. Все неотмеченные инструкции являются интронами.
Это алгоритм, который я дал, я знаю, что вопрос задавался ранее, но я не совсем уверен в некоторых вещах (и оказывается, что не так много онлайн-материалов, помогающих с этим материалом). В основном мне нужно знать, что мы сравниваем. У вас есть программа, а внутри программы есть инструкции в виде:
r0 = r1 + r2
Просто в качестве примера. Итак, я понимаю, что мы начинаем с последней инструкции и возвращаемся назад для наших сравнений. Но на шаге 2, когда говорится, что нужно двигаться назад, мы возвращаемся к непосредственно предыдущим инструкциям или же мы возвращаемся назад к инструкции с общим регистром?
Для примера, который я привел, буду ли я искать в обратном направлении, пока не найду другой r0, или я пойду назад, пока не найду r1 или r2?
Я довольно смущен этой простой вещью и был бы признателен за любую помощь, которую я могу получить