  We present JOG, a framework that facilitates developing Java JIT peephole
optimizations alongside JIT tests. JOG enables developers to write a pattern,
in Java itself, that specifies desired code transformations by writing code
before and after the optimization, as well as any necessary preconditions. Such
patterns can be written in the same way that tests of the optimization are
already written in OpenJDK. JOG translates each pattern into C/C++ code that
can be integrated as a JIT optimization pass. JOG also generates Java tests for
optimizations from patterns. Furthermore, JOG can automatically detect possible
shadow relation between a pair of optimizations where the effect of the
shadowed optimization is overridden by another. Our evaluation shows that JOG
makes it easier to write readable JIT optimizations alongside tests without
decreasing the effectiveness of JIT optimizations. We wrote 162 patterns,
including 68 existing optimizations in OpenJDK, 92 new optimizations adapted
from LLVM, and two new optimizations that we proposed. We opened eight pull
requests (PRs) for OpenJDK, including six for new optimizations, one on
removing shadowed optimizations, and one for newly generated JIT tests; seven
PRs have already been integrated into the master branch of OpenJDK.
