51
Local Optimizations

Local Optimizations

  • Upload
    rufina

  • View
    76

  • Download
    0

Embed Size (px)

DESCRIPTION

Local Optimizations. Code generation. Object x; int a; int b; int c ; x = new Object; a = 4; c = a + b; x.fn (a + b);. Code generation. _tmp0 = 4 ; PushParam _tmp0 ; _tmp1 = LCall _ Alloc ; PopParams 4 ; _tmp2 = Object ; *(_tmp1) = _tmp2 ; x = _tmp1 ; _tmp3 = 4 ; - PowerPoint PPT Presentation

Citation preview

Page 1: Local Optimizations

Local Optimizations

Page 2: Local Optimizations

Code generationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

Page 3: Local Optimizations

Code generationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = a + b ;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 4: Local Optimizations

Common Subexpression Elimination

• If we have two variable assignmentsv1 = a op b…v2 = a op band the values of v1, a, and b have not changed betweenthe assignments, rewrite the code asv1 = a op b…v2 = v1• Eliminates useless recalculation.• Paves the way for later optimizations.

Page 5: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = a + b ;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 6: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 7: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 8: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 9: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 10: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 11: Local Optimizations

Common Subexpression EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 12: Local Optimizations

Copy Propagation

• If we have a variable assignmentv1 = v2then as long as v1 and v2 are not reassigned,

we can rewrite expressions of the forma = … v1…

asa = … v2…

provided that such a rewrite is legal.• This will help immensely later on, as you'll see.

Page 13: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 14: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(x) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam x ;ACall _tmp7 ;PopParams 8 ;

Page 15: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(_tmp1 ) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 16: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = a + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(_tmp1 ) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 17: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(_tmp1 ) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 18: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(_tmp1 ) ;_tmp7 = *(_tmp6) ;PushParam _tmp5 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 19: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(_tmp1 ) ;_tmp7 = *(_tmp6) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 20: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = *(_tmp1) ;_tmp7 = *(_tmp6) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 21: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp6) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 22: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp6) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 23: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 24: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp3 ;_tmp4 = _tmp3 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 25: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp0 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 26: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = _tmp0 ;a = _tmp0 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 27: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 28: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = c;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam c;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 29: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 30: Local Optimizations

Copy PropagationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 31: Local Optimizations

Dead Code Elimination

• An assignment to a variable v is called dead if the value of that assignment is never read anywhere.

• Dead code elimination removes dead assignments from IR.

• Determining whether an assignment is dead depends on what variable is being assigned to and when it's being assigned.

Page 32: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 33: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;x = _tmp1 ;_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 34: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 35: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp3 = 4 ;a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 36: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 37: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

a = 4 ;_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 38: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 39: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;c = _tmp4 ;_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 40: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;

_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 41: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;

_tmp5 = _tmp4 ;_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 42: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;

_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 43: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;

_tmp6 = _tmp2 ;_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 44: Local Optimizations

Dead Code EliminationObject x;int a;int b;int c;

x = new Object;a = 4;c = a + b;x.fn(a + b);

_tmp0 = 4 ;PushParam _tmp0 ;_tmp1 = LCall _Alloc ;PopParams 4 ;_tmp2 = Object ;*(_tmp1) = _tmp2 ;

_tmp4 = _tmp0 + b ;

_tmp7 = *(_tmp2 ) ;PushParam _tmp4 ;PushParam _tmp1 ;ACall _tmp7 ;PopParams 8 ;

Page 45: Local Optimizations

Register allocation

• When generating code for arithmetic expressions, the compiler has to decide which is the best way to translate the expression in terms of number of instructions used as well as number of registers needed to evaluate a certain subtree.

• Especially in the case that free registers are scarce, the order of evaluation can be important to the length of the generated code, because different orderings may lead to larger or smaller numbers of intermediate values being spilled to memory and then restored.

Page 46: Local Optimizations

Simple Sethi–Ullman algorithm

Traverse the abstract syntax tree in pre- or postorder:– For every non-constant leaf node, assign a 1 (i.e. 1 register is

needed to hold the variable/field/etc.). For every constant leaf node (RHS of an operation – literals, values), assign a 0.

– For every non-leaf node n, assign the number of registers needed to evaluate the respective subtrees of n. • If the number of registers needed in the left subtree (l) are not

equal to the number of registers needed in the right subtree (r), the number of registers needed for the current node n is max(l, r).

• If l == r, then the number of registers needed for the current node is l + 1.

Page 47: Local Optimizations

Simple Sethi–Ullman algorithm

Page 48: Local Optimizations

Simple Sethi–Ullman algorithm

Page 49: Local Optimizations

Simple Sethi–Ullman algorithm

Code emission:– If the number of registers needed to compute the left

subtree of node n is bigger than the number of registers for the right subtree, then the left subtree is evaluated first (since it may be possible that the one more register needed by the right subtree to save the result makes the left subtree spill).

– If the right subtree needs more registers than the left subtree, the right subtree is evaluated first accordingly. If both subtrees need equal as much registers, then the order of evaluation is irrelevant.

Page 50: Local Optimizations

Simple Sethi–Ullman algorithm

*

+ +

d 3+ *

b c f g

Page 51: Local Optimizations

Simple Sethi–Ullman algorithm

∗2

+¿2¿ +¿1¿

𝑑1 30+¿1¿ ∗1

𝑏1 𝑐0 𝑓 1 𝑔0