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