Skip to content
Snippets Groups Projects
Forked from Glasgow Haskell Compiler / GHC
62735 commits behind the upstream repository.
user avatar
Simon Peyton Jones authored
Simon's Marktoberdorf Commits

1.  Tidy up the renaming story for "system binders", such as
dictionary functions, default methods, constructor workers etc.  These
are now documented in HsDecls.  The main effect of the change, apart
from tidying up, is to make the *type-checker* (instead of the
renamer) generate names for dict-funs and default-methods.  This is
good because Sergei's generic-class stuff generates new classes at
typecheck time.


2.  Fix the CSE pass so it does not require the no-shadowing invariant.
Keith discovered that the simplifier occasionally returns a result
with shadowing.  After much fiddling around (which has improved the
code in the simplifier a bit) I found that it is nearly impossible to
arrange that it really does do no-shadowing.  So I gave up and fixed
the CSE pass (which is the only one to rely on it) instead.


3. Fix a performance bug in the simplifier.  The change is in
SimplUtils.interestingArg.  It computes whether an argment should 
be considered "interesting"; if a function is applied to an interesting
argument, we are more likely to inline that function.
Consider this case
	let x = 3 in f x
The 'x' argument was considered "uninteresting" for a silly reason.
Since x only occurs once, it was unconditionally substituted, but
interestingArg didn't take account of that case.  Now it does.

I also made interestingArg a bit more liberal.  Let's see if we
get too much inlining now.


4.  In the occurrence analyser, we were choosing a bad loop breaker.
Here's the comment that's now in OccurAnal.reOrderRec

    score ((bndr, rhs), _, _)
	| exprIsTrivial rhs 	   = 3	-- Practically certain to be inlined
		-- Used to have also: && not (isExportedId bndr)
		-- But I found this sometimes cost an extra iteration when we have
		--	rec { d = (a,b); a = ...df...; b = ...df...; df = d }
		-- where df is the exported dictionary. Then df makes a really
		-- bad choice for loop breaker

I also increased the score for bindings with a non-functional type, so that
dictionaries have a better chance of getting inlined early


5. Add a hash code to the InScopeSet (and make it properly abstract)
This should make uniqAway a lot more robust.  Simple experiments suggest
that uniqAway no longer gets into the long iteration chains that it used
to.


6.  Fix a bug in the inliner that made the simplifier tend to get into
a loop where it would keep iterating ("4 iterations, bailing out" message).
In SimplUtils.mkRhsTyLam we float bindings out past a big lambda, thus:
	x = /\ b -> let g = \x -> f x x
		    in E
becomes
	g* = /\a -> \x -> f x x
	x = /\ b -> let g = g* b in E
	
It's essential that we don't simply inling g* back into the RHS of g,
else we will be back to square 1.  The inliner is meant not to do this
because there's no benefit to the inlining, but the size calculation
was a little off in CoreUnfold.


7.  In SetLevels we were bogus-ly building a Subst with an empty in-scope
set, so a WARNING popped up when compiling some modules.  (knights/ChessSetList
was the example that tickled it.)  Now in fact the warning wasn't an error,
but the Right Thing to do is to carry down a proper Subst in SetLevels, so
that is what I have now done.  It is very little more expensive.
fe69f3c1
History
fptools build system
====================

This is the top-level directory of the fptools build system.  Several
packages are part of this build system; if you got this as part of a
source distribution (eg. for GHC), then you will have one or more of
the following directories:

    ghc		  The Glasgow Haskell Compiler
    hslibs	  A Collection of Haskell libraries
    haggis	  The Haggis GUI toolkit
    happy	  The Happy Haskell parser generator
    hdirect       Haskell interop tool
    green-card	  A foreign function interface pre-processor for Haskell.
    nofib	  The NoFib Haskell benchmarking suite

Additional documentation for each project can be found in its
respective directory.

In addition, the following directories contain project-independent bits:

    mk	          GNU make setup used by all of fptools
    glafp-utils   Shared utility programs
    docs          Documentation on the installing and using
                  the fptools build system.
    distrib	  Tools and additional bits for building distributions

Quick start:  the following is *supposed* to work

	$ ./configure
	$ make boot
	$ make
	$ make install

where 'make' is whatever GNU make is called on your system (GNU make
is *required*).  The configuration script is a standard GNU autoconf
script which accepts all the normal arguments, eg. --prefix=<blah> to
install the package somewhere other than /usr/local.  Try ./configure
--help to get a full list of the options.

There is usually an ANNOUNCE* file with any distribution.  Please
consult that, or the <piece>/README file, to find out how to proceed.

Full documentation for the fptools build system can be found on the
GHC web pages: 

	http://www.haskell.org/ghc/

--
The GHC Team,  glasgow-haskell-users@haskell.org