Я исследовал распределение регистров и задавался вопросом, почему все они строят графики из списка живых регистров, когда может быть лучший способ сделать это. Я думаю, что они могли бы это сделать, когда количество живых регистров пересекает количество доступных регистров, тогда регистры могут быть сброшены. Вот пример (псевдосборка):
## ldi: load immediate
## addr: add registers and store in arg 2
## store: store memory at offset from stack pointer
.text
main:
# live registers: {}
ldi %t0, 12 # t0 = 12
# live registers: {t0}
ldi %t1, 8 # t1 = 8
# live registers: {t0, t1}
addr %t0, %t1 # t1 = t0 + t1
# live registers: {t1}
store -4(%sp), %t1 # -4(%sp) = t1
# live registers: {}
exit
Я выложил живые регистры в ассемблерном коде. Теперь все учебные пособия и тексты строят отсюда графики интерференции и т. Д. Но вместо этого (как я упоминал выше) они могли смотреть на живые регистры. Например, если это была машина с одним 1
регистром, тогда, когда действующие регистры равны {t0, t1}
, нам нужно будет выбрать регистр для сброса. Я считаю, что это намного проще, чем построить график и делать все остальное, чтобы проверить, не должны ли мы пролить регистры. Я знаю, что незнание не глобально (кто-то, должно быть, подумал об этом и посчитал это неподходящим), так что же я здесь не вижу?