Введение

Тип оптимизации компилятора

В компьютерном программировании код, инвариантный относительно цикла, состоит из операторов или выражений (в императивном языке программирования), которые можно переместить за пределы тела цикла, не изменяя при этом семантику программы. Перемещение инвариантного кода (также называемое вынесением или продвижением скаляров) — это оптимизация компилятора, которая выполняет это перемещение автоматически.

Обнаружение неизменного кода

Обычно анализ достигающих определений используется для определения, является ли утверждение или выражение инвариантным относительно цикла. Например, если все достигающие определения операндов некоторого простого выражения находятся вне цикла, то это выражение можно вынести за пределы цикла. Недавние исследования с использованием анализа зависимостей потока данных позволяют обнаруживать не только инвариантные команды, но и более крупные фрагменты кода, такие как внутренний цикл. Анализ также выявляет квазиинварианты произвольной степени, то есть команды или фрагменты кода, которые становятся инвариантными после определенного числа итераций тела цикла.

Преимущества

Код, инвариантный относительно цикла, который был вынесен за пределы цикла, выполняется реже, что приводит к увеличению скорости работы. Другим следствием этого преобразования является возможность хранения констант в регистрах и отсутствие необходимости вычислять адрес и обращаться к памяти (или кэш-линии) на каждой итерации. Однако, если создается слишком много переменных, возникает высокая нагрузка на регистры, особенно на процессорах с небольшим количеством регистров, таких как 32-битный x86. Если компилятору не хватает регистров, некоторые переменные будут вытеснены в память. Для противодействия этому может быть выполнена обратная оптимизация – рематериализация.