Array Index Allocation
И, наконец, алгоритм Array Index Allocation позволяет оптимизировать циклические доступы к массиву. К примеру, данный цикл: for(int i=0;i<10;i++) { a[i]; a[i+1]; }
Может быть приведен к следующему виду:
ptr = a; for(int i=0;i<10;i++) { ptr++; ptr; }
Таким образом, мы перешли от операции косвенной адресации a[i+1], к индексному регистру с автоувеличением ptr++, сэкономив на операции косвенной адресации. Для того чтобы эта оптимизация была возможна, необходимо «протаскивать» информацию о доступах к массиву и о циклах.
Вообще говоря, в некоторых архитектурах бывает возможен доступ с использованием абсолютной адресации или смещения, но и то и другое, как правило, требует каких-либо дополнительных затрат, например дополнительного командного слова для кодирования смещения, и, соответственно, задержки в выполнении. Кроме того, такие операции в дальнейшем не могут быть подвергнуты сжатию кода, поэтому обращение с использованием индексных регистров с автоувеличением / автоуменьшением оказывается предпочтительнее с точки зрения конечного качества кода.
Подробнее о реализации приведённых здесь преобразований в SPAM см. [6].