Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Data-flow Analysis: Reaching Definitions

Leandro
April 23, 2013
38

Data-flow Analysis: Reaching Definitions

Introducción al método de Reaching Definitions para el análisis de código.

Leandro

April 23, 2013
Tweet

Transcript

  1. / 16 • ¿Para qué hacemos data-flow analysis? • Optimizar

    el código. • Detectar errores. DATA-FLOW ANALYSIS 2
  2. / 16 • Es un método para detectar posibles usos

    de variables antes de ser definidas. • Es un tipo de análisis estático que determina cuales son las definiciones que pueden alcanzar un punto dado en el código. • Es un análisis hacia delante (forward). REACHING DEFINITIONS 3
  3. / 16 • Una definición de una variable x es

    una sentencia que asigna, o puede asignar, un valor a x. • Una definición d alcanza un punto p si existe un camino entre ellos tal que d no es reemplazada por otra definición. REACHING DEFINITIONS 4
  4. / 16 • Por ejemplo: • Genera una definición d

    de la variable u. • Reemplaza a todas las anteriores definiciones de u. • Deja las definiciones del resto de las variables sin modificar. • La función de transferencia de una definición d: donde = y el resto de las definiciones de u. REACHING DEFINITIONS 5 1. Introducci´ on d : u = x + y 2. Diagrama de Entidad Re 3. Modelo Relacional 4. C´ odigo de las funcionalid 1. Introducci´ on fd(x) = gend [ (x killd) 2. Diagrama de Entidad Relaci´ o 1. Introducci´ on gend {d} killd 1. Introducci´ on gend {d} killd genB1 = {d1, d2, d3 } 1. Introducci´ on gend {d} killd genB1 = {d1, d2, d3 } killB1 = {}
  5. / 16 • ¿Cómo determinamos las definiciones para todo el

    código? REACHING DEFINITIONS 6 - Calculamos gen y kill para cada bloque - out[entry] = ∅ - Por cada bloque B que no sea entry: out[B] = ∅ - Mientas (algún out[] cambie) Por cada bloque B que no sea entry in[B] = U(out[p]), para todos los predecesores p de B out[B] = fB(in[B])
  6. / 16 7 ENTRY '----- gen = { d6 1

    B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4
  7. / 16 8 ENTRY '----- gen = { d6 1

    B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 1. Introducci´ on genB1 = {d1, d2, d3 } killB1 = {} genB2 = {d4, d5 } killB2 = {d1, d2 } genB3 = {d6 } killB3 = {d3 } genB4 = {d7 } killB4 = {d1, d4 } genB2 = {d4, d5 } killB2 = {d1, d2, d7 } 2. Diagrama de En 3. Modelo Relacio 1. Introducci´ on genB1 = {d1, d2, d3 } killB1 = {} genB2 = {d4, d5 } killB2 = {d1, d2 } genB3 = {d6 } killB3 = {d3 } genB4 = {d7 } killB4 = {d1, d4 } genB2 = {d4, d5 } killB2 = {d1, d2, d7 } 1. Introducci´ on genB1 = {d1, d2, d3 } killB1 = {} genB2 = {d4, d5 } killB2 = {d1, d2 } genB3 = {d6 } killB3 = {d3 } genB4 = {d7 } killB4 = {d1, d4 } genB2 = {d4, d5 } killB2 = {d1, d2, d7 } 1. Introducci´ on genB1 = {d1, d2, d3 } killB1 = {} genB2 = {d4, d5 } killB2 = {d1, d2 } genB3 = {d6 } killB3 = {d3 } genB4 = {d7 } killB4 = {d1, d4 } genB2 = {d4, d5 } killB2 = {d1, d2, d7 } 2. Diagrama de Ent 3. Modelo Relacion 4. C´ odigo de las fun killB1 = {d4, d5, d6, d7 } 1. Introducci´ on Intro...
  8. / 16 9 ENTRY '----- gen = { d6 1

    B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 gB2 = {d4, d5 } kB2 = {d1, d2, d7 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, gB2 = {d4, d5 } kB2 = {d1, d2, d7 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } fBi (x) = genBi [ (x killBi ) 1. Introducci´ on Intro... gB4 = {d7 } kB4 = {d1 , d4 } fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) 1. Introducci´ on Intro... B4 7 B4 1 4 fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; 1. Introducci´ on Intro... f Bi ( x ) = gen Bi [ ( x kill Bi ) IN [ B ] = S p predecesor de B OUT [ p ] OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 , d6 } OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } 1. Introducci´ on Intro...
  9. / 16 10 ENTRY '----- gen = { d6 1

    B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } fBi (x) = genBi [ (x killBi ) 1. Introducci´ on Intro... gB4 = {d7 } kB4 = {d1 , d4 } fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) 1. Introducci´ on Intro... B4 7 B4 1 4 fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 gB2 = {d4, d5 } kB2 = {d1, d2, d7 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, gB2 = {d4, d5 } kB2 = {d1, d2, d7 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } 1. Introducci´ on Intro... killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, d6, d7 } gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } killB1 = {d4, d5, d6, d7 } gB1 = {d1, d2, d3 } kB1 = {d4, d5, gB2 = {d4, d5 } kB2 = {d1, d2, d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1, d4 } gB4 = {d7 } kB4 = {d1 , d4 } fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } 1. Introducci´ on Intro... gB2 = {d4 , d5 } kB2 = {d1 , d2 , d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1 , d4 } fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 } OUT [ B3] = {d4 , d5 , d6 } 1. Introducci´ on Intro... gB1 = {d1 , d2 , d3 } kB1 = {d4 , d5 , d6 , d7 } gB2 = {d4 , d5 } kB2 = {d1 , d2 , d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1 , d4 } fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 } OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } gB3 = {d6 } kB3 = {d3 } gB4 = {d7 } kB4 = {d1 , d4 } fBi ( x ) = genBi [ ( x killBi ) OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 , d6 } OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } 1. Introducci´ on Intro... f Bi ( x ) = gen Bi [ ( x kill Bi ) IN [ B ] = S p predecesor de B OUT [ p ] OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 , d6 } OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } 1. Introducci´ on Intro...
  10. / 16 • ¿Cómo hacemos para detectar variables usadas antes

    de ser definidas? REACHING DEFINITIONS 11
  11. / 16 • ¿Cómo hacemos para detectar variables usadas antes

    de ser definidas? Agregamos una definición ficticia de la variable a testear y vemos si llegamos a un posible uso. REACHING DEFINITIONS 12
  12. / 16 13 604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS ENTRY '-----

    gen = { d6 1 B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 Figure 9.13: Flow graph for illustrating reaching definitions 604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS ENTRY '----- gen = { d6 1 B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 Figure 9.13: Flow graph for illustrating reaching definitions OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } d0 : u 3 = 1 1. Introducci´ on Intro...
  13. / 16 14 604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS ENTRY '-----

    gen = { d6 1 B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 Figure 9.13: Flow graph for illustrating reaching definitions 604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS ENTRY '----- gen = { d6 1 B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 Figure 9.13: Flow graph for illustrating reaching definitions OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } d0 : u 3 = 1 1. Introducci´ on Intro... f Bi ( x ) = gen Bi [ ( x kill Bi ) IN [ B ] = S p predecesor de B OUT [ p ] OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 , d6 } OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } d0 : u 3 = 1 IN [ B4] = {d0 , ...} 1. Introducci´ on . . .
  14. / 16 15 604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS ENTRY '-----

    gen = { d6 1 B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 Figure 9.13: Flow graph for illustrating reaching definitions 604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS ENTRY '----- gen = { d6 1 B3 kill ={4} B3 senB4 = { d, 1 kill = { dl, d4 } B4 Figure 9.13: Flow graph for illustrating reaching definitions OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } d0 : u 3 = 1 1. Introducci´ on Intro... f Bi ( x ) = gen Bi [ ( x kill Bi ) IN [ B ] = S p predecesor de B OUT [ p ] OUT [ B ] = f ( IN [ B ]) OUT [ entry ] = ; OUT [ B1] = {d1 , d2 , d3 } OUT [ B2] = {d3 , d4 , d5 , d6 } OUT [ B3] = {d4 , d5 , d6 } OUT [ B4] = {d3 , d5 , d6 , d7 } d0 : u 3 = 1 IN [ B4] = {d0 , ...} 1. Introducci´ on Oops! Llegué a un uso de la definición ficticia... . . .
  15. / 16 RESUMIENDO • Ataca el problema de uso de

    variables no definidas. • Genera el conjunto de definiciones para cada punto del código. • Análisis forward. • Función de transferencia: 16 kill B1 = {d4 , d5 , d6 , d7 } g B1 = {d1 , d2 , d3 } k B1 = {d4 , d5 , d6 , d7 } g B2 = {d4 , d5 } k B2 = {d1 , d2 , d7 } g B3 = {d6 } k B3 = {d3 } g B4 = {d7 } k B4 = {d1 , d4 } f Bi ( x ) = gen Bi [ ( x kill Bi ) IN [ B ] = S p predecesor de B OUT [ p ]