Camil Demetrescu edited osr-llvm.tex  over 8 years ago

Commit id: 97147c727321b9761b10fdba37a2caa936b1dd10

deletions | additions      

       

\section{OSR in LLVM}  \label{se:osr-llvm}  In this section we discuss our implementation of the approach described in \ref{se:overview} \mysection\ref{se:overview}  in \tinyvm, a proof-of-concept virtual machine we developed as a playground to exercise our OSR techniques. TinyVM is based on LLVM's MCJIT compiler and supports interactive invocation of LLVM IR functions either generated at run-time or loaded from disk. The main design goal behind TinyVM is the creation of an interactive environment for IR manipulation and JIT-compilation of functions: for instance, it allows the user to insert OSR points in loaded functions, run optimization passes on them or display their CFGs, repeatedly invoke a function for a specified amount of times and so on. TinyVM supports dynamic library loading and linking, and comes with a helper component for MCJIT that simplifies tasks such as handling multiple IR modules, symbol resolution in presence of multiple versions of a function, and tracking native code and other machine-level generated object such as Stackmaps. To explain how \tinyvm\ works, we consider the toy example of \myfigure\ref{fi:isord-example}. Function {\tt isord} checks whether an array of numbers is sorted according to some ordering given by a comparator. We explore how to dynamically divert control to a faster version where the comparator is inlined if the number of iterations exceeds a certain threshold. To achieve this goal, we use deferred compilation by instrumenting {\tt isord} in \tinyvm\ with an open OSR, as shown in \myfigure\ref{fig:isordfrom}.