rodrigo rocha university of edinburgh function merging · merging functions. production compilers:...

177
http://rcor.me Rodrigo Rocha University of Edinburgh by SEQUENCE ALIGNMENT FUNCTION MERGING

Upload: others

Post on 24-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

http://rcor.meRodrigo Rocha University of Edinburgh

by

SEQUENCE ALIGNMENT

FUNCTION MERGING

Page 2: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

DOES SIZE MATTER?

Page 3: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

YESDOES SIZE MATTER?

Page 4: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

...

EMBEDDED

SYSTEMS

YESDOES SIZE MATTER?

Page 5: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

BIN0101110110

10 01 1

0

1

01

0

11

SAVINGS IN CODE

Smaller Memories

COST SAVINGS

Page 6: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

HOW TO REDUCE SIZE?

Page 7: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Similar or Identical

MERGE

FUNCTIONS

HOW TO REDUCE SIZE?

Page 8: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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");}

MERGING FUNCTIONS

Page 9: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 10: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 11: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 12: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

, 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

MERGING FUNCTIONS

Page 13: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 14: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 15: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 16: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 17: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 18: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 19: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 20: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 21: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 22: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 23: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 24: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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");}

Reduces Code Size!

MERGING FUNCTIONS

Page 25: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

MERGING FUNCTIONS

Page 26: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Production compilers:

LLVM, GCC, MSVC

WHAT WE HAVE

Page 27: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Only Identical Functions

Production compilers:

LLVM, GCC, MSVC

WHAT WE HAVE

Page 28: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

The state of the art

WHAT WE HAVE

Page 29: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

significant improvement but...

The state of the art

WHAT WE HAVE

Page 30: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

MUST HAVE IDENTICAL

significant improvement but...

The state of the art

WHAT WE HAVE

Page 31: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

CFGs

MUST HAVE IDENTICAL

significant improvement but...

The state of the art

WHAT WE HAVE

Page 32: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Return typesCFGs

MUST HAVE IDENTICAL

significant improvement but...

The state of the art

WHAT WE HAVE

Page 33: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Lists of parametersReturn typesCFGs

MUST HAVE IDENTICAL

significant improvement but...

The state of the art

WHAT WE HAVE

Page 34: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Number of instructions Lists of parametersReturn typesCFGs

MUST HAVE IDENTICAL

significant improvement but...

The state of the art

WHAT WE HAVE

Page 35: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

WHAT WE WANT

Page 36: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Merge ANY two functions

WHAT WE WANT

Page 37: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Merge ANY two functions

CHOOSE when to do it

and

Merge ANY two functions

WHAT WE WANT

Page 38: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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");}

HOW WE DO IT

Page 39: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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, 0br %x4, %if.then, %if.end

IR L

evel

HOW WE DO IT

Page 40: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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, 0br %x4, %if.then, %if.end

label: if.then

%x5 = call printf(@str)br %if.end

label: if.end

ret void

HOW WE DO IT

Page 41: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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, 0br %x4, %if.then, %if.end

label: if.then

%x5 = call printf(@str)br %if.end

label: if.end

ret void

LINEARIZATION

Page 42: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

label: entry

%x0 = mul %a, %b%x1 = add %x0, %b%x2 = call foo(%x1)%x3 = call printf(@str,%x2)%x4 = icmp eq %x2, 0br %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

LINEARIZATION

Page 43: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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, 0br %x4, %if.then, %if.end

label: if.then

%x5 = call printf(@str)br %if.end

label: if.end

ret void

LINEARIZATION

Page 44: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

LINEARIZATION

Page 45: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

LINEARIZATION

Page 46: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

LINEARIZATION

Page 47: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

IDENTIFY WHAT TO MERGE

Page 48: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

IDENTIFY WHAT TO MERGE

Page 49: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 50: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 51: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 52: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 53: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 54: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 55: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 56: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 57: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 58: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 59: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 60: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 61: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 62: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 63: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Match

IDENTIFY WHAT TO MERGE

Page 64: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 65: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 66: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 67: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 68: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

Mismatch

IDENTIFY WHAT TO MERGE

Page 69: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 70: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 71: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 72: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 73: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 74: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 75: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 76: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 77: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 78: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 79: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 80: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 81: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

IDENTIFY WHAT TO MERGE

Page 82: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

