diff options
author | keithw <unknown> | 1999-05-11 16:38:04 +0000 |
---|---|---|
committer | keithw <unknown> | 1999-05-11 16:38:04 +0000 |
commit | d133b73a4d4717892ced072d05e039a54ede0ceb (patch) | |
tree | 5f6816748e45949f918f1be0a02dce76ee5ca18f /ghc/compiler/specialise/Specialise.lhs | |
parent | f83ad713ad73e583fd138bb17e7341041b36a416 (diff) | |
download | haskell-d133b73a4d4717892ced072d05e039a54ede0ceb.tar.gz |
[project @ 1999-05-11 16:37:29 by keithw]
(this is number 4 of 9 commits to be applied together)
The major purpose of this commit is to introduce usage information
and usage analysis into the compiler, per the paper _Once Upon a
Polymorphic Type_ (Keith Wansbrough and Simon Peyton Jones, POPL'99,
and Glasgow TR-1998-19).
Usage information has been added to types, in the form of a new kind
of NoteTy: (UsgNote UsageAnn(UsOnce|UsMany|UsVar UVar)). Usages
print as __o (once), __m (many, usually omitted), or (not in
interface files) __uvxxxx. Usage annotations should only appear at
certain places in a type (see the paper). The `default' annotation
is __m, and so an omitted annotation implies __m. Utility functions
for handling usage annotations are provided in Type.
If the compiler is built with -DUSMANY (a flag intended for use in
debugging by KSW only), __m are *required* and may not be omitted.
The major constraint is that type arguments (eg to mkAppTy) must be
unannotated on top. To maintain this invariant, many functions
required the insertion of Type.unUsgTy (removing annot from top of a
type) or UsageSPUtils.unannotTy (removing all annotations from a
type). A function returning usage-annotated types for primops has
been added to PrimOp.
A new kind of Note, (TermUsg UsageAnn), has been added to annotate
Terms. This note is *not* printed in interface files, and for the
present does not escape the internals of the usage inference engine.
Diffstat (limited to 'ghc/compiler/specialise/Specialise.lhs')
-rw-r--r-- | ghc/compiler/specialise/Specialise.lhs | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/ghc/compiler/specialise/Specialise.lhs b/ghc/compiler/specialise/Specialise.lhs index 080fd0ec00..87d41a069f 100644 --- a/ghc/compiler/specialise/Specialise.lhs +++ b/ghc/compiler/specialise/Specialise.lhs @@ -32,7 +32,7 @@ import PprCore () -- Instances import SpecEnv ( addToSpecEnv ) import UniqSupply ( UniqSupply, - UniqSM, initUs, thenUs, thenUs_, returnUs, getUniqueUs, + UniqSM, initUs_, thenUs, thenUs_, returnUs, getUniqueUs, getUs, setUs, uniqFromSupply, splitUniqSupply, mapUs ) import Name ( nameOccName, mkSpecOcc, getSrcLoc ) @@ -1139,7 +1139,7 @@ getUniqSM = getUniqueUs getUniqSupplySM = getUs setUniqSupplySM = setUs mapSM = mapUs -initSM = initUs +initSM = initUs_ mapAndCombineSM f [] = returnSM ([], emptyUDs) mapAndCombineSM f (x:xs) = f x `thenSM` \ (y, uds1) -> |