Eliminación de subexpresiones comunes


En la teoría del compilador , la eliminación de subexpresiones comunes ( CSE ) es una optimización del compilador que busca instancias de expresiones idénticas (es decir, todas evalúan el mismo valor) y analiza si vale la pena reemplazarlas con una sola variable que contenga el valor calculado. [1]

La posibilidad de realizar CSE se basa en el análisis de expresión disponible (un análisis de flujo de datos ). Una expresión b*cestá disponible en un punto p en un programa si:

El análisis de costo / beneficio realizado por un optimizador calculará si el costo de la tienda tmpes menor que el costo de la multiplicación; en la práctica otros factores como qué valores se mantienen en qué registros también son significativos.

Ambos tipos se basan en el análisis del flujo de datos de qué expresiones están disponibles en qué puntos de un programa.

En casos simples como en el ejemplo anterior, los programadores pueden eliminar manualmente las expresiones duplicadas mientras escriben el código. La mayor fuente de CSE son las secuencias de código intermedias generadas por el compilador, como para los cálculos de indexación de matrices , donde el desarrollador no puede intervenir manualmente. En algunos casos, las características del lenguaje pueden crear muchas expresiones duplicadas. Por ejemplo, macros de C , donde las expansiones de macros pueden resultar en subexpresiones comunes que no son evidentes en el código fuente original.

Los compiladores deben ser juiciosos sobre el número de temporales creados para contener valores. Un número excesivo de valores temporales crea una presión de registro que posiblemente da como resultado que los registros se derramen en la memoria, lo que puede llevar más tiempo que simplemente volver a calcular un resultado aritmético cuando es necesario.