MyTetra Share
Делитесь знаниями!
Register allocation / Аллокация регистров
Время создания: 30.10.2017 16:48
Раздел: Знания - Компьютер - Языки программирования - Компилятор
Запись: DuwazSandbox/mytetra/master/base/1509371334qwn0fkbnsc/text.html на raw.githubusercontent.com

Важной частью компилятора является аллокатор регистров. Он выполняется после планировщика (scheduler), который генерирует уже практически финальный код в машинных инструкциях, но вместо физических регистров используются виртуальные регистры.

Работа аллокатора регистров заключается в том, чтобы назначить физические регистры вместо виртуальных. Количество физических регистров ограничено, виртуальных регистров потенциально неограниченное число, поэтому физических регистов может не хватить, тогда аллокатор должен сделать спиллинг (spill) виртуального регистра, то есть вставить команду, сохраняющую значение регистра в стеке, а перед использованием этого регистра извлечь значение из стека.


Также аллокатор регистров применяет множество техник оптимизации, таких, как рематериализация констант, изменение порядка выполнения инструкций, разделение виртуального регистра на несколько и т.п.

Хорошая новость состоит в том, что в LLVM есть готовый аллокатор (и не один), не требующий доработок со стороны разработчика бэкенда, то есть он работает просто на основании описания набора регистров.

Плохая новость состоит в том, что в ряде случаев, если у вас необычная архитектура, вообще нет регистров (2-х или 3-х адресная архитектура), стековая машина или что-то такое, он работать не будет.

Вторая хорошая новость состоит в том, что даже в таких тяжёлых случаях вы можете написать свой аллокатор, причём он будет даже проще стандартного. Намного проще, ведь не нужны будут сложные алгоритмы раскраски графа, реордеринга, сплиттинга и прочего. Можно просто назначать виртуальным регистрам смещения в стеке, например.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования