2.15k likes | 2.27k Views
Optimizaciones Tradicionales. Simplificación Algebraica, Copy Propagation, y Constant Propagation. 40. Resumen. Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation. Expresiones Disponibles. Dominio conjunto de expresiones
E N D
Optimizaciones Tradicionales Simplificación Algebraica, Copy Propagation, y Constant Propagation
40 Resumen • Overview de análisis de control de flujo • Simplificación algebraica • Copy Propagation • Constant Propagation 2
Expresiones Disponibles • Dominio • conjunto de expresiones • Dirección de flujo de datos Hacia adelante • Función de flujo de datos • OUT = gen (IN - kill) • gen = { a | a se calcula en el bloque básico } • kill = { a | una variable va que es definida en el b.b. } • Operación Meet • IN = OUT • Valores iniciales conjunto entero (Top) 3
Cadena DU (Reaching Definitions) • Dominio • conjunto de definiciones • Dirección de flujo de datos Hacia adelante • Función de flujo de datos • OUT = gen (IN - kill) • gen = { x | x es definida en el statement} • kill = { x | LHS var. de x es redefinido en el statement. } • Operación Meet • IN = OUT • Valores iniciales Conjunto vacío (Bottom) 4
Framework para análisis • Análisis de control de flujo • Identificar la estructura del programa • Ayuda a construir el análisis de flujo de datos • Análisis de flujo de datos • Framework para encontrar la información necesaria para optimizar • Hasta ahora hemos encontrado • expresiones disponibles • cadenas UD y DU • ¡Ahora usemos esta información para hacer algo interesante! 5
Optimizaciones • Cada optimización es muy simple • Reduce la complejidad • Se necesitan múltiples optimizaciones • Es posible que haya que aplicar la misma optimización múltiples veces 6
40 Resumen • Overview de análisis de control de flujo • Simplificación algebraica • Copy Propagation • Constant Propagation 7
Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones 8
Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones • Ejemplo • a + 0 a • a * 1 a • a / 1 a • a * 0 0 • 0 - a -a • a + (-b) a - b • -(-a) a 9
Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones • Ejemplo • a true a • a false false • a true true • a false a 10
Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones • Ejemplo • a ^ 2 a*a • a * 2 a + a • a * 8 a << 3 11
Oportunidades para Simplificación Algebraica • En el código • Los programadores no simplifican expresiones • Los programas son más legibles con exresiones completas • Luego de la expansión del compilador • Ejemplo: Lectura de array A[8][12] va a ser expandida a: • *(Abase + 4*(12 + 8*256)) que puede ser simplificada después de otras optimizaciones 12
Utilidad de Simplificación Algebraica • Reduce el número de instrucciones • Usa expresiones menos “caras” • Habilita otras optimizaciones 13
Implementación • ¡No es una optimización de flujo de datos! • Encontrar candidatos que hagan match con las reglas de simplificación y simplificar los árboles de expresión • Los candidatos pueden no ser obvios 14
Implementación • ¡No es una optimización de flujo de datos! • Encontrar candidatos que hagan match con las reglas de simplificación y simplificar los árboles de expresión • Los candidatos pueden no ser obvios • Ejemploa + b - a + - a a b 15
Usar nuestro conocimiento de los operadores • Operadores conmutativos • a op b = b op a • Operadores asociativos • (a op b) op c = b op (a op c) 16
Forma Canónica • Poner los árboles de expresiones en forma canónica • Suma de multiplicandos • Ejemplo • (a + 3) * (a + 8) * 4 4*a*a + 44*a + 96 • La Sección 12.3.1 de la ballena habla de esto 17
Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos 18
Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos • Ejemplo • (a / b)*0 + c 19
Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos • Ejemplo • (a / b)*0 + c • Podemos simplificar esto a c 20
Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos • Ejemplo • (a / b)*0 + c • Podemos simplificar esto a c • Pero qué pasa cuándo b = 0debería ser una excepción, pero vamos a obtener un resultado 21
40 Resumen • Overview de análisis de control de flujo • Simplificación algebraica • Copy Propagation • Constant Propagation 22
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = d f = d + 2*e + c 23
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = d f = d + 2*e + c 24
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = a f = d + 2*e + c 25
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = a f = d + 2*e + c 26
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = a f = a + 2*e + c 27
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = a f = a + 2*e + c 28
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = a f = a + 2*a + c 29
Copy Propagation • Eliminar copias múltiples • propagar el valor directamente a su uso • Ejemplo a = b + c d = a e = a f = a + 2*a + c 30
Oportunidades para Copy Propagation • En código del usuario • Después de otras optimizaciones • Ejemplo: Simplificación algebraica 31
Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas 32
Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas • Ejemplo a = b + c d = a e = a f = a + 2*a + c 33
Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas • Ejemplo a = b + c d = a e = a f = a + 2*a + c 34
Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas • Ejemplo a = b + c d = a e = a f = 3*a + c 35
Ventajas de Copy Propagation • Reduce instrucciones al eliminar ops de copia • Crea código muerto que puede ser eliminado 36
Ventajas de Copy Propagation • Reduce instrucciones al eliminar ops de copia • Crea código muerto que puede ser eliminado • Ejemplo a = b + c d = a e = a f = 3*a + c 37
Ventajas de Copy Propagation • Reduce instrucciones al eliminar ops de copia • Crea código muerto que puede ser eliminado • Ejemplo a = b + c f = 3*a + c 38
Cómo hacer copy propagation • Para cada expresión RHS Para cada variable v usada en expresión RHS • si la variable v es definida por un statement v = u • reemplazar la variable v por u • En cada punto del programa hay que saber • qué variables son iguales • un elemento <u,v> está en el conjunto ssi v = u (u, v son variables) 39
Cómo hacer copy propagation • Una asignación v = u todavía es válida en un punto dado de ejecución ssi • Un statement v = u occurre en cada camino de ejecución que llega al punto actual • La variable v no es redefinida en ninguno de estos caminos de ejecución entre el statement y el punto actual • La variable u no es redefinida en ninguno de caminos de ejecución entre el statement y el punto actual • ¡un problema de flujo de datos! 40
Problema de Data-Flow paraCopy Propagation • Dominio • Conjunto de tuplas <v,u> representando un statement v = u • Dirección de flujo de datos Hacia adelante • Función de flujo de datos • OUT = gen (IN - kill) • gen = { <v,u> | v = u es el statement } • kill = { <v,u> | LHS var. del stmt. es v ó u } • Operación Meet • IN = OUT • Valores Iniciales Conjunto vacio (Bottom) 41
Ejemplo b = a c = b + 1 d = b b = d + c b = d 42
gen = { <v,u> | v = u es el statement } • kill = { <v,u> | LHS var. del stmt. es v ó u } b = a c = b + 1 d = b b = d + c b = d 43
gen = { <v,u> | v = u es el statement } • kill = { <v,u> | LHS var. del stmt. es v ó u } b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } gen = { } gen = { <d,b> } gen = { } gen = { <b,d> } 44
gen = { <v,u> | v = u es el statement } • kill = { <v,u> | LHS var. del stmt. es v ó u } b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } kill = { <d,b>, <b,d> } gen = { } kill = { } gen = { <d,b> } kill = { <b,d> } gen = { } kill = { <b,a> <d,b>, <b,d> } gen = { <b,d> } kill = { <b,a>, <d,b> } 45
OUT = gen (IN - kill) b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } kill = { <d,b>, <b,d> } gen = { } kill = { } gen = { <d,b> } kill = { <b,d> } gen = { } kill = { <b,a> <d,b>, <b,d> } gen = { <b,d> } kill = { <b,a>, <d,b> } 46
OUT = gen (IN - kill) IN = { } b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } kill = { <d,b>, <b,d> } OUT = { <b,a> } gen = { } kill = { } gen = { <d,b> } kill = { <b,d> } gen = { } kill = { <b,a> <d,b>, <b,d> } gen = { <b,d> } kill = { <b,a>, <d,b> } 47
OUT = gen (IN - kill) IN = { } b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { <b,a> } gen = { } kill = { } OUT = { <b,a> } gen = { <d,b> } kill = { <b,d> } gen = { } kill = { <b,a> <d,b>, <b,d> } gen = { <b,d> } kill = { <b,a>, <d,b> } 48
OUT = gen (IN - kill) IN = { } b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { <b,a> } gen = { } kill = { } IN = { <b,a> } gen = { <d,b> } kill = { <b,d> } OUT = { <b,a>, <d,b> } gen = { } kill = { <b,a> <d,b>, <b,d> } gen = { <b,d> } kill = { <b,a>, <d,b> } 49
OUT = gen (IN - kill) IN = { } b = a c = b + 1 d = b b = d + c b = d gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { <b,a> } gen = { } kill = { } IN = { <b,a> } gen = { <d,b> } kill = { <b,d> } IN = { <b,a>, <d,b> } gen = { } kill = { <b,a> <d,b>, <b,d> } OUT = { } gen = { <b,d> } kill = { <b,a>, <d,b> } 50