improvements to the compiler

Post on 07-Jan-2016

17 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Improvements to the Compiler. Lecture 27 Mon, Apr 26, 2004. Overflowing the Stack. Each expression leaves a value on the stack. That is because expressions are typically subexpressions of larger expressions. Their values are used in the larger expression. Example: n = n + 1; - PowerPoint PPT Presentation

TRANSCRIPT

Improvements to the Compiler

Lecture 27

Mon, Apr 26, 2004

Overflowing the Stack

Each expression leaves a value on the stack. That is because expressions are typically

subexpressions of larger expressions. Their values are used in the larger expression.

Example: n = n + 1; However, at some point, the value is no

longer needed. If we leave it on the stack, then eventually the

stack will overflow.

Example

read n;d = 2;while (d < n){ if (n % d == 0) { n = n / d; print d; } else d = d + 1;}

This loop will fail after about 500,000 iterations.

Excessive Pushing and Popping

Most expressions Begin with a pop operation, and End with a push operation.

In most cases, the value being pushed by one expression is popped immediately by the next expression, making the two operations unnecessary.

Example

n = n + 1;

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush %eaxpop %eaxpush (%eax)push $1pop %eaxpop %edxadd %edx,%eaxpush %eaxpop %eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxmov (%eax),%edxmov $1,%eaxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Example

lea n,%eaxpush %eaxlea n,%eaxpush (%eax)mov $1,%eaxpop %edxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

lea n,%eaxpush %eaxmov (%eax),%edxmov $1,%eaxadd %edx,%eaxpop %edxmov %eax,(%edx)push %eax

Eliminating Dead Code

Code that cannot be reached by any logical path is called dead code.

Dead code can be detected by looking for unlabeled statements following unconditional jumps.

Such statements are unreachable.

Eliminating Dead Code

Make one pass of the assembly language program, compiling a list of all labels that are referenced.

Make a second pass, removing all unreferenced labels.

Make a third pass removing all code occurring between unconditional jumps and the next label.

ExampleL1:# Code for ID lea 8(%ebp),%eax push %eax# Code for DEREF pop %eax push (%eax) pop %eax mov %ebp,%esp pop %ebp ret# Code for LABELL2: mov %ebp,%esp pop %ebp ret

int copy(int a){

return a;}

Remove Unreferenced LabelsL1:# Code for ID lea 8(%ebp),%eax push %eax# Code for DEREF pop %eax push (%eax) pop %eax mov %ebp,%esp pop %ebp ret# Code for LABELL2: mov %ebp,%esp pop %ebp ret

int copy(int a){

return a;}

Remove Unreferenced LabelsL1:# Code for ID lea 8(%ebp),%eax push %eax# Code for DEREF pop %eax push (%eax) pop %eax mov %ebp,%esp pop %ebp ret# Code for LABEL mov %ebp,%esp pop %ebp ret

int copy(int a){

return a;}

Find Unconditional BranchesL1:# Code for ID lea 8(%ebp),%eax push %eax# Code for DEREF pop %eax push (%eax) pop %eax mov %ebp,%esp pop %ebp ret# Code for LABEL mov %ebp,%esp pop %ebp ret

int copy(int a){

return a;}

Remove Unreachable CodeL1:# Code for ID lea 8(%ebp),%eax push %eax# Code for DEREF pop %eax push (%eax) pop %eax mov %ebp,%esp pop %ebp ret# Code for LABEL mov %ebp,%esp pop %ebp ret

int copy(int a){

return a;}

Remove Unreachable CodeL1:# Code for ID lea 8(%ebp),%eax push %eax# Code for DEREF pop %eax push (%eax) pop %eax mov %ebp,%esp pop %ebp ret

int copy(int a){

return a;}

top related