Movimiento de código invariable en bucle


En la programación de computadoras , el código invariable en bucle consiste en declaraciones o expresiones (en un lenguaje de programación imperativo ) que se pueden mover fuera del cuerpo de un bucle sin afectar la semántica del programa. El movimiento de código invariable en bucle (también llamado elevación o promoción escalar ) es una optimización del compilador que realiza este movimiento automáticamente.

Aunque el cálculo x = y + zy x * xes invariable en el ciclo, se deben tomar precauciones antes de mover el código fuera del ciclo. Es posible que la condición del bucle sea false(por ejemplo, si ntiene un valor negativo), y en tal caso, el cuerpo del bucle no debería ejecutarse en absoluto. Una forma de garantizar el comportamiento correcto es usar una rama condicional fuera del bucle. La evaluación de la condición del ciclo puede tener efectos secundarios , por lo que una evaluación adicional por parte de la ifconstrucción debe compensarse reemplazando el whileciclo con un archivo do {} while. Si el código se usó do {} whileen primer lugar, no se necesita todo el proceso de protección, ya que se garantiza que el cuerpo del ciclo se ejecutará al menos una vez.

Este código se puede optimizar aún más. Por ejemplo, la reducción de la fuerza podría eliminar las dos multiplicaciones dentro del bucle ( 6*iy a[i]), y la eliminación de la variable de inducción podría eliminarse por icompleto. Dado 6 * ique debe estar en sintonía consigo imismo, no es necesario tener ambos.

Por lo general, se utiliza un análisis de definición de alcance para detectar si una declaración o expresión es invariable en bucle.

Por ejemplo, si todas las definiciones de alcance para los operandos de alguna expresión simple están fuera del ciclo, la expresión se puede mover fuera del ciclo.

El trabajo reciente que utiliza el análisis de dependencia del flujo de datos [1] permite detectar no solo comandos invariantes sino también fragmentos de código más grandes, como un bucle interno. El análisis también detecta cuasi-invariantes de grados arbitrarios, es decir, comandos o fragmentos de código que se vuelven invariantes después de un número fijo de iteraciones del cuerpo del ciclo.