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