В теории компиляторов анализ зависимостей создает ограничения порядка выполнения между операторами/инструкциями. В общих чертах, оператор S2 зависит от S1 , если S1 должен быть выполнен до S2 . В общих чертах существует два класса зависимостей — зависимости управления и зависимости данных .
Анализ зависимостей определяет, безопасно ли переупорядочивать или распараллеливать операторы .
Зависимость управления — это ситуация, в которой инструкция программы выполняется, если предыдущая инструкция оценивается таким образом, что позволяет ее выполнение.
Оператор S2 является зависимым от управления S1 ( записывается ) тогда и только тогда, когда выполнение S2 условно защищено S1 . Управление S2 зависит от S1 тогда и только тогда, когда где находится граница пост-доминирования утверждения . Ниже приведен пример такой зависимости управления:
S1, если x > 2, перейти к L1S2 у := 3 S3 L1: z := y + 1
Здесь S2 выполняется только в том случае, если предикат в S1 ложен.
Зависимость данных возникает из-за двух операторов, которые обращаются к одному и тому же ресурсу или изменяют его.
Оператор S2 является потокозависимым от S1 (записывается ) тогда и только тогда, когда S1 изменяет ресурс, который читает S2 , и S1 предшествует S2 в выполнении. Ниже приведен пример зависимости от потока (RAW: чтение после записи):
С1 х := 10S2 у := х + с
Оператор S2 является антизависимым от S1 (записывается ) тогда и только тогда, когда S2 изменяет ресурс, который читает S1 , и S1 предшествует S2 в выполнении. Ниже приведен пример антизависимости (WAR: Write After Read):
S1 х := у + сS2 у := 10
Здесь S2 устанавливает значение, y
а S1 считывает предыдущее значение y
.
Оператор S2 является выходным зависимым от S1 (записывается ) тогда и только тогда, когда S1 и S2 модифицируют один и тот же ресурс и S1 предшествует S2 в выполнении. Ниже приведен пример зависимости вывода (WAW: Write After Write):
С1 х := 10S2 х := 20
Здесь S2 и S1 устанавливают переменную x
.
Оператор S2 является входным зависимым от S1 (записывается ) тогда и только тогда, когда S1 и S2 читают один и тот же ресурс и S1 предшествует S2 в выполнении. Ниже приведен пример входной зависимости (RAR: Read-After-Read):
S1 у := х + 3S2 г := х + 5
Здесь S2 и S1 оба обращаются к переменной x
. Эта зависимость не запрещает переупорядочение.
Проблема вычисления зависимостей внутри циклов, которая является важной и нетривиальной проблемой, решается с помощью анализа зависимостей цикла , который расширяет приведенную здесь структуру зависимостей.