  Function layout, also referred to as function reordering or function
placement, is one of the most effective profile-guided compiler optimizations.
By reordering functions in a binary, compilers are able to greatly improve the
performance of large-scale applications or reduce the compressed size of mobile
applications. Although the technique has been studied in the context of
large-scale binaries, no recent study has investigated the impact of function
layout on mobile applications.
  In this paper we develop the first principled solution for optimizing
function layouts in the mobile space. To this end, we identify two important
optimization goals, the compressed code size and the cold start-up time of a
mobile application. Then we propose a formal model for the layout problem,
whose objective closely matches the goals. Our novel algorithm to optimize the
layout is inspired by the classic balanced graph partitioning problem. We
carefully engineer and implement the algorithm in an open source compiler,
LLVM. An extensive evaluation of the new method on large commercial mobile
applications indicates up to 2% compressed size reduction and up to 3% start-up
time improvement on top of the state-of-the-art approach.
