stringtranslate.com

Зависимость от контроля

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

Инструкция 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 в узлы, которые имеют зависимость от управления.

Смотрите также

Ссылки

  1. ^ Cytron, R.; Ferrante, J.; Rosen, BK; Wegman, MN; Zadeck, FK (1989-01-01). "Эффективный метод вычисления статической формы одиночного присваивания". Труды 16-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '89 . Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 25–35. doi :10.1145/75277.75280. ISBN 0897912942. S2CID  8301431.