G C A T - G C U

G - A T T A C A

Bioinformatics

SEQUENCE ALIGNMENT

Page 83: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

mul

add

call foo

call printf

ret

mul

add

call foo

call printf

icmp eq

br label

call

br label

ret

label

label

SEQUENCE ALIGNMENT

Page 84: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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

Mis

matc

h: -1

Matc

h: +2

SEQUENCE ALIGNMENT

Page 85: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

SEQUENCE ALIGNMENT

Page 86: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

SEQUENCE ALIGNMENT

Page 87: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

-1 -1 = -2

SEQUENCE ALIGNMENT

Page 88: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

-1 -1 = -2 -1 -1 = -2

SEQUENCE ALIGNMENT

Page 89: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

-1 -1 = -2 -1 -1 = -2 0 + 2 = 2

SEQUENCE ALIGNMENT

Page 90: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

-1 -1 = -2 -1 -1 = -2 0 + 2 = 2

2

SEQUENCE ALIGNMENT

Page 91: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

2 -1 = 1 -2 -1 = -3 -1 -1 = -2

2

SEQUENCE ALIGNMENT

Page 92: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1 -2 -3 -12-11-10-9-8-7-6-5-4

-1

-2

-3

-5

-6

-4

2 -1 = 1 -2 -1 = -3 -1 -1 = -2

2 1

SEQUENCE ALIGNMENT

Page 93: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1

-1

-2

-2

-3

-3

-12-11-10-9

-9

-8

-8

-7

-7

-6

-6

-6

-5

-5

-6

-4

-4

2 1 0 -1 -2 -3 -5-4

-5-4-3-2-1012341

0

-1

-2

-3 0

1 4

5

56

663 6

6

3

2

4 3 2 1 0 -1 -2 -3

012345678

345789107

9 89 7 5 4

SEQUENCE ALIGNMENT

Page 94: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1

-1

-2

-2

-3

-3

-12-11-10-9

-9

-8

-8

-7

-7

-6

-6

-6

-5

-5

-6

-4

-4

2 1 0 -1 -2 -3 -5-4

-5-4-3-2-1012341

0

-1

-2

-3 0

1 4

5

56

663 6

6

3

2

4 3 2 1 0 -1 -2 -3

012345678

345789107

9 89 7 5 4

SEQUENCE ALIGNMENT

Page 95: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Gap: -

1

Mis

matc

h: -1

Matc

h: +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 -1

-1

-2

-2

-3

-3

-12-11-10-9

-9

-8

-8

-7

-7

-6

-6

-6

-5

-5

-6

-4

-4

2 1 0 -1 -2 -3 -5-4

-5-4-3-2-1012341

0

-1

-2

-3 0

1 4

5

56

663 6

6

3

2

4 3 2 1 0 -1 -2 -3

012345678

345789107

9 89 7 5 4

SEQUENCE ALIGNMENT

Page 96: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

mul

add

call foo

call printf

ret

mul

add

call foo

call printf

icmp eq

br label

call

br label

ret

label

label

0 -1

-1

-2

-2

-3

-3

-12-11-10-9

-9

-8

-8

-7

-7

-6

-6

-6

-5

-5

-6

-4

-4

2 1 0 -1 -2 -3 -5-4

-5-4-3-2-1012341

0

-1

-2

-3 0

1 4

5

56

663 6

6

3

2

4 3 2 1 0 -1 -2 -3

012345678

345789107

9 89 7 5 4

SEQUENCE ALIGNMENT

Page 97: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: entrylabel: entry

CODE GENERATION

Page 98: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: b1entry b1

Renaming TableCODE GENERATION

Page 99: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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: b1entry b1

Renaming TableCODE GENERATION

Page 100: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 TableCODE GENERATION

Page 101: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 TableCODE GENERATION

Page 102: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0

Renaming TableCODE GENERATION

Page 103: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0

Renaming TableCODE GENERATION

Page 104: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0

Renaming TableCODE GENERATION

Page 105: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0

Renaming TableCODE GENERATION

Page 106: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0

Renaming TableCODE GENERATION

Page 107: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0

Renaming TableCODE GENERATION

Page 108: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0r1 m1x1 m1

Renaming TableCODE GENERATION

Page 109: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0r1 m1x1 m1

Renaming TableCODE GENERATION

