Evaluation of Trace Inlining Heuristics for Java
Method inlining is one of the most important optimizations in method-based just-in-time (JIT) compilers. It widens the compilation scope and therefore allows optimizing multiple methods as a whole, which increases the performance. However, if method inlining is used too frequently, the compilation time increases and too much machine code is generated. This impacts the performance negatively.
Trace-based JIT compilers only compile frequently executed paths, so-called traces, instead of whole methods. This may result in faster compilation, less generated machine code, and better optimized machine code. In previous work, we implemented a trace recording infrastructure and a trace-based compiler for Java, by modifying the Java HotSpot VM. Based on this work, we evaluate the effect of trace inlining on the performance and size of generated machine code.
Trace inlining has several major advantages when compared to method inlining. First, trace inlining is more selective than method inlining, as only frequently executed paths are inlined. Second, the recorded traces may contain information about virtual calls, which simplifies inlining. A third advantage is that trace information is context-sensitive, so that different method parts can be inlined depending on the specific call site. These advantages allow to perform aggressive inlining while the size of the generated machine code is still reasonable.