Summary

Extend the set of JVM trace events generated by the run-time compilers.

Success Metrics

No measurable performance overhead when not enabled.

Motivation

JEP 167 added infrastructure for
detailed tracing of the JVM. It introduced a basic set of useful
run-time compiler events but that set doesn't provide any information
about which optimizations were used, what the optimizations did, why
compilation failed, and so forth.

Description

Define additional events that will add more detail to the workings of the
run-time compilers, useful for testing as well as profiling.

Some compilation phase events are already emitted by C2; we will extend
C1 to emit them as well, if needed.

Compilation phase events will provide information including a compilation
identifier and a representation of the method being compiled, or its
relevant characteristics, and be emitted at the end of a phase. If a
compilation phase fails then an event describing the failure will
emitted. Phases for which we will consider adding events are:

Parsing

High-level graph

Low-level Intermediate Representation

Machine-independent code

Assembly

Events about applied optimizations will include a compilation identifier
and describe the transformations performed. The events will be emitted
when an optimization is completed. Events will be defined for, at least,
all high-level optimizations, e.g.,

Inlining

Loop unrolling

Loop peeling

Other events which affect compilation and execution of a compiled method
will also be emitted, e.g.,

Deoptimization events

Uncommon trap events

Abnormal events for:

Node max limit hit

Maximum recursion depth hit

Alternatives

The white-box testing API can be used to get this information but it has
no facility for recording events for later analysis.