Page 110: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0r1 m1x1 m1

Renaming TableCODE GENERATION

Page 111: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2

Renaming TableCODE GENERATION

Page 112: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2

Renaming TableCODE GENERATION

Page 113: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

%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 b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2

Renaming TableCODE GENERATION

Page 114: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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 b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 115: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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 b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 116: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 117: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 118: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 119: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 120: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 121: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 122: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 123: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 124: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 125: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 126: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 127: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)br %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 128: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)br %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 129: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)br %if.end

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 130: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)br %if.end

label: b4

br %b4

br %b4

ret %r2 ret void

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 131: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)br %if.end

br %b4

br %b4

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 132: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

label: if.endbr %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: b3label: b2%x4 = icmp eq %m2, 0br %x4, %if.then, %if.end

%x5 = call printf(@str)br %if.end

label: b4

br %b4

ret %m2

entry b1r0 m0x0 m0r1 m1x1 m1r2 m2x2 m2r3 m3x3 m3

Renaming TableCODE GENERATION

Page 133: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 134: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 135: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 136: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 137: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

i32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 138: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

floati32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 139: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

doublefloati32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 140: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

doublefloati32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 141: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

floatdoublefloati32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 142: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

floatdoublefloati32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 143: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

floatdoublefloati32*i32i1i1FuncID

i1 i32 i32* float

double float float i32 i32*

Function 1

Function 2

MERGING PARAMETERS

Page 144: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

WHAT WE CAN HANDLE

Page 145: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

CFGsInstructions

Return Types

List of Parameters

Operands

Number of Instructions

LLVM's

Identic

al Only

State

of A

rt Our

Technique

(FM

SA)Allowed

Differe

nces

WHAT WE CAN HANDLE

Page 146: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

PROFITABLE MERGES

Page 147: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Brute Force

PROFITABLE MERGES

Page 148: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Brute ForceBrute Force: Infeasible

PROFITABLE MERGES

Page 149: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

PROFITABLE MERGES

Page 150: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Precompute Fingerprints

PROFITABLE MERGES

Page 151: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Precompute Fingerprintsaddbr

call...

PROFITABLE MERGES

Page 152: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates

PROFITABLE MERGES

Page 153: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates

PROFITABLE MERGES

Page 154: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates EstimatedUpper-BoundReduction

PROFITABLE MERGES

Page 155: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates

PROFITABLE MERGES

Page 156: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates

PROFITABLE MERGES

Page 157: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates

PROFITABLE MERGES

Page 158: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Ranking Candidates

PROFITABLE MERGES

Page 159: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

MiBenchSPEC 2006

Benchmark Suite:

LTO with -Os

SOA: State of the Art

LLVM: Identical Only

FMSA: Our Technique

EVALUATION SETUP

Page 160: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

1

2

3

4

5

6

%

LLVMSOA

FMSA

CO

DE

SIZ

E

RE

DU

CT

ION

AVERAGE ON SPEC'06

Page 161: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

0.1

1.5

2

%

LLVMSOA

FMSA

CO

DE

SIZ

E

RE

DU

CT

ION

1

0.5

AVERAGE ON MIBENCH

Page 162: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

1

2

3

4

5

6

%

LLVMSOA

FMSA

CO

DE

SIZ

E

RE

DU

CT

ION

2

4

6

8

10

12

%

LLVMSOA

FMSA

C Programs C++ Programs

AVERAGE ON SPEC'06

Page 163: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

1

1.2

LLVM

SOA

FMSA

NORM

ALIZ

ED

RU

NT

IME

0.5

1.02

AVERAGE ON SPEC'06

Page 164: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

1

1.2

LLVM

SOA

FMSA

NORM

ALIZ

ED

CO

MP

ILE

TIM

E

0.5

1.15

AVERAGE ON SPEC'06

Page 165: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Efficient Exploration Mechanism

NOVEL and POWERFUL Technique

for Merging ANY Pair of Functions

CONCLUSION

Page 166: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

https://groups.google.com/d/msg/llvm-dev/HQRg58ZCXsM/N7fbgvZgBQAJ

LLVM Dev RFC:

https://github.com/rcorcs/fmsa

Source Code:

LINKS

https://reviews.llvm.org/D59442

LLVM Patch:

https://doi.org/10.1109/CGO.2019.8661174

