Tal como la asignación de variables puede depender de otras asignaciones, el valor de una variable puede depender también del flujo de control del programa. Por ejemplo, una asignación adentro de una sentencia condicional sólo puede ocurrir si la condición se evalúa como verdadera. Lo mismo puede decirse de una asignación al interior de un ciclo; si nunca se entra en dicho ciclo, ninguna sentencia en su interior se ejecutará.
Cuando los cálculos ocurren como consecuencia del flujo de control, decimos que se trata de una dependencia de control, tal como en el código que aparece más abajo y que se explica gráficamente en Figure 1. La asignación ubicada dentro del bloque condicional puede o no ejecutarse, dependiendo del resultado de la prueba X .NE. 0. En otras palabras, el valor de Y depende del flujo de control en el código a su alrededor. Nuevamente, esto puede sonarle a usted como un asunto que sólo le importa a los diseñadores de compiladores, y no a los programadores, cosa que es mayormente cierta. Pero hay veces que usted deseará mover tales instrucciones dependientes del control, para así quitar del camino costosos cálculos (suponiendo que su compilador no sea lo suficientemente inteligente para hacerlo por usted). Por ejemplo, digamos que Figure 2 representa una pequeña sección de su programa. El flujo de control inicia en la parte superior y avanza a lo largo de dos decisiones. Por otro lado, digamos que hay una operación de raíz cuadrada en el punto de entrada, y que el flujo de control casi siempre inicia en la parte de arriba y baja por la rama que contiene la sentencia A=0.0. Ello significa que el resultado del cálculo A=SQRT(B) casi siempre se descargará, porque A obtiene un nuevo valor de 0.0 cada vez. Una operación de raíz cuadrada siempre es "cara", porque toma mucho tiempo en ejecutarse. El problema es que usted no puede simplemente quitarla de ahí, puesto que ocasionalmente se requiere. Sin embargo, puede quitarla del camino y continuar observando las dependencias e control, haciendo dos copias de la operación de raíz cuadrada a lo largo de la bifurcación menos recorrida, como se muestra en Figure 3. De esta forma el código SQRT sólo se ejecutará a lo largo de tales rutas cuando realmente se requiera.
| Dependencia de control |
|---|
![]() |
| Una pequeña sección de nuestro programa |
|---|
![]() |
Esta clase de planificación de instrucciones irá apareciendo en los compiladores (e incluso en el hardware) más y más conforme pase el tiempo. Una variante de esta técnica es calcular los resultados que se requieran en aquellos momentos donde haya una brecha en el flujo de instrucciones (debido a las dependencias), usando así algunos ciclos sobrantes, que de otro modo se desperdiciarían.
| La operación cara se movió, de forma que se ejecute pocas veces |
|---|
![]() |



Acknowledgements









