Date post: | 13-Jan-2016 |
Category: |
Documents |
Upload: | jonathan-bradford |
View: | 234 times |
Download: | 0 times |
1
Fine Slicing:Theory and Applications for Computation Extraction
Aharon Abadi,Ran Ettinger,Yishai A. FeldmanIBM Research – Haifa
2
Program Slicing
Program
x := expStart Slice x := exp
Slice
The same sequence of values
3
Example
x := 6y := 3f(x,y)x := 9y : = 2w : = x*y
x := 9y : = 2w : = x*y
x := 6y := 3
w : = x*y
w := 18x := 6y := 2f(x,y)x := 9y : = 2w : = x*yz := w
x := 9y : = 2w : = x*yz := w
w := 18
z := w
4
A:Z0A:Z0
Control-Flow Path Compression
go-to Bgo-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
A:Z0
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:go-to Bgo-to B
test X test X
. . .
L:test Y
if-zero-
. . .
go-to L
B:
. . .
if-zero-go-to A
A:Z0
Control-Flow Path Compression
6
Data-Flow Path Compression
The result is too large
The value of R7 does not depend on the loop
R7:=exp1Out: 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:=exp1Loop: R2:=R2 + 1 compare R2, R9 if-not-less-go-to Out Temp:=R7 R7:=Temp go-to Loop Out: R0:=R7 + 1
7
Control-Flow Path Compressionx<11
F T
x:=x+1 goto A4
goto A2
y<TT F
y:=y-1
goto A
print(x)
x<9T F
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
Compute the ‘Traditional’ Slicex<11
F T
x:=x+1 goto A4
goto A2
y<TT F
y:=y-1
goto A
print(x)
x<9T F
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
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
Compute the Necessary Branchesx<11
F T
x:=x+1 goto A4
goto A2
y<TT F
y:=y-1
goto A
print(x)
x<9T F
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
Start:R2:=0 R7:=exp1Loop: 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:=exp1Out:R0:=R7 + 1 +1
R7:=exp1
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
++
++
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 portholds the last valuein data port
holds the next value
d1 d2
d1
Start:R2:=0 R7:=exp1Loop: 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
exp1
entry
0
exit
++
R7
R0
R9
R2
++
R2
T F
compare R2,R9
R7:= exp1R0:=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
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
If(q)
print(x)
If(i>10)
+
If(q)
If(q) goto Skip
x := 1
goto Outx := 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
0ix := 1
x := 2
x := 1
i := 0i := 0
i := 0
16
out.println("<table border=0>");
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("</table>");
int start = page * 20;int end = start + 20;end = Math.min(end,
album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();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<Picture> pictures) {
out.println("<table border=0>");
for (int i = start; i < end; i++) {
printPicture(out,pictures.remove());
}
out.println("</table>");
}
Fine Slicing Motivating Example
Automatically extracts Out computation (The view model)
17
slice (v.): to cut with or as if with a knife
Merriam-Webster
slice (n.): a thin flat piece cut from something
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
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++
out.println("<table border=0>");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("</table>");
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
p1
p1
p2
p2
Token Semantics
21++
out.println("<table border=0>");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("</table>");
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
printPicture
Fine Slicing
22++
out.println("<table border=0>");for (int i = start; i < end; i++) { printPicture(out, picture);}out.println("</table>");
entry
println
out
out
T F
>
i
out
end
printPicture
out
out
println
i
"<table border=0>"
"</table>"
exit
printPicture
startpicture
The Fine Slice
p1 p2 p3
23++
out.println("<table border=0>");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("</table>");
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
printPicture
Co-Slicing
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
T F
>
getPicture
i
end
out
i
20
exit
startpicture
The Co-Slice
25++
entry
*
album
getPictures
size
page
min
+
start
end
T F
>
getPicture
i
end
out
i
20
exit
startpicture
++
entry
println
out
T F
>
end
out
println
i
"<table border=0>"
"</table>"
exit
printPicture
startpicture
Fine slice Co-slice
out
p1 p2 p3
A place forThe call
26
How do we distinguish between sequence of values and single value?
++
entry
println
out
out
T F
>
i
out
end
printPicture
out
out
println
i
"<table border=0>"
"</table>"
exit
printPicture
startpicture
++
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
Every cycle of controlthat passes through din does not pass through dout
Therefore
din requires singlevalue
27
++
entry
println
out
out
T F
>
i
out
end
printPicture
out
out
println
i
"<table border=0>"
"</table>"
exit
printPicture
startpicture
++
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
There is a cycle of control that passes through din and dout
Thereforedin may require multiplesingle value
How do we distinguish between sequence of values and single value?
28
out.println("<table border=0>");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("</table>");
Adding Container
void display(PrintStream out, int start,
int end, Picture picture) {
out.println("<table border=0>");
for (int i = start; i < end; i++) {
printPicture(out,picture);
}
out.println("</table>");
}
out.println("<table border=0>");int start = page * 20;int end = start + 20;end = Math.min(end, album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove());}out.println("</table>");
out.println("<table border=0>");int start = page * 20;int end = start + 20;end = Math.min(end, album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove());}out.println("</table>");
void display(PrintStream out, int start,
int end, Queue<Picture> pictures) {
out.println("<table border=0>");
for (int i = start; i < end; i++) {
printPicture(out,pictures.remove());
}
out.println("</table>");
}
29
Adding Containerout.println("<table border=0>");int start = page * 20;int end = start + 20;end = Math.min(end, album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove());}out.println("</table>");
void display(PrintStream out, int start,
int end, Queue<Picture> pictures) {
out.println("<table border=0>");
for (int i = start; i < end; i++) {
printPicture(out,pictures.remove());
}
out.println("</table>");
}
int start = page * 20;int end = start + 20;end = Math.min(end,
album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();for (int i = start; I < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); }display(out, start, end, pictures);
30++
println
>
remove
printPicture println
++
out.println("<table border=0>");int start = page * 20;int end = start + 20;end = Math.min(end, album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove());}out.println("</table>");
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
new
remove
add
picture
pictures
picture
pictures
pictures
Adding a Container
pictures
31++
println
<
remove
printPicture println
++
void display(PrintStream out, int start, int end, Queue<Picture> pictures){ out.println("<table border=0>"); for (int i = start; i < end; i++) { printPicture(out, pictures.remove()); } out.println("</table>");}
entry
println
out
out
start
T F
>
out
end
printPicture
out
println
i
"<table border=0>"
"</table>"
exit
pictures
remove
entry
i
out
The Fine Slice
pictures
pictures
picture
32++
println
>
remove
printPicture println
++
entry
println
out
*
album
getPictures
size
page
min
+ out
start
end
T F
>
getPicture
i
out
end
printPicture
out
out
println
i
"<table border=0>"
20
"</table>"
exit
new
remove
add
out.println("<table border=0>");int start = page * 20;int end = start + 20;end = Math.min(end, album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();for (int i = start; i < end; i++) { Picture picture = album.getPicture(i); pictures.add(picture); printPicture(out,pictures.remove());}out.println("</table>");
Program with
Container
pictures
pictures
pictures
pictures
picture
picture
33++
>
++
int start = page * 20;int end = start + 20;end = Math.min(end, album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();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
T F
>
getPicture
i
end
i
20
exit
newpictures
add
display
pictures
start
out
The Co-Slice
pictures
pictures
pictures
picture
34
out.println("<table border=0>");
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("</table>");
int start = page * 20;int end = start + 20;end = Math.min(end,
album.getPictures().size());Queue<Picture> pictures = new LinkedList<Picture>();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<Picture> pictures) {
out.println("<table border=0>");
for (int i = start; i < end; i++) {
printPicture(out,pictures.remove());
}
out.println("</table>");
}
Fine Slicing Motivating Example
Automatically extracts Out computation (The view model)
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("<table border=0>");
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("</table>");
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
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