Paper (CGO'19 ):

Page 167: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Rodrigo Rocha

Pavlos Petoumenos Zheng Wang Murray Cole Hugh Leather

Function Merging by Sequence Alignment

Page 168: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

400.perlbench

401.bzip2

403.gcc

429.mcf

433.milc

444.namd

445.gobmk

447.dealII

450.soplex

453.povray

456.hmmer

458.sjeng

462.libquantum

464.h264ref

470.lbm

471.omnetpp

473.astar

482.sphinx3

Mean

20

40

60

80

100

Com

pil

ati

on

Tim

e (

%)

Fingerprinting

Ranking

Linearization

Alignment

Code-Gen

Updating Calls

Compilation Breakdown

Future Work:

Use a greedy sequence alignment

Avoid wasteful merges

Page 169: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

400.perlbench

401.bzip2

403.gcc

429.mcf

433.milc

444.namd

445.gobmk

447.dealII

450.soplex

453.povray

456.hmmer

458.sjeng

462.libquantum

464.h264ref

470.lbm

471.omnetpp

473.astar

482.sphinx3

483.xalancbmkMean

0

5

10

15

20

25

Red

uct

ion

(%

)

1.4 2.

56.

0 6.2

6.2

6.3

Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10] FMSA [oracle]

CRC32FFT

adpcm_c

adpcm_d

basicmath

bitcount

blowfish_d

blowfish_e

cjpeg

dijkstr

adjpeg

ghostscrip

tgsm

ispell

patricia pgp

qsort

rijndael

rsynth sha

stringsearch

susan

typesetMean

0

1

2

3

4

5

Red

uct

ion

(%

)

0.00.

1

1.71.

71.

71.

7

Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10] FMSA [oracle]

IntelSPEC 2006

MiBench

Page 170: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

400.perlbench

401.bzip2

403.gcc

429.mcf

433.milc

444.namd

445.gobmk

447.dealII

450.soplex

453.povray

456.hmmer

458.sjeng

462.libquantum

464.h264ref

470.lbm

471.omnetpp

473.astar

482.sphinx3

483.xalancbmkMean

0

5

10

15

20

25

30

Red

uct

ion

(%

)

1.8 3.

05.

75.

96.

06.

1

Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10] FMSA [oracle]

ARMSPEC 2006

Page 171: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Compilation Time

400.perlbench

401.bzip2

403.gcc

429.mcf

433.milc

444.namd

445.gobmk

447.dealII

450.soplex

453.povray

456.hmmer

458.sjeng

462.libquantum

464.h264ref

470.lbm

471.omnetpp

473.astar

482.sphinx3

483.xalancbmkMean

0

1

2

3

4

Norm

ali

zed

Tim

e

1.0 1.

01.

151.

471.74

Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10]

SPEC 2006

Page 172: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Runtime Overhead

400.perlbench

401.bzip2

403.gcc

429.mcf

433.milc

444.namd

445.gobmk

447.dealII

450.soplex

453.povray

456.hmmer

458.sjeng

462.libquantum

464.h264ref

470.lbm

471.omnetpp

473.astar

482.sphinx3

483.xalancbmkMean

0.8

0.9

1.0

1.1

1.2

Norm

ali

zed

Ru

nti

me

1.0 1.

0 1.021.

031.

03

Identical SOA FMSA [t=1] FMSA [t=5] FMSA [t=10]

SPEC 2006

Page 173: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Profile-Guided Results

0

1

2

3

4

5

Red

uct

ion

(%

)

0.50

0.75

1.00

1.10

1.20

Norm

ali

zed

Ru

nti

me

SoA

FMSA [NO-PG]

FMSA [PG-V1]

FMSA [PG-V2]

SPEC 2006: 433.milc

Page 174: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Example: State of the Art

Page 175: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Example of Identical Functions

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> inlineunsigned 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:

Page 176: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,
Page 177: Rodrigo Rocha University of Edinburgh FUNCTION MERGING · MERGING FUNCTIONS. Production compilers: LLVM, GCC, MSVC WHAT WE HAVE. Only Identical Functions Production compilers: LLVM,

Compilation Pipeline

.c

.c

.c

...opt

...

FEFE

FE

opt

opt

link optFM BE .o

FunctionMerging

LTO

IR

} BackEnd

FrontEnd

...