Download presentation
Presentation is loading. Please wait.
Published byJonathan Bradford Modified over 8 years ago
1
1 Fine Slicing: Theory and Applications for Computation Extraction Aharon Abadi,Ran Ettinger,Yishai A. Feldman IBM Research – Haifa
2
2 Program Slicing Program x := exp Start Slice x := exp Slice The same sequence of values
3
3 Example x := 6 y := 3 f(x,y) x := 9 y : = 2 w : = x*y x := 9 y : = 2 w : = x*y x := 6 y := 3 w : = x*y w := 18 x := 6 y := 2 f(x,y) x := 9 y : = 2 w : = x*y z := w x := 9 y : = 2 w : = x*y z := w w := 18 z := w
4
4 A:Z 0 Control-Flow Path Compression go-to B if-zero-go-to A test X Work in two stages: - Compute the ‘traditional’ slice - Control dependences - Data Dependences - Compute the necessary branches to prevent infeasible control paths test X if-zero-go-to A... L:test Y if-zero-... go-to L B:... B:
5
5 A:Z 0 go-to B if-zero-go-to A test X This algorithm: - preserves behavior - yields a sub-program - one version may turn conditional branches into unconditional ones (“rhetorization”) B:B: go-to B test X... L:test Y if-zero-... go-to L B:... if-zero-go-to A A:Z 0 Control-Flow Path Compression
6
6 Data-Flow Path Compression The result is too large The value of R7 does not depend on the loop R7:=exp1 Out: R0:=R7 + 1 Out: R0:= R7 + 1 Start:R2:=0 R7:=exp1 Loop: R2:=R2 + 1 compare R2, R9 if-not-less-go-to Out use R7 Temp:=R7; spill R7 to memory … ; code that uses ; all registers R7:=Temp; restore R7 go-to Loop Start:R2:=0 R7:=exp1 Loop: R2:=R2 + 1 compare R2, R9 if-not-less-go-to Out Temp:=R7 R7:=Temp go-to Loop Out: R0:=R7 + 1
7
7 Control-Flow Path Compression x<11 FT x:=x+1 goto A4 goto A2 y<T TF y:=y-1 goto A print(x) x<9 TF x:=x-1x:=x+2 goto A2 goto A3 if (x<11) x := x+1 goto A2 A1: if (y<T) y := y–1 goto A1 goto A2 goto A4 x := x-1 A4: if (x<9)goto A3 A3: x := x+2 A2: print(x)
8
8 Compute the ‘Traditional’ Slice x<11 FT x:=x+1 goto A4 goto A2 y<T TF y:=y-1 goto A print(x) x<9 TF x:=x-1x:=x+2 goto A2 goto A3 if (x<11) x := x+1 goto A2 A1: if (y<T) y := y–1 goto A1 goto A2 goto A4 x := x-1 A4: if (x<9)goto A3 A3: x := x+2 print(x) A2: print(x) x:=x+1 x:=x+2 x:=x-1 x<11 x<9 y<T
9
9 Completing Control Flow Paths: Main Lemma precisely identifies the possible sets of branches that may be added to the slice any path in the original program can be chosen optimizations can be performed All paths from the same point in the slice enter the slice at a single point
10
10 Compute the Necessary Branches x<11 FT x:=x+1 goto A4 goto A2 y<T TF y:=y-1 goto A print(x) x<9 TF x:=x-1x:=x+2 goto A2 goto A3 if(x<11) x:=x+1 goto A2 A1: if(y<T) y:=y–1 goto A1 goto A2 goto A4 x:=x-1 A4: if(x<9) goto A3 A3: x:=x+2 A2: print(x)
11
11 Start:R2:=0 R7:=exp1 Loop: R2:=R2 + 1 compare R2, R9 if-not-less-go-to Out use R7 Temp:=R7; spill R7 to ;memory … ; code that uses ;all registers R7:=Temp; restore R7 go-to Loop Out: R0:=R7 + 1 Data-Flow Path Compression R7:=exp1 Out:R0:=R7 + 1 +1 R7:=exp 1 exit R0:=R7+1 R2:=0 R2:=R2+1 compare R2,R9 if-not-less use R7 Temp:=R7 R7:=Temp goto Loop go-to Out
12
12 ++ exp1 Data-Flow Path Compression R7:=exp1 exit R7:=R7+1 R2:=0 R2:=R2+1 compare R2,R9 if-not-less use R7 Temp:=R7 R7:=Temp goto-Loop R7,Temp carry the value of exp1 Use data edges instead of variables go-to Out out data port holds the last value in data port holds the next value d1d1 d2d2 d1d1 Start:R2:=0 R7:=exp1 Loop: R2:=R2 + 1 compare R2, R9 if-not-less-go-to Out use R7 Temp:=R7; spill R7 to ; memory … ; code that uses ; all registers R7:=Temp; restore R7 go-to Loop Out: R0:=R7+1 0 The Plan Calculus: The Programmer’s Apprentice, Rich and Waters, 1990
13
13 exp1 entry 0 exit ++ R7 R0 R9 R2 ++ R2 T F compare R2,R9 R7:= exp1 R0:=R7 + 1 Start:R2:=0 Loop: R2:=R2 + 1 compare R2, R9 if-not-less-go-to Out use R7 Temp:=R7; spill R7 to ; memory … ; code that uses ; all registers R7:=Temp; restore R7 go-to Loop Out: R0:=R7 + 1 R7:=exp1 Out: R0:=R7 + 1 R7:=exp1 if-not-less use R7
14
14 exp1 0 exit ++ R7 R0 R9 R2 ++ R2 T F compare R2,R9 Start:R2:=0 Loop:R2:=R2 + 1 compare R2, R9 if-not-less- use R7 ; spill R7 to ; memory … ; code that uses ; all registers ; restore R7 go-to Loop Out: R0:=R7 + 1 R7:=exp1 if-not-less use R7 Decompression go-to Out Temp:=R7 R7:=Temp R7:=exp1 R0:=R7 + 1 go-to Out entry Out:
15
15 If(q) print(x) If(i>10) + If(q) If(q) goto Skip x := 1 goto Out x := 2Skip: Out : print(x) x := 1 If(i>10) goto Out i := i + 1 goto loop x := 2 If(q) goto Skip print(x) Loop: Skip: Out: print(x) 2 1 goto Skip goto out x := 2 x := 1 0 i x := 2 x := 1 i := 0
16
16 out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; I < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); } display(out, start, end, pictures); void display(PrintStream out, int start, int end, Queue pictures) { out.println(" "); for (int i = start; i < end; i++) { printPicture(out,pictures.remove()); } out.println(" "); } Fine Slicing Motivating Example Automatically extracts Out computation (The view model)
17
17 slice (v.): to cut with or as if with a knife Merriam-Webster slice (n.): a thin flat piece cut from something
18
18 Fine Slicing A generalization of traditional program slicing Fine slices can be precisely bounded –Slicing criteria include set of data and control dependences to ignore Fine slices are executable and extractable Complement slices (co-slices) are also fine slices Oracle-based semantics for fine slices Algorithm for computing data-structure representing the oracle
19
19 Extract Computation A new refactoring Extracts a fine slice into contiguous code Computes the co-slice Computation can then be extracted into a separate method using Extract Method Passes necessary “oracle” variables between slice and co-slice Generates new containers if series of values need to be passed
20
20 ++ out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" "); entry println out * album getPictures size page min + out start end TF < getPicture i out end printPicture out println i " 20 " exit p1p1 p1p1 p2p2 p2p2 Token Semantics
21
21 ++ out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" "); entry println out * album getPictures size page min + out start end TF < getPicture i out end printPicture out println i " 20 " exit printPicture Fine Slicing
22
22 ++ out.println(" "); for (int i = start; i < end; i++) { printPicture(out, picture); } out.println(" "); entry println out TF < i end printPicture out println i " exit printPicture start picture The Fine Slice p1p1 p2p2 p3p3
23
23 ++ out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" "); entry println out * album getPictures size page min + out start end TF < getPicture i out end printPicture out println i " 20 " exit printPicture Co-Slicing
24
24 ++ int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); } entry * album getPictures size page min + start end TF < getPicture i end out i 20 exit start picture The Co- Slice
25
25 ++ entry * album getPictures size page min + start end TF < getPicture i end out i 20 exit start picture ++ entry println out TF < end out println i " exit printPicture start picture Fine slice Co-slice out p1p1 p2p2 p3p3 A place for The call
26
26 How do we distinguish between sequence of values and single value? ++ entry println out TF < i end printPicture out println i " exit printPicture start picture Every cycle of control that passes through d in does not pass through d out Therefore d in requires single value
27
27 ++ entry println out TF < i end printPicture out println i " exit printPicture start picture There is a cycle of control that passes through d in and d out Therefore d in may require multiple single value How do we distinguish between sequence of values and single value?
28
28 out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" "); Adding Container void display(PrintStream out, int start, int end, Picture picture) { out.println(" "); for (int i = start; i < end; i++) { printPicture(out,picture); } out.println(" "); } out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove()); } out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove()); } out.println(" "); void display(PrintStream out, int start, int end, Queue pictures) { out.println(" "); for (int i = start; i < end; i++) { printPicture(out,pictures.remove()); } out.println(" "); }
29
29 Adding Container out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove()); } out.println(" "); void display(PrintStream out, int start, int end, Queue pictures) { out.println(" "); for (int i = start; i < end; i++) { printPicture(out,pictures.remove()); } out.println(" "); } int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; I < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); } display(out, start, end, pictures);
30
30 ++ println < remove printPicture println ++ out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove()); } out.println(" "); entry println out * album getPictures size page min + out start end TF < getPicture i out end printPicture out println i " 20 " exit new remove add picture pictures picture pictures Adding a Container pictures
31
31 ++ println < remove printPicture println ++ void display(PrintStream out, int start, int end, Queue pictures){ out.println(" "); for (int i = start; i < end; i++) { printPicture(out, pictures.remove()); } out.println(" "); } entry println out start TF < out end printPicture out println i " exit pictures remove entry i out The Fine Slice pictures picture
32
32 ++ println < remove printPicture println ++ entry println out * album getPictures size page min + out start end TF < getPicture i out end printPicture out println i " 20 " exit new remove add out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove()); } out.println(" "); Program with Container pictures picture
33
33 ++ < int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); } display(out, start, end, pictures); entry * album getPictures size page min + out start end TF < getPicture i end i 20 exit new pictures add display pictures start out The Co- Slice pictures picture
34
34 out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); Queue pictures = new LinkedList (); for (int i = start; I < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); } display(out, start, end, pictures); void display(PrintStream out, int start, int end, Queue pictures) { out.println(" "); for (int i = start; i < end; i++) { printPicture(out,pictures.remove()); } out.println(" "); } Fine Slicing Motivating Example Automatically extracts Out computation (The view model)
35
35 Fine Slicing Algorithm Compute the core slice by following unfiltered data and control dependence relations backwards in the plan. (Semantic Restoration) Add necessary tests to make the slice executable. out.println(" "); int start = page * 20; int end = start + 20; end = Math.min(end, album.getPictures().size()); for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); printPicture(out, picture); } out.println(" ");
36
36 Stat1; if(q){ x = x + 1;; }else{ y = x + 2; } Fine Slicing Algorithm Compute the core slice by following unfiltered data and control dependence relations backwards in the plan. (Semantic Restoration) Add necessary tests to make the slice executable. stat1 ; x = x + 1;; y = x + 2; Stat1; if(q){ x = x + 1;; }else{ y = x + 2; }
37
37 Extract Computation Get as input the program (P) and slicing criteria (SC) Compute the fine slice (FS) corresponding to P and SC Compute the Co-Slice: –Compute fine slice starting from P\FS –Disconnect the return values according to SC Add containers to the fine slice and co-slice Add the call from co-slice to the fine slice
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.