Исключение общего подвыражения - Common subexpression elimination
В теория компилятора, исключение общего подвыражения (CSE) это оптимизация компилятора который ищет экземпляры идентичных выражения (т.е. все они оценивают одно и то же значение) и анализирует, стоит ли заменять их одной переменной, содержащей вычисленное значение.[1]
Пример
В следующем коде:
а = b * c + g; d = b * c * e;
возможно, стоит преобразовать код в:
tmp = b * c; a = tmp + g; d = tmp * e;
если стоимость хранения и извлечения tmp
меньше затрат на расчет до н.э
дополнительное время.
Принцип
Возможность выполнения CSE основана на доступное выражение анализ (а анализ потока данных ). Выражение до н.э
доступен в точке п в программе, если:
- каждый путь от начального узла до p оценивает
до н.э
до достижения п, - и нет назначений на
б
или жеc
после оценки, но до п.
Анализ затрат и выгод, выполняемый оптимизатором, позволяет рассчитать, снизится ли стоимость магазина. tmp
меньше стоимости умножения; на практике также имеют значение другие факторы, например, какие значения хранятся в каких регистрах.
Авторы компилятора различают два вида CSE:
- устранение местного общего подвыражения работает в рамках единого базовый блок
- глобальное исключение общего подвыражения работает над всей процедурой,
Оба типа полагаются на анализ потока данных какие выражения доступны в каких точках программы.
Преимущества
Эта секция возможно содержит оригинальные исследования.Сентябрь 2017 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Преимущества выполнения CSE достаточно велики, поэтому это часто используемая оптимизация.
В простых случаях, как в примере выше, программисты могут вручную удалить повторяющиеся выражения при написании кода. Самым большим источником CSE являются промежуточные кодовые последовательности, генерируемые компилятором, например, для множество расчеты индексации, при которых разработчик не может вмешаться вручную. В некоторых случаях языковые функции могут создавать множество повторяющихся выражений. Например, C макросы, где расширения макросов могут привести к общим подвыражениям, не видимым в исходном исходном коде.
Компиляторы должны быть осторожны с количеством временных файлов, созданных для хранения значений. Чрезмерное количество временных значений создает регистрировать давление возможно в результате регистры разлива в память, что может занять больше времени, чем просто пересчет арифметического результата, когда это необходимо.
Смотрите также
Рекомендации
- ^ Стивен Мучник; Muchnick and Associates (15 августа 1997 г.). Расширенная реализация проекта компилятора. Морган Кауфманн. ISBN 978-1-55860-320-2.
Исключение общего подвыражения.
- Стивен С. Мучник, Расширенный дизайн и реализация компилятора (Морган Кауфманн, 1997) стр. 378–396
- Джон Кок. «Устранение глобального общего подвыражения». Материалы симпозиума по построению компиляторов, Уведомления ACM SIGPLAN 5 (7), июль 1970 г., стр. 850-856.
- Бриггс, Престон, Купер, Кейт Д. и Симпсон, Л. Тейлор. "Нумерация значений." Программное обеспечение - практика и опыт, 27 (6), июнь 1997 г., стр. 701-724.