  Because loops execute their body many times, compiler developers place much
emphasis on their optimization. Nevertheless, in view of highly diverse source
code and hardware, compilers still struggle to produce optimal target code. The
sheer number of possible loop optimizations, including their combinations,
exacerbates the problem further. Today's compilers use hard-coded heuristics to
decide when, whether, and which of a limited set of optimizations to apply.
Often, this leads to highly unstable behavior, making the success of compiler
optimizations dependent on the precise way a loop has been written. This paper
presents LoopLearner, which addresses the problem of compiler instability by
predicting which way of writing a loop will lead to efficient compiled code. To
this end, we train a neural network to find semantically invariant source-level
transformations for loops that help the compiler generate more efficient code.
Our model learns to extract useful features from the raw source code and
predicts the speedup that a given transformation is likely to yield. We
evaluate LoopLearner with 1,895 loops from various performance-relevant
benchmarks. Applying the transformations that our model deems most favorable
prior to compilation yields an average speedup of 1.14x. When trying the top-3
suggested transformations, the average speedup even increases to 1.29x.
Comparing the approach with an exhaustive search through all available code
transformations shows that LoopLearner helps to identify the most beneficial
transformations in several orders of magnitude less time.
