MLRISC
MLRISC
Contributors
Requirements
How to Obtain MLRISC
Overview
Problem Statement
Contributions
MLRISC Based Compiler
MLRISC Intermediate Representation
MLRisc Generation
Back End Optimizations
Register Allocation
Machine Description
Garbage Collection Safety
System Integration
Optimizations
Graphical Interface
Line Counts
Systems Using MLRISC
Future Work
System
Architecture of MLRISC
The MLTREE Language
MLTree Extensions
MLTree Utilities
Instruction Selection
Assemblers
Machine Code Emitters
Delay Slot Filling
Span Dependency Resolution
The Graph Library
The Graph Visualization Library
Basic Compiler Graphs
The MLRISC IR
SSA Optimizations
ILP Optimizations
Optimizations for VLIW/EPIC Architectur...
Register Allocator
Back Ends
The Alpha Back End
The PA RISC Back End
The Sparc Back End
The Intel x86 Back End
The PowerPC Back End
The MIPS Back End
The TI C6x Back End
Basic Types
Annotations
Cells
Cluster
Client Defined Constants
Client Defined Pseudo Ops
Instructions
Instruction Streams
Label Expressions
Labels
Regions
Regmap

Contributions


The optimizations provided by MLRISC are at a similar level to those performed by the Impact compiler; several target back ends exist (Dec Alpha, HPPA, Sparc, x86, and PPC); but more importantly, the framework has been demonstrated in real use for languages with radically different execution models. These include:

Compiler Association
SML/NJ Bell Labs and Princeton
TIL CMU
Tiger Princeton
C-- OGI
SML/Regions DIKU
Moby Bell Labs

The strength of MLRISC lies in the ability to easily create high quality code generator for each of these systems. For example:

Tiger:
Has an execution model very similar to C with stack allocated activation frames, and also maintains static and dynamic chains to support lexical scoping.

TIL:
Is similar to C in its use of activation frames, however it uses a typed intermediate language that supports almost tag-free garbage collection. This has severe implications on the interaction of spilling and garbage collection. The set of live variables and their locations, be it registers or frame slots, is recorded in a trace table for a specific program point. When spilling occurs, it is necessary to adjust some of these trace tables to reflect the new locations of live variables.

SML/NJ:
Has no runtime stack, but stores all execution context in a garbage collected heap. This arrangement imposes special requirements for spilling registers. SML/NJ also does dynamic linking --- that is to say, no use is made of a conventional linker, but machine code is generated directly and linked into the interactive environment, dynamically.

C--:
Is a C-like portable assembly language used as an intermediate language for high level typed language, and provides direct compilation support for exceptions and precise garbage collection. In addition, it allows interoperability with C function calls.

It is not uncommon for any of these systems to store special global values in dedicated registers, and use their own parameter passing and callee-save conventions. In any language that supports garbage collection, there are also the issues of generating gc type maps, and gc-safety in aggressive optimizations. MLRISC deals with all these important issues by allowing customization of many aspects of the system.


Lal George
Allen Leung
SML/NJ Validate this page
Generated by mltex2html
Last modified: Thu Jan 9 19:38:15 EST 2003 by leunga@slinky