Главная
Новости
Строительство
Ремонт
Дизайн и интерьер

















Яндекс.Метрика

Нумерация значений

Нумерация значений (англ. Value Numbering) — один из видов анализа потока данных, применяемый оптимизирующим компилятором с целью обнаружения избыточных вычислений в коде (промежуточном представлении) программы. Результатами анализа могут воспользоваться оптимизации: распространение копий, удаление частичных избыточностей, удаление общих подвыражений, оптимизация условий (англ. If Optimization), inline-подстановка. Анализ разбивает множество всех рассматриваемых операций, вырабатывающих какой-либо результат (число или предикат), на подмножества операций, в каждом из которых все операции вырабатывают одинаковый результат не зависимо от ввода. Такие подмножества (а так же, иногда, номера этих подмножеств) называют классами конгруэнтности или классами эквивалентности. Классы конгруэнтности пронумерованы, номер класса конгруэнтности называют номером значения. Таким образом, задачу нумерации значений можно сформулировать следующим образом: присвоить уникальный номер каждому значению, вырабатываемому внутри рассматриваемого участка программы. Для осуществления нумерации значений может потребоваться построенный Def-Use-граф или SSA-форма. Нумерация значений может быть локальной (в пределах одного базового блока), глобальной (в пределах CFG-графа одной процедуры) и межпроцедурной.

Примеры

Алгоритмы

Применение

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

Удаление общих подвыражений

Оптимизация условий

Inline-подстановка

Inlining — оптимизация, выполняющая подстановку тела функции вместо операции её вызова (CALL). Целью преобразование является уменьшение количества передач управления, то есть уменьшение количества операций CALL и RETURN, а также более эффективная работа оптимизаций, анализирующих только одну единицу трансляции (а таких большинство). Inline нельзя применять ко всем функциям в программе. Например, если подставить вместо вызова слишком большую функцию, то размер кода может существенно возрасти. В процессе выполнения оптимизации важно найти компромисс между увеличением кода и скоростью его исполнения. Межпроцедурная нумерация значений позволяет уточнить этот анализ, так как, даже если размер подставляемой функции слишком велик, в ней могут содержаться избыточные вычисления, которые, после подстановки и дальнейшего удаления избыточностей, исчезнут. Таким образом, межпроцедурная нумерация значений позволяет нам оперировать не размером подставляемой функции, а увеличением размера кода после подстановки этой функции. Частным случаем этой оптимизации является частичный inline, при котором подставляется только часть вызываемой функции, например, содержащая самые часто выполняемые пути.