http://rcor.me Rodrigo Rocha
University of Edinburgh
by
FUNCTION MERGING by SEQUENCE ALIGNMENT DOES SIZE MATTER? DOES - - PowerPoint PPT Presentation
Rodrigo Rocha http://rcor.me University of Edinburgh FUNCTION MERGING by SEQUENCE ALIGNMENT DOES SIZE MATTER? DOES SIZE MATTER? S E Y DOES SIZE MATTER? S E Y ... EMBEDDED SYSTEMS SAVINGS IN CODE Smaller Memories 1 0 1 1 0 1
http://rcor.me Rodrigo Rocha
University of Edinburgh
by
...
EMBEDDED SYSTEMS
BIN
01011 10110 1
1
1
1
1
1
1
int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Identical Code
merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Identical Code
merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Selecting Different Operands
, int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Selecting Different Operands
int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Selecting Different Operands
10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Selecting Different Operands
b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Selecting Different Operands
term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Selecting Different Operands
term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Branching to Distinct CFG
if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Branching to Distinct CFG
if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Branching to Distinct CFG
if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Combining the Return Value
if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Combining the Return Value
int if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Combining the Return Value
return result; } int if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
Combining the Return Value
return result; } int if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
return result; } int if (func_id==2) if (result==0) printf("result is zero\n"); term; b ; 10 : int term = (func_id==1)? , int func_id) { merged(int a, int b int var = a*b + int result = foo(var); printf("result: %d\n", result); int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
However... State of the Art FAILS
int f1(int a, int b) { int var = a*b + 10; int result = foo(var); printf("result: %d\n", result); return result; } void f2(int a, int b) { int var = a*b + b; int result = foo(var); printf("result: %d\n", result); if (result==0) printf("result is zero\n"); }
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
label: entry %r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 label: entry %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
Gap: -1 Mismatch: -1 Match: +2
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
0 + 2 = 2
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
0 + 2 = 2 2
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
2 -1 = 1
2
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
2 -1 = 1
2 1
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
2 1
1 2 3 4 1
1 4 5 5 6 6 6 3 6 6 3 2 4 3 2 1
1 2 3 4 5 6 7 8 3 4 5 7 8 9 10 7 9 8 9 7 5 4
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
2 1
1 2 3 4 1
1 4 5 5 6 6 6 3 6 6 3 2 4 3 2 1
1 2 3 4 5 6 7 8 3 4 5 7 8 9 10 7 9 8 9 7 5 4
Gap: -1 Mismatch: -1 Match: +2
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
2 1
1 2 3 4 1
1 4 5 5 6 6 6 3 6 6 3 2 4 3 2 1
1 2 3 4 5 6 7 8 3 4 5 7 8 9 10 7 9 8 9 7 5 4
mul add call foo call printf ret mul add call foo call printf icmp eq br label call br label ret label label
2 1
1 2 3 4 1
1 4 5 5 6 6 6 3 6 6 3 2 4 3 2 1
1 2 3 4 5 6 7 8 3 4 5 7 8 9 10 7 9 8 9 7 5 4
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: entry label: entry
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 entry b1
Renaming Table
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 entry b1
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %r0 = mul %a, %b %x0 = mul %a, %b entry b1
Renaming Table
%r0 = mul %a, %b %r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x0 = mul %a, %b %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b entry b1
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b entry b1 r0 m0 x0 m0
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %m1 = add entry b1 r0 m0 x0 m0
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %m1 = add entry b1 r0 m0 x0 m0
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %m1 = add %m0, entry b1 r0 m0 x0 m0
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %m1 = add %m0, entry b1 r0 m0 x0 m0
Renaming Table
%r1 = add %r0, 10 %r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x1 = add %x0, %b %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, entry b1 r0 m0 x0 m0
Renaming Table
%r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 entry b1 r0 m0 x0 m0 r1 m1 x1 m1
Renaming Table
%r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 entry b1 r0 m0 x0 m0 r1 m1 x1 m1
Renaming Table
%r2 = call foo(%r1) %r3 = call printf(@str,%r2) ret %r2 %x2 = call foo(%x1) %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) entry b1 r0 m0 x0 m0 r1 m1 x1 m1
Renaming Table
%r3 = call printf(@str,%r2) ret %r2 %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2
Renaming Table
%r3 = call printf(@str,%r2) ret %r2 %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2
Renaming Table
%r3 = call printf(@str,%r2) ret %r2 %x3 = call printf(@str,%x2) %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2
Renaming Table
ret %r2 %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 %x4 = icmp eq %x2, 0 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 br %x4, %if.then, %if.end label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then %x5 = call printf(@str) br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then br %if.end label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) br %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) br %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
ret %r2 label: if.then label: if.end ret void label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) br %if.end entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
label: if.then label: if.end label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) br %if.end label: b4 br %b4 br %b4 ret %r2 ret void entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
label: b4 ret %r2 ret void label: if.then label: if.end label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) br %if.end br %b4 br %b4 entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
label: if.end br %b4 label: if.then label: b1 %m0 = mul %a, %b %t0 = select %0, 10, %b %m1 = add %m0, %t0 %m2 = call foo(%m1) %m3 = call printf(@str,%m2) br %0, %b2, %b3 label: b3 label: b2 %x4 = icmp eq %m2, 0 br %x4, %if.then, %if.end %x5 = call printf(@str) br %if.end label: b4 br %b4 ret %m2 entry b1 r0 m0 x0 m0 r1 m1 x1 m1 r2 m2 x2 m2 r3 m3 x3 m3
Renaming Table
i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
float i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
double
float i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
double
float i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
float
double
float i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
float
double
float i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
float
double
float i32* i32 i1 i1 FuncID i1 i32 i32* float
double float float
i32 i32*
Function 1 Function 2
CFGs Instructions Return Types List of Parameters Operands Number of Instructions
L L V M ' s I d e n t i c a l O n l y S t a t e
A r t O u r T e c h n i q u e ( F M S A )
A l l
e d D i f f e r e n c e s
add br call
...
Estimated Upper-Bound Reduction
1 2 3 4 5 6
% LLVM SOA FMSA
CODE SIZE REDUCTION
0.1 1.5 2
% LLVM SOA FMSA
CODE SIZE REDUCTION
1 0.5
1 2 3 4 5 6
% LLVM SOA FMSA
CODE SIZE REDUCTION
2 4 6 8 10 12
% LLVM SOA FMSA C Programs C++ Programs
1 1.2
LLVM SOA FMSA
NORMALIZED RUNTIME
0.5
1.02
1 1.2
LLVM SOA FMSA
NORMALIZED COMPILE TIME
0.5
1.15
Efficient Exploration Mechanism NOVEL and POWERFUL Technique for Merging ANY Pair of Functions
https://groups.google.com/d/msg/llvm-dev/HQRg58ZCXsM/N7fbgvZgBQAJ
LLVM Dev RFC:
https://github.com/rcorcs/fmsa
Source Code:
https://reviews.llvm.org/D59442
LLVM Patch:
https://doi.org/10.1109/CGO.2019.8661174
Paper (CGO'19 ):
Rodrigo Rocha
Pavlos Petoumenos Zheng Wang Murray Cole Hugh Leather
Function Merging by Sequence Alignment
4 . p e r l b e n c h 4 1 . b z i p 2 4 3 . g c c 4 2 9 . m c f 4 3 3 . m i l c 4 4 4 . n a m d 4 4 5 . g
m k 4 4 7 . d e a l I I 4 5 . s
l e x 4 5 3 . p
r a y 4 5 6 . h m m e r 4 5 8 . s j e n g 4 6 2 . l i b q u a n t u m 4 6 4 . h 2 6 4 r e f 4 7 . l b m 4 7 1 .
n e t p p 4 7 3 . a s t a r 4 8 2 . s p h i n x 3 M e a n 20 40 60 80 100
Compilation Time (%)
Fingerprinting Ranking Linearization Alignment Code-Gen Updating Calls
Future Work: Use a greedy sequence alignment Avoid wasteful merges
Reduction (%)
1 . 4 2 . 5 6 . 6 . 2 6 . 2 6 . 3 Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10] FMSA [oracle] C R C 3 2 F F T a d p c m _ c a d p c m _ d b a s i c m a t h b i t cn t b l
f i s h _ d b l
f i s h _ e c j p e g d i j k s t r a d j p e g g h
t s c r i p t g s m i s p e l l p a t r i c i a p g p q s
t r i j n d a e l r s y n t h s h a s t r i n g s e a r c h s u s a n t y p e s e t M e a n 1 2 3 4 5
Reduction (%)
. . 1 1 . 7 1 . 7 1 . 7 1 . 7Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10] FMSA [oracle]
SPEC 2006 MiBench
4 . p e r l b e n c h 4 1 . b z i p 2 4 3 . g c c 4 2 9 . m c f 4 3 3 . m i l c 4 4 4 . n a m d 4 4 5 . g
m k 4 4 7 . d e a l I I 4 5 . s
l e x 4 5 3 . p
r a y 4 5 6 . h m m e r 4 5 8 . s j e n g 4 6 2 . l i b q u a n t u m 4 6 4 . h 2 6 4 r e f 4 7 . l b m 4 7 1 .
n e t p p 4 7 3 . a s t a r 4 8 2 . s p h i n x 3 4 8 3 . x a l a n c b m k M e a n 5 10 15 20 25 30
Reduction (%)
1 . 8 3 . 5 . 7 5 . 9 6 . 6 . 1Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10] FMSA [oracle]
SPEC 2006
4 . p e r l b e n c h 4 1 . b z i p 2 4 3 . g c c 4 2 9 . m c f 4 3 3 . m i l c 4 4 4 . n a m d 4 4 5 . g
m k 4 4 7 . d e a l I I 4 5 . s
l e x 4 5 3 . p
r a y 4 5 6 . h m m e r 4 5 8 . s j e n g 4 6 2 . l i b q u a n t u m 4 6 4 . h 2 6 4 r e f 4 7 . l b m 4 7 1 .
n e t p p 4 7 3 . a s t a r 4 8 2 . s p h i n x 3 4 8 3 . x a l a n c b m k M e a n 1 2 3 4
Normalized Time
1 . 1 . 1.15 1 . 4 7 1 . 7 4Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10]
SPEC 2006
4 . p e r l b e n c h 4 1 . b z i p 2 4 3 . g c c 4 2 9 . m c f 4 3 3 . m i l c 4 4 4 . n a m d 4 4 5 . g
m k 4 4 7 . d e a l I I 4 5 . s
l e x 4 5 3 . p
r a y 4 5 6 . h m m e r 4 5 8 . s j e n g 4 6 2 . l i b q u a n t u m 4 6 4 . h 2 6 4 r e f 4 7 . l b m 4 7 1 .
n e t p p 4 7 3 . a s t a r 4 8 2 . s p h i n x 3 4 8 3 . x a l a n c b m k M e a n 0.8 0.9 1.0 1.1 1.2
Normalized Runtime
1 . 1 . 1 . 2 1 . 3 1 . 3Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10]
SPEC 2006
1 2 3 4 5
Reduction (%)
0.50 0.75 1.00 1.10 1.20
Normalized Runtime
SoA FMSA [NO-PG] FMSA [PG-V1] FMSA [PG-V2]
SPEC 2006: 433.milc
template <int dim> unsigned int PolynomialSpace<dim>:: compute_n_pols (const unsigned int n) { unsigned int n_pols = n; for (unsigned int i=1; i<dim; ++i) { n _pols *= (n+i); n _pols /= (i+ 1); } return n_pols; } unsigned int PolynomialSpace<1>:: compute_n_pols(const unsigned int n) { return n; } template <int dim> inline unsigned int TensorProductPolynomials<dim>:: x_to_the_dim (const unsigned int x) { unsigned int y = 1; for (unsigned int d=0; d<dim; ++d) { y *= x; } return y; } unsigned int TensorProductPolynomials<1>:: x_to_the_dim(const unsigned int x) { return x; }
After template specialization and applying optimizations:
.c .c .c ...
...
FE FE FE
link
FM
BE
.o
Function Merging LTO IR
Back End
Front End
...