Abstract
The control flow graph is a classic intermediate representation of programs in optimizing compilers for imperative languages. This representation has made it possible to formulate and develop numerous program optimizations, from the simplest to the most sophisticated.
In its original form, however, the control flow graph has two drawbacks when it comes to optimizing programs. On the one hand, many program analyses are sensitive to the naming of program variables. On the other hand, a fully control-driven execution model sometimes makes it difficult to reorder instructions.
In this talk, we'll look at some emblematic intermediate representations that aim to overcome these drawbacks. The first, SSA, uses a specific naming scheme to show some of the dependencies between instructions. The second, Sea-of-Nodes, builds on SSA and relaxes certain execution order constraints within graph regions. The result of research work, they are now successfully used in benchmark optimizing compilers. We will present their respective execution models, as well as their key semantic properties in the context of program optimization. Finally, we will present some current issues in the field, where similar intermediate representations are used to switch to a data-driven execution model.