Зависимость управления — это ситуация, в которой инструкция программы выполняется, если предыдущая инструкция оценивается таким образом, что позволяет ее выполнение.
Инструкция B имеет зависимость управления от предыдущей инструкции A, если результат A определяет, должна ли B выполняться или нет. В следующем примере инструкция имеет зависимость управления от инструкции . Однако это не зависит от того, потому что выполняется всегда независимо от результата .
С1. если (а == б)С2. а = а + бС3. б = а + б
Интуитивно понятно, что между двумя утверждениями A и B существует зависимость управления, если
Типичным примером является наличие управляющих зависимостей между условной частью оператора if и операторами в его телах true/false.
Формальное определение зависимости управления можно представить следующим образом:
Говорят, что оператор является управляющим, зависящим от другого оператора , если и только если
Выраженные с помощью (пост)доминирования, эти два условия эквивалентны
Зависимости управления по сути являются границей доминирования на обратном графике графа потока управления (CFG). [1] Таким образом, одним из способов их построения было бы построить границу пост-доминирования CFG, а затем повернуть ее вспять, чтобы получить график зависимости управления.
Ниже приведен псевдокод для построения границы пост-доминирования:
для каждого X при обходе дерева постдоминатора снизу вверх выполните: PostDominanceFrontier(X) ← ∅ для каждого Y ∈ Predecessors(X) выполните: если немедленныйПостДоминатор(Y) ≠ X: тогда PostDominanceFrontier(X) ← PostDominanceFrontier(X) ∪ {Y} сделанный для каждого Z ∈ Children(X) выполните: для каждого Y ∈ PostDominanceFrontier(Z) выполните: если немедленныйПостДоминатор(Y) ≠ X: тогда PostDominanceFrontier(X) ← PostDominanceFrontier(X) ∪ {Y} сделанный сделанныйсделанный
Здесь Children(X) — это набор узлов в CFG, в которых непосредственно пост-доминирует X , а Predecessors(X) — это набор узлов в CFG, которые непосредственно предшествуют X в CFG. Обратите внимание, что узел X должен обрабатываться только после того, как будут обработаны все его дочерние элементы. После того, как карта границы пост-доминирования вычислена, ее обращение приведет к отображению узлов в CFG на узлы, которые имеют от них зависимость управления.