libFirm is a library that provides an intermediate representation and optimizations for compilers. Programs are represented in a graph based SSA form. Firm is used to represent computer programs in a computer program in order to analyze and transform it. Firm's main application is compiler construction where we use it to represent, optimize and transform C and Java programs to native machine code.
Product's homepage
Here are some key features of "libFirm":
· works exclusively on a graph-based SSA representation ("sea of nodes") until assembler code emission. Based on the work of C. Click and M. Trapp
· written in portable C. Known to run on MSVC 6-8 Win32, gcc on Linux, FreeBSD, Cygwin
· includes doxygen documentation
· support for object oriented type hierarchies
Analyses:
· dominance
· loop tree
· execution frequency
· control dependencies
· inter-procedural call graph
· rapid type
· def-use
· alias analysis
· class hierarchy analysis
Optimizations:
· dead code elimination (happens implicitly)
· constant folding (happens on the fly)
· local common subexpression elimination (happens on the fly)
· arithmetic identities (happens on the fly)
· unreachable code elimination
· global common subexpression elimination
· code placement
· operator strength reduction
· scalar replacement
· load/store optimization
· control flow optimizations
· if-conversion
· partial condition evaluation
· reassociation
· tail recursion elimination
· inlining
· procedure cloning
· extensive checkers
· enhanced debugging support: breakpoints on node creation, entity creation, graph dumping, visual studio debug extension
· lowering of intrinsics, double word arithmetics, bitfields
generic backend features:
· novel SSA based register allocator
· several spilling algorithms
· several SSA copy coalescing algorithms
· algorithms for instruction and basic block scheduling
· ABI handling helpers
· working ia32 backend with support for x87 and SSE2 floating point
· unfinished backends for MIPS, ARM, PPC32
· connections to the Edison Design Group C and Java frontends available.
What's New in This Release: [ read full changelog ]
· bugfixes
· advanced load/store optimisation which hoists loads out of loops
· Internal restruturing: Alot of node structures are automatically generated from a specification file now.
· Add support for multiple calling conventions
· New experimental support for reading and writing programgraphs to disk
· Support and optimisations for trampolines
· fix PIC support