The Java bytecode of the application is first converted to the Java Intermediate Representation (JIR), which is based on Static Single Assignment (SSA). Threading analysis performed on the JIR identifies potential concurrent execution and inserts instructions for multi-threading. The choice of multithreading primitives at this stage does not make assumptions about the underlying architecture or the programming model. The result is a target-independent multithreaded JIR of the program, with the necessary information to simulate its behaviour. A simulation platform, which is part of the framework, estimates performance gains of multi-threading.
The next stage in the compilation performs a set of optimisations common to different multithreaded targets, followed by stepwise refinement of the resulting intermediate format to generate target-specific assembly code. The key idea behind the optimisation and refinment phases is to delay binding to a specific target for as long as possible. This, in turn, will allow for the matching of applications to different multithreaded taregets with minimum effort in re-compilation.