SML/NJ 110.40 NEWS

    			S  M  L   /   N  J

                      1  1  0  .  4  0      N  E  W  S

      		           May 21, 2002

    			      WARNING

      	This version is intended for compiler hackers. The
    	version ought to be stable, however we have not run
    	our full regression testing.

            http://cm.bell-labs.com/cm/cs/what/smlnj/index.html

Summary:
  Significant work in the MLRISC backend. Many improvements and bugfixes in various parts of the implementation.

### Details:

#### Libraries:

- added $/controls-lib.cm, a library of configurable "controls"
  (In essence, controls are managed ref cells that can be grouped in sets and put in "registries" to facilitate configuration and customization via, e.g., environment variables and command-line arguments.)
  $/controls-lib.cm is a distillation of what used to be a CM-only mechanism. It is now used throughout the compiler.
- bug fixed in IntInf (parsing of hex literals)
- `==` and `!=` added to INT_INF interface (just placeholders for now)
- added mergeWith function to ORD_MAP interface
- added an implementation of Danvy-style format combinators to $/smlnj-lib.cm
- priority queues added to Util library (using Okasaki's leftist-tree implementation)
- updates to $/hash-cons-lib.cm (consR1 ... consR5 added)
- fixed bug in outputSubstr (in TextIO)
- new scrollbar implementation (eXene) courtesy of Allen Stoughton

#### Basis:

- implemented Knuth-Morris-Pratt string matching and used it for String.isSubstring, Substring.isSubstring, and Substring.position.
- added {String,Substring}.{concatWith,isSuffix,isSubstring} and Substring.full

#### MLRISC:

- jump chaining
- static block frequency calculation
- Ball-Larus branch prediction heuristics implemented
- graphical viewer for control flow graphs added
- treatment of pseudo-ops changed (get emitted first now)
- REMT removed from mltree; DIV and MOD now take a rounding mode (DIV_TO_ZERO and DIV_TO_NEGINF)
- made generic implementations of DIV_TO_NEGINF more efficient
- CFG edge splitting added
- buggy parts of x86-fp recoded
- added instructions for 64-bit support on x86 (not enabled yet)

#### CM:

- a new PID generation scheme is in place; it guarantees freedom from accidental clashes that could subvert the type system but is "stable" enough to maintain cutoff recompilation properties
- documentation updates
- minor bug fixes
- lambda-split aggressiveness can now be specified on a per-file basis in init.cmi as well
- CM is now aware of (_)overload, so it calculates dependecies for it correctly
- support for non-0 entrypoint offsets added
- command-line argument handling for showing/setting controls added
- bug in command-line handling of noweb (in noweb tool) fixed
- improved handling of pathnames in make tool

#### Runtime:

- fix for bug 1131 (excessive heap usage)
- heap export now silent unless GC messages are on
- fixed assembly code so that X86.prim.asm now compiles without warnings
- support for non-0 entrypoint offsets added

#### Compiler:

- cross-module inlining works much better now
- stopgap fix for problem with ppDec in the presence of multiple declarations of the same type name within one compilation unit
- full support for div/mod/rem/quot added to x86 code generator
- primops added for divisions of all flavors; track those operations to the backend instead of clumsily macro-expanding them out at "translate" time
- INLMIN, INLMAX, INLABS parameterized by numkind; use this to implement all flavors of min, max, and abs (Real.abs still maps to a separate FP primop.)
- preliminary support for "raw record" allocation and reentrant C function calls added
- conditional move added to cps (still buggy, therefore disabled)
- _overload now accepted as synonym for overload (when overloading is enabled); this is for backward-compatibility
- support for non-0 entrypoint offsets added; this (or something similar) is needed to be able to deal with block reordering
- new, better scaling CPS spill phase
- compiler "knows" its native C calling convention (no longer needs to be told by ml-nlffigen); X86Backend now split into X86CCallBackend and X86StdCallBackend

#### FFI:

- all C FFI libraries now anchored under $c
- tweaks to type encoding (use polymorphism to emulate subtyping)
- encoding of incomplete type is now equal to that of the corresponding complete type; no more POINTER_TO_INCOMPLETE_TYPE etc. (This restores the full generality of the translation -- something that was lost when we removed functors.)
- support for (optional) mapping enum types to datatypes added
- types in structures C and C_Debug are now equal
- added "witness value" mechanism to ml-nlffi-lib.cm to implement efficient arbitrary-depth "casts" that strip away or add "const" modifiers
- ML representation of "" changed so that conversion to C string is very efficient

#### Installer/scripts:

- suggestions for more preloads added to config/preloads
- don't use ?_DEFAULT environment variables. (They no longer exist since we switched to $/controls-lib.cm.)
- buggy transitive-closure algorithm fixed; it caused more things than necessary to be compiled

#### Miscellanea:

- minor bug fixes and improvements to mlrisc tools
- mdl tool compiles again, but without anything that depends on RTL specs (since this is currently broken)
- added #[...] expressions to mlrisc tools