Open-source •
Mono uses SSA in its JIT compiler called Mini •
WebKit uses SSA in its JIT compilers. •
Swift defines its own SSA form above LLVM IR, called SIL (Swift Intermediate Language). • The
Erlang compiler was rewritten in OTP 22.0 to "internally use an intermediate representation based on Static Single Assignment (SSA)", with plans for further optimizations built on top of SSA in future releases. • The
LLVM Compiler Infrastructure uses SSA form for all scalar register values (everything except memory) in its primary code representation. SSA form is only eliminated once register allocation occurs, late in the compile process (often at link time). • The
GNU Compiler Collection (GCC) makes extensive use of SSA since version 4 (released in April 2005). The
frontends generate "
GENERIC" code that is then converted into "
GIMPLE" code by the "gimplifier". High-level optimizations are then applied on the SSA form of "GIMPLE". The resulting optimized intermediate code is then translated into
RTL, on which low-level optimizations are applied. The architecture-specific
backends finally turn RTL into
assembly language. •
Go (1.7: for
x86-64 architecture only; 1.8: for all supported architectures). •
IBM's open source adaptive
Java virtual machine,
Jikes RVM, uses extended Array SSA, an extension of SSA that allows analysis of scalars, arrays, and object fields in a unified framework. Extended Array SSA analysis is only enabled at the maximum optimization level, which is applied to the most frequently executed portions of code. • The
Mozilla Firefox SpiderMonkey JavaScript engine uses SSA-based IR. • The
Chromium V8 JavaScript engine implements SSA in its Crankshaft compiler infrastructure as announced in December 2010 •
PyPy uses a linear SSA representation for traces in its JIT compiler. • The
Android Runtime and the
Dalvik Virtual Machine use SSA. • The Standard ML compiler
MLton uses SSA in one of its intermediate languages. •
LuaJIT makes heavy use of SSA-based optimizations. • The
PHP and
Hack compiler
HHVM uses SSA in its IR. • The
OCaml compiler uses SSA in its CMM IR (which stands for C--). • libFirm, a library for use as the
middle and back ends of a compiler, uses SSA form for all scalar register values until code generation by use of an SSA-aware register allocator. • Various
Mesa drivers via NIR, an SSA representation for shading languages.
Commercial •
Oracle's
HotSpot Java Virtual Machine uses an SSA-based intermediate language in its JIT compiler. • Microsoft
Visual C++ compiler backend available in
Microsoft Visual Studio 2015 Update 3 uses SSA •
SPIR-V, the shading language standard for the
Vulkan graphics API and
kernel language for
OpenCL compute API, is an SSA representation. •
DXIL, the shading language for the Microsoft
DirectX Shader Compiler uses SSA representation because of it being a fork of LLVM. • The IBM family of XL compilers, which include
C, C++ and
Fortran. • NVIDIA
CUDA Research and abandoned • The ETH
Oberon-2 compiler was one of the first public projects to incorporate "GSA", a variant of SSA. • The
Open64 compiler used SSA form in its global scalar optimizer, though the code is brought into SSA form before and taken out of SSA form afterwards. Open64 uses extensions to SSA form to represent memory in SSA form as well as scalar values. • In 2002, researchers modified IBM's JikesRVM (named Jalapeño at the time) to run both standard Java
bytecode and a typesafe SSA (
SafeTSA) bytecode class files, and demonstrated significant performance benefits to using the SSA bytecode. • jackcc is an open-source compiler for the academic instruction set Jackal 3.0. It uses a simple 3-operand code with SSA for its intermediate representation. As an interesting variant, it replaces Φ functions with a so-called SAME instruction, which instructs the register allocator to place the two live ranges into the same physical register. • The Illinois Concert Compiler circa 1994 used a variant of SSA called SSU (Static Single Use) which renames each variable when it is assigned a value, and in each conditional context in which that variable is used; essentially the static single information form mentioned above. The SSU form is documented in John Plevyak's Ph.D Thesis. • The COINS compiler uses SSA form optimizations as explained here. • Reservoir Labs' R-Stream compiler supports non-SSA (quad list), SSA and SSI (Static Single Information) forms. • Although not a compiler, the Boomerang decompiler uses SSA form in its internal representation. SSA is used to simplify expression propagation, identifying parameters and returns, preservation analysis, and more. •
DotGNU Portable.NET used SSA in its JIT compiler. ==See also==