rat: распределитель регистров на 584 строки, который обходит LLVM по качеству кода
Rat's Register Allocator
Автор компиляторного бэкенда rat заменил линейный сканер (1392 строки) на распределитель регистров методом приоритетной упаковки в 584 строки. Он обходит живые диапазоны по важности и кладёт каждый в первый подходящий регистр. Это родственник жадного распределителя LLVM, но без большинства сложных частей. Результат — лучший код: пять из шести копий исчезают, а значения, живущие через вызов, автоматически попадают в callee-saved регистры, хотя в коде распределителя об этом не сказано.
Ни одна строка в распределителе не говорит «кладите значения, пересекающие вызов, в callee-saved регистры». Это следует из дизайна, и это моя любимая часть.