Generating Efficient Stack Code for Java
Abstract
Optimizing Java byte code is complicated by the fact that it uses
a stack-based execution model. Changing the intermediate representation
from the stack-based to the register-based one brings the problem of Java
byte code optimizations into well-studied domain of compiler optimizations
for register-based codes. In this paper we describe the technique to convert
a register-based code into the Java byte code. The code generation techniques
developed for the stack-based computers are not directly applicable to this
problem as the comparative cost of the local memory and stack manipulation
instructions in JVM is quite different from that in the stack-based computers.
Naive verbose translation of the register-based code into the Java byte code
produces the code with many redundant store and load instructions.
The tool that we have developed allows to remove 90-100 \% of the stores
to the local (i.e., non-global) variables. It produces the Java byte code
that is slightly faster and shorter than the original byte code even when
no optimizations except for register allocation are performed on
the register-based code.