260 likes | 346 Views
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;
E N D
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 • This loop will fail after about 500,000 iterations. read n; d = 2; while (d < n) { if (n % d == 0) { n = n / d; print d; } else d = d + 1; }
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 lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax n = n + 1;
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push %eax pop %eax push (%eax) push $1 pop %eax pop %edx add %edx,%eax push %eax pop %eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax mov (%eax),%edx mov $1,%eax add %edx,%eax pop %edx mov %eax,(%edx) push %eax
Example lea n,%eax push %eax lea n,%eax push (%eax) mov $1,%eax pop %edx add %edx,%eax pop %edx mov %eax,(%edx) push %eax lea n,%eax push %eax mov (%eax),%edx mov $1,%eax add %edx,%eax pop %edx mov %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.
Example L1: # 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 L2: mov %ebp,%esp pop %ebp ret int copy(int a) { return a; }
Remove Unreferenced Labels L1: # 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 L2: mov %ebp,%esp pop %ebp ret int copy(int a) { return a; }
Remove Unreferenced Labels L1: # 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 Branches L1: # 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 Code L1: # 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 Code L1: # 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; }