Local Optimizations

Post on 22-Feb-2016

76 views 0 download

Tags:

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

Transcript of Local Optimizations

Local Optimizations

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

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

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 ;

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.

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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.

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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.

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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 ;

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.

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.

Simple Sethi–Ullman algorithm

Simple Sethi–Ullman algorithm

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.

Simple Sethi–Ullman algorithm

*

+ +

d 3+ *

b c f g

Simple Sethi–Ullman algorithm

∗2

+¿2¿ +¿1¿

𝑑1 30+¿1¿ ∗1

𝑏1 𝑐0 𝑓 1 𝑔0