La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Analisi Interprocedurale. Tino CortesiTecniche di Analisi di Programmi 2 Chiamata di procedura Le tecniche di analisi dataflow viste finora non consideravano.

Presentazioni simili


Presentazione sul tema: "Analisi Interprocedurale. Tino CortesiTecniche di Analisi di Programmi 2 Chiamata di procedura Le tecniche di analisi dataflow viste finora non consideravano."— Transcript della presentazione:

1 Analisi Interprocedurale

2 Tino CortesiTecniche di Analisi di Programmi 2 Chiamata di procedura Le tecniche di analisi dataflow viste finora non consideravano chiamate di funzioni o procedura: sono analisi intraprocedurali. Si parla di analisi interprocedurale quando si tengono in considerazione anche chiamate di procedure e funzioni Consideriamo chiamate di procedura del tipo: [call p(a,z)] l c l r dove: a è un parametro di ingresso z è un parametro di output l c è letichetta che segna lingresso della procedura p l r è letichetta che segna luscita dalla procedura p

3 Tino CortesiTecniche di Analisi di Programmi 3 Flusso Nellanalisi intraprocedurale abbiamo usato il termine flusso per denotare insiemi di coppie di etichette (archi del grafo). Consideriamo la chiamata [call p(a,z)] l c l r dove la procedura p è definita da proc p(val x, res y) is l in S end l out ; Nel grafo di flusso interprocedurale bisognerà considerare due archi particolari: ( l c ; l in ) è il flusso che corrisponde alla chiamata di una procedura in l c, dove l in è il punto di entrata nel corpo della procedura chiamata ( l out ; l r ) è il flusso che corrisponde alluscita dal corpo della procedura in l out, ed al ritorno del controllo alla procedura chiamante (nel punto l r ).

4 Tino CortesiTecniche di Analisi di Programmi 4 Esempio La dichiarazione di una procedura è del tipo proc p(val x, res y) is l in S end l out ; proc fib(val: z,u; res: v) is 1 if [z<3] 2 then [v:=u+1] 3 else [call fib(z-1,u,v)] 4 5 ; [call fib(z-2,v,v)] 6 7 end 8 ; [call fib(x,0,y)] 9 10

5 Tino CortesiTecniche di Analisi di Programmi 5 Grafo di flusso (animazione) [call fib(x,0,y)] 9 10 [call fib(z-2,v,v)] 6 7 [call fib(z-1,u,v)] 4 5 end 8 [v:=u+1] 3 [z<3] 2 is 1

6 Tino CortesiTecniche di Analisi di Programmi 6 Grafo di flusso [call fib(x,0,y)] 9 10 [call fib(z-2,v,v)] 6 7 [call fib(z-1,u,v)] 4 5 end 8 [v:=u+1] 3 [z<3] 2 is 1

7 Tino CortesiTecniche di Analisi di Programmi 7 Equazioni dellanalisi (naif) Una formulazione naif delle equazioni di analisi dataflow potrebbe essere una semplice estensione di quella formulata per lanalisi intraprocedurale: se l E GA ( l )= lub { GA ( l ) | ( l, l ) F o ( l ; l ) F} altrimenti GA ( l )= f l ( GA ( l ) )

8 Tino CortesiTecniche di Analisi di Programmi 8 Cammini non percorribili Poiché consideriamo tutti i possibili flussi ( l, l ) F o ( l ; l ) F lanalisi risulta essere corretta. Ma niente ci impedisce nellanalisi di considerare il cammino [9, 1, 2, 4, 1, 2, 3, 8, 10] che non corrisponde a nessuna esecuzione del programma. Lanalisi risulterebbe poco precisa!

9 Tino CortesiTecniche di Analisi di Programmi 9 Cammini non percorribili [call fib(x,0,y)] 9 10 [call fib(z-2,v,v)] 6 7 [call fib(z-1,u,v)] 4 5 end 8 [v:=u+1] 3 [z<3] 2 is 1 Il cammino [9, 1, 2, 4, 1, 2, 3, 8, 10] non corrisponde a nessuna esecuzione del programma

10 Tino CortesiTecniche di Analisi di Programmi 10 Inter-flusso Definiamo il concetto di flusso interprocedurale: inter-flusso = {( l c, l in, l out, l r ) | il programma P contiene sia [call p(a,z)] l c l r cheproc p(val x, res y) is l in S end l out }

11 Tino CortesiTecniche di Analisi di Programmi 11 Flusso e inter-flusso flusso = {(1,2), (2,3), (2,4), (3,8), (4;1), (5,6), (6;1), (7,8), (8;5), (8;7), (8;10), (9;1)} inter-flusso= {(9,1,8,10), (4,1,8,5), (6,1,8,7)} [call fib(x,0,y)] 9 10 [call fib(z-2,v,v)] 6 7 [call fib(z-1,u,v)] 4 5 end 8 [v:=u+1] 3 [z<3] 2 is 1

12 Tino CortesiTecniche di Analisi di Programmi 12 Rendere esplicito il contesto Per estendere il Framework Generale allanalisi interprocedurale dovremo: codificare linformazione sui cammini (contesto) estendere lo spazio delle proprietà al contesto estendere le funzioni di transfer introducendo in particolare due funzioni di trasfer in corrispondenza di ogni flusso interprocedurale ( l c, l in, l out, l r )

13 Tino CortesiTecniche di Analisi di Programmi 13 Rendere esplicito il contesto Data unistanza (L, F, F, E,, f) del framework monotono, costruiamo una istanza del framework monotono arricchito che tiene in considerazione il contesto: (L, F, F, E,, f ), dove L = L ( ad es. = codifica dei cammini) le funzioni di transfer in F sono monotone la funzione f mappa etichette in F e E in funzioni di transfer in F : per ogni l in E o F, d in L e ogni in, la funzione di trasfer f l è definita da: f l ( d )( ) = f l ( d ( ))

14 Tino CortesiTecniche di Analisi di Programmi 14 Il frammento intraprocedurale EA ( l )= f l ( EA ( l ) ) per tutte le etichette l che non sono etichette di una chiamata di procedura, ovvero che non compaiono come primo o quarto elemento di una tupla EA ( l )= { EA ( l ) | ( l, l ) F o ( l ; l ) F} l E per tutte le etichette l, incluse quelle che sono etichette di una chiamata di procedura

15 Tino CortesiTecniche di Analisi di Programmi 15 Il frammento interprocedurale Restano da formulare le equazioni relative alle chiamate di procedura. In corrispondenza di ogni dichiarazione di procedura del tipo proc p(val x, res y) is l in S end l out abbiamo due funzioni di transfer: f l in, f l out : ( L) ( L) che possono essere ad es. lidentità: f l in ( d ) = f l out ( d ) = d

16 Tino CortesiTecniche di Analisi di Programmi 16 Il frammento interprocedurale In corrispondenza ad ogni chiamata di procedura (interflusso) ( l c, l in, l out, l r ) abbiamo due funzione di transfer: f l c ( d ): ( L) ( L) f l c,l r ( d,d ): ( L) ( L) ( L) E per ogni inter-flusso ( l c, l in, l out, l r ) avremo in più le equazioni EA ( l c )= f l c ( EA ( l c ) ) EA ( l r )= f l c,l r ( EA ( l c ), EA ( l r ) )

17 Tino CortesiTecniche di Analisi di Programmi 17 Chiamata di procedura [call p(a,z)] l c l r proc p(val x, res y) is l in end l out f l c,l r ( d,d ) d d d flc(d)flc(d)

18 Peephole Optimizations

19 Tino CortesiTecniche di Analisi di Programmi 19 guardando dallo spioncino... Un modo relativamente semplice per migliorare la qualità del codice nativo prodotto da un compilatore semplice è quello di far girare un peephole optimizer. Un peephole optimizer lavora considerando una finestrella di alcune istruzioni alla ricerca di istruzioni subottimali equivalenti. Linsieme dei patterns da osservare sono in gran parte frutto di euristiche

20 Tino CortesiTecniche di Analisi di Programmi 20 Esercizio 1. r2:= 3 * 2 2. r2:= 4 r3:= r1 + 2 r2:= 2 * r3 3. r2:= 4 r3:= r1 + r2 r3:= *r3 (assumendo r2 dead) 4. r1:=3 r2:= r1*2 5. r2:= r1 * 5 r2:= r2 + r3 r3:= r1 * 5 6. r2:= r1 r3:= r1 + r2 r2:= 5 7. r1:= r2 * 2 r3:= r4 / 2 8. r1:= r1 + 0 r2 := r2 * 1 ognuno dei seguenti frammenti di codice può essere ottimizzato. in quale codice lo trasformereste? che nome dareste a queste trasformazioni? (ce ne sono di 6 tipi!) quali analisi dataflow potrebbero supportarle? 9. r2:= r1 + 5 i := r2 r3:= i r4:=r3 * 3

21 Tino CortesiTecniche di Analisi di Programmi 21 Constant Folding il peephole optimizer può spesso accorgersi che alcuni calcoli richiesti a tempo di esecuzione possono essere realizzati a tempo di compilazione r2:= 3 * 2diventar2:=6

22 Tino CortesiTecniche di Analisi di Programmi 22 Constant Propagation A volte possiamo dire che una variabile in un certo punto del programma avrà sempre un certo valore costante. Possiamo quindi sostituire le occorrenze della variabile con occorrenze di tale costante r2:= 4r2:=4 r3:= r1 + r2 diventar3:=r1+4 diventa r3:=r1+4 r2:= 2 * r3r2:= 2*r3 r2:= 2*r3

23 Tino CortesiTecniche di Analisi di Programmi 23 Constant Propagation r2:= 4 r3:= r1 + 4 r3:= r1 + r2diventa r3:= *r3diventa r3:= *(r1+4) r3:= *r3 (assumendo che r2 sia dead) r1:=3diventa r1:= 3diventa r1:= 3 r2:= r1*2 r2:= 3*2 r2:= 6

24 Tino CortesiTecniche di Analisi di Programmi 24 Common Subexpression Elimination Quando la stessa espressione viene calcolata più di una volta nello spioncino dellottimizzatore, si può spesso eliminare la seconda computazione r2:= r1 * 5r4:= r1*5 r2:= r2 + r3diventar2:= r4 + r3 r3:= r1 * 5r3:= r4

25 Tino CortesiTecniche di Analisi di Programmi 25 Copy Propagation Anche quando non si può dire che il contenuto di una variabile sarà costante, si può osservare talvolta che la variabile b contiene sempre lo stesso valore della variabile a. In questo caso si può rimpiazzare luso di b con la variabile a fino a che né a né b vengono modificate r2:= r1 r2:= r1 r3:= r1 + r2 diventa r3:= r1+r1 diventa r3:= r1+r1 r2:= 5 r2:= 5 r2:= 5

26 Tino CortesiTecniche di Analisi di Programmi 26 Strenght Reduction Alcune istruzioni aritmetiche sono più costose di altre (ad esempio la moltiplicazione o la potenza rispetto alladdizione), e possono essere sostituite da operazioni meno costose. In particolare, la moltiplicazione e la divisione per potenze di 2 possono essere rimpiazzate, rispettivamente, con addizioni e shifts: r1:= r2 * 2 diventa r1:= r2 + r2 r3:= r4 / 2 diventa r3 >> 1

27 Tino CortesiTecniche di Analisi di Programmi 27 Eliminazione di codice inutile Istruzioni come le seguenti possono essere tout court eliminate: r1:= r1 + 0diventa r2 := r2 * 1

28 Tino CortesiTecniche di Analisi di Programmi 28 Loads e stores ridondanti il peephole optimizer può spesso accorgersi che il valore prodotto da una istruzione di load è già disponibile in un registro r2:= r1 + 5 r2:=r1+5 i := r2diventa i:= r2 r3:= ir4:= r2 * 3 r4:=r3 * 3

29 Tino CortesiTecniche di Analisi di Programmi 29 = Stringhe di chiamata Per completare lanalisi di un programma rimane da specificare linsieme che contiene linformazione di contesto, ed il valore iniziale. Ad esempio, possiamo prendere = Lab* i cui valori sono sequenze di etichette. Per ogni tupla di inter-flusso ( l c, l in, l out, l r ) f l c ( d )([, l c ])= f l c ( d ( )) dove [, l c ] denota il cammino ottenuto appendendo l c a e f l c : L L specifica come la proprietà viene modificata. f l c,l r ( d,d )( )= f l c,l r ( d ( ), d ([ l c ])) e f l c,l r : L L L permette di combinare linformazione d di contesto con d.

30 Tino CortesiTecniche di Analisi di Programmi 30 Analisi dei segni Consideriamo unanalisi volta a determinare il segno delle variabili intere. Possiamo considerare il seguente dominio Sign:{-,0,+} Possiamo considerare il reticolo L = (Var Sign) che descrive insiemi di stati astratti che mappano variabili nei loro segni possibili Ad esempio, se Var={x,y}, un elemento di L può essere = { {x +, y + }, {x -, y - }} che dice le variabili x e y sono entrambe positive oppure entrambe negative

31 Tino CortesiTecniche di Analisi di Programmi 31 Funzioni di transfer La funzione di transfer f l quando l è un comando di assegnamento del tipo [x:= a] l può essere scritta come: f l (Y) = { l ( ) | Y} dove Y (Var Sign) l ( ) = { [x/s] | s A [a](s)} A : AExp (Var Sign) (Sign) A specifica lanalisi di espressioni aritmetiche Per esercizio, specificare completamente lanalisi dei segni (intraprocedurale e interprocedurale)

32 Tino CortesiTecniche di Analisi di Programmi 32 Esercizio Specificare nei dettagli lanalisi dei segni, a partire dagli esempi 2.36 e 2.38 del libro Nielson - Nielson - Hankin (pag ), modificando in modo opportuno le equazioni della Constant Propagation Analysis Analizzare lesempio di analisi interprocedurale di Constant Propagation dellanalizzatore PAG/WWW


Scaricare ppt "Analisi Interprocedurale. Tino CortesiTecniche di Analisi di Programmi 2 Chiamata di procedura Le tecniche di analisi dataflow viste finora non consideravano."

Presentazioni simili


Annunci Google