В теории компиляции исключение общих подвыражений ( CSE ) — это оптимизация компилятора , которая ищет экземпляры идентичных выражений (т. е. все они имеют одинаковое значение) и анализирует, стоит ли заменять их одной переменной, содержащей вычисленное значение. [1]
В следующем коде:
а = б * с + г;г = б * в * е;
возможно, стоит преобразовать код в:
тмп = б * с;а = тмп + г;d = tmp * e;
если стоимость хранения и извлечения tmp
меньше стоимости расчета b * c
дополнительного времени.
Возможность выполнения CSE основана на анализе доступного выражения ( анализ потока данных ). Выражение b*c
доступно в точке p в программе, если:
b*c
до достижения p ,b
или c
после оценки, но до с .Анализ затрат и выгод, выполняемый оптимизатором, вычисляет, меньше ли стоимость сохранения tmp
, чем стоимость умножения; на практике также важны другие факторы, такие как то, какие значения хранятся в каких регистрах.
Разработчики компиляторов различают два вида CSE:
Оба вида основаны на анализе потока данных , позволяющем определить, какие выражения доступны в определенных точках программы.
Этот раздел, возможно, содержит оригинальные исследования . ( Сентябрь 2017 г. ) |
Преимущества применения CSE настолько велики, что это широко используемая оптимизация.
В простых случаях, как в примере выше, программисты могут вручную исключить дублирующиеся выражения при написании кода. Самым большим источником CSE являются промежуточные последовательности кода, сгенерированные компилятором, например, для вычислений индексации массива , где разработчик не может вручную вмешаться. В некоторых случаях особенности языка могут создавать множество дублирующихся выражений. Например, макросы C , где макрорасширения могут приводить к общим подвыражениям, не очевидным в исходном коде.
Компиляторам необходимо быть благоразумными в отношении количества временных значений, создаваемых для хранения значений. Чрезмерное количество временных значений создает давление на регистры, что может привести к сбросу регистров в память, что может занять больше времени, чем простое повторное вычисление арифметического результата, когда это необходимо.
Устранение общих подвыражений.