La dependencia de control es una situación en la que una instrucción de un programa se ejecuta si la instrucción anterior se evalúa de manera que permita su ejecución.
Una instrucción B tiene una dependencia de control de una instrucción precedente A si el resultado de A determina si B debe ejecutarse o no. En el siguiente ejemplo, la instruccióntiene una dependencia de control de la instrucción. Sin embargo,no depende deporquesiempre se ejecuta independientemente del resultado de.
S1. si (a == b) S2. a = a + b S3. b = a + b
Intuitivamente, existe una dependencia de control entre dos enunciados A y B si
- B podría ejecutarse después de A.
- El resultado de la ejecución de A determinará si B se ejecutará o no.
Un ejemplo típico es que existen dependencias de control entre la parte condicional de una instrucción if y las instrucciones en sus cuerpos verdadero/falso.
Una definición formal de dependencia de control puede presentarse de la siguiente manera:
Una declaraciónSe dice que el control depende de otra declaración.si y solo si
- existe un caminodeade tal manera que cada declaración≠dentroserá seguido poren cada posible ruta hacia el final del programa y
- no necesariamente será seguido por, es decir, existe una ruta de ejecución desdehasta el final del programa que no pasa.
Expresadas con la ayuda de la (post)dominancia, las dos condiciones son equivalentes a
- La post-domina todo
- no postdomina
Construcción de dependencias de control
Las dependencias de control son esencialmente la frontera de dominancia en el grafo inverso del grafo de flujo de control (GFC). [ 1 ] Por lo tanto, una forma de construirlas sería construir la frontera de post-dominancia del GFC y luego invertirla para obtener un grafo de dependencia de control.
A continuación se presenta un pseudocódigo para construir la frontera de post-dominancia:
Para cada X en un recorrido ascendente del árbol postdominador, haga lo siguiente : PostDominanceFrontier(X) ← ∅ para cada Y ∈ Predecesores(X) hacer : si Postdominador inmediato(Y) ≠ X: entonces PostfronteraDominancia(X) ← PostfronteraDominancia(X) ∪ {Y} hecho para cada Z ∈ Hijos(X) hacer : para cada Y ∈ PostfronteraDominancia(Z) hacer : si Postdominador inmediato(Y) ≠ X: entonces PostfronteraDominancia(X) ← PostfronteraDominancia(X) ∪ {Y} hecho hecho hecho hechoAquí, Children(X) es el conjunto de nodos en la CFG que son inmediatamente postdominados por X , y Predecessors(X) es el conjunto de nodos en la CFG que preceden directamente a X en la CFG. Cabe destacar que el nodo X se procesará solo después de que todos sus Hijos hayan sido procesados. Una vez calculado el mapa de frontera de postdominancia, al invertirlo se obtendrá un mapa de los nodos en la CFG a los nodos que tienen una dependencia de control sobre ellos.
Véase también
Referencias
- ↑ Cytron, R.; Ferrante, J.; Rosen, BK; Wegman, MN; Zadeck, FK (1989-01-01). "Un método eficiente para calcular la forma de asignación única estática". Actas del 16.º simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación - POPL '89 . Nueva York, NY, EE. UU.: ACM. págs. 25–35 . doi : 10.1145/75277.75280 . ISBN 0897912942. S2CID 8301431 .
- Compiladores