- 13 Feb, 2002 1 commit
-
-
simonmar authored
Don't translate out negative (boxed) literals too early.
-
- 11 Feb, 2002 3 commits
-
-
simonpj authored
---------------------------------- Implement kinded type declarations ---------------------------------- This commit allows the programmer to supply kinds in * data decls * type decls * class decls * 'forall's in types e.g. data T (x :: *->*) = MkT type Composer c = forall (x :: * -> *) (y :: * -> *) (z :: * -> *). (c y z) -> (c x y) -> (c x z); This is occasionally useful. It turned out to be convenient to add the form (type :: kind) to the syntax of types too, so you can put kind signatures in types as well.
-
simonpj authored
------------------------------ Towards kinded data type decls ------------------------------ Move towards being able to have 'kinded' data type decls. The burden of this commit, though, is to tidy up the parsing of data type decls. Previously we had data ctype '=' constrs where the 'ctype' is a completetely general polymorphic type. forall a. (Eq a) => T a Then a separate function checked that it was of a suitably restricted form. The reason for this is the usual thing --- it's hard to tell when looking at data Eq a => T a = ... whether you are reading the data type or the context when you have only got as far as 'Eq a'. However, the 'ctype' trick doesn't work if we want to allow data T (a :: * -> *) = ... So we have to parse the data type decl in a more serious way. That's what this commit does, and it makes the grammar look much nicer. The main new producion is tycl_hdr.
-
chak authored
******************************* * Merging from ghc-ndp-branch * ******************************* This commit merges the current state of the "parallel array extension" and includes the following: * (Almost) completed Milestone 1: - The option `-fparr' activates the H98 extension for parallel arrays. - These changes have a high likelihood of conflicting (in the CVS sense) with other changes to GHC and are the reason for merging now. - ToDo: There are still some (less often used) functions not implemented in `PrelPArr' and a mechanism is needed to automatically import `PrelPArr' iff `-fparr' is given. Documentation that should go into the Commentary is currently in `ghc/compiler/ndpFlatten/TODO'. * Partial Milestone 2: - The option `-fflatten' activates the flattening transformation and `-ndp' selects the "ndp" way (where all libraries have to be compiled with flattening). The way option `-ndp' automagically turns on `-fparr' and `-fflatten'. - Almost all changes are in the new directory `ndpFlatten' and shouldn't affect the rest of the compiler. The only exception are the options and the points in `HscMain' where the flattening phase is called when `-fflatten' is given. - This isn't usable yet, but already implements function lifting, vectorisation, and a new analysis that determines which parts of a module have to undergo the flattening transformation. Missing are data structure and function specialisation, the unboxed array library (including fusion rules), and lots of testing. I have just run the regression tests on the thing without any problems. So, it seems, as if we haven't broken anything crucial.
-
- 20 Dec, 2001 1 commit
-
-
simonpj authored
--------------------------------------------- More type system extensions (for John Hughes) --------------------------------------------- 1. Added a brand-new extension that lets you derive ARBITRARY CLASSES for newtypes. Thus newtype Age = Age Int deriving( Eq, Ord, Shape, Ix ) The idea is that the dictionary for the user-defined class Shape Age is *identical* to that for Shape Int, so there is really no deriving work to do. This saves you writing the very tiresome instance decl: instance Shape Age where shape_op1 (Age x) = shape_op1 x shape_op2 (Age x1) (Age x2) = shape_op2 x1 x2 ...etc... It's more efficient, too, becuase the Shape Age dictionary really will be identical to the Shape Int dictionary. There's an exception for Read and Show, because the derived instance *isn't* the same. There is a complication where higher order stuff is involved. Here is the example John gave: class StateMonad s m | m -> s where ... newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving( Monad, StateMonad ) Then we want the derived instance decls to be instance Monad (State [tok] (Failure m)) => Monad (Parser tok m) instance StateMonad [tok] (State [tok] (Failure m)) => StateMonad [tok] (Parser tok m) John is writing up manual entry for all of this, but this commit implements it. I think. 2. Added -fallow-incoherent-instances, and documented it. The idea is that sometimes GHC is over-protective about not committing to a particular instance, and the programmer may want to say "commit anyway". Here's the example: class Sat a where dict :: a data EqD a = EqD {eq :: a->a->Bool} instance Sat (EqD a) => Eq a where (==) = eq dict instance Sat (EqD Integer) where dict = EqD{eq=(==)} instance Eq a => Sat (EqD a) where dict = EqD{eq=(==)} class Collection c cxt | c -> cxt where empty :: Sat (cxt a) => c a single :: Sat (cxt a) => a -> c a union :: Sat (cxt a) => c a -> c a -> c a member :: Sat (cxt a) => a -> c a -> Bool instance Collection [] EqD where empty = [] single x = [x] union = (++) member = elem It's an updated attempt to model "Restricted Data Types", if you remember my Haskell workshop paper. In the end, though, GHC rejects the program (even with fallow-overlapping-instances and fallow-undecideable-instances), because there's more than one way to construct the Eq instance needed by elem. Yet all the ways are equivalent! So GHC is being a bit over-protective of me, really: I know what I'm doing and I would LIKE it to pick an arbitrary one. Maybe a flag fallow-incoherent-instances would be a useful thing to add?
-
- 31 Oct, 2001 1 commit
-
-
simonpj authored
------------------------------------------ Improved handling of scoped type variables ------------------------------------------ The main effect of this commit is to allow scoped type variables in pattern bindings, thus (x::a, y::b) = e This was illegal, but now it's ok. a and b have the same scope as x and y. On the way I beefed up the info inside a type variable (TcType.TyVarDetails; c.f. IdInfo.GlobalIdDetails) which helps to improve error messages. Hence the wide ranging changes. Pity about the extra loop from Var to TcType, but can't be helped.
-
- 23 Aug, 2001 2 commits
-
-
simonpj authored
More instance-gate fiddling. This must be one of the most tiremsome bits of the entire compiler, and I appear to be incapable of modifying it without getting it wrong at least once. Still, this commit does tidy things up a bit. * The type renamers (rnHsType, etc) have moved from RnSource into a new module RnTypes. * This breaks a couple of loops, and lets us nuke RnSource.hi-boot. Hurrah! Simon
-
simonpj authored
-------------------------------------------------- Be a bit more liberal when slurping instance decls -------------------------------------------------- Functional dependencies have (as usual) made things more complicated Suppose an interface file contains interface A where class C a b | a->b where op :: a->b instance C Foo Baz where ... Now we are compiling module B where import A t = op (v::Foo) Should we slurp the instance decl, even though Baz is nowhere mentioned in module B? YES! Because of the fundep, the (C Foo ?) part is enough to select this instance decl, and the Baz part follows. Rather than take fundeps into account "properly", we just slurp if C is visible and *any one* of the Names in the types This is a slightly brutal approximation, but most instance decls are regular H98 ones and it's perfect for them. Changes: HscTypes: generalise the types of GatedDecl a bit RnHiFiles.loadInstDecl, RnHiFiles.loadRule, RnIfaces.selectGated: the meat of the solution RdrName, OccName etc: some consequential wibbles
-
- 13 Jul, 2001 1 commit
-
-
simonpj authored
------------------------------------ Tidy up the "syntax rebinding" story ------------------------------------ I found a bug in the code that dealt with re-binding implicit numerical syntax: literals (fromInteger/fromRational) negation (negate) n+k patterns (minus) This is triggered by the -fno-implicit-prelude flag, and it used to be handled via the PrelNames.SyntaxMap. But I found a nicer way to do it that involves much less code, and doesn't have the bug. The explanation is with RnEnv.lookupSyntaxName
-
- 25 Jun, 2001 1 commit
-
-
simonpj authored
Import wibbles
-
- 28 May, 2001 1 commit
-
-
simonpj authored
Wibble for scoped type variables
-
- 13 Mar, 2001 1 commit
-
-
simonpj authored
---------------- Nuke ClassContext ---------------- This commit tidies up a long-standing inconsistency in GHC. The context of a class or instance decl used to be restricted to predicates of the form C t1 .. tn with type ClassContext = [(Class,[Type])] but everywhere else in the compiler we used type ThetaType = [PredType] where PredType can be any sort of constraint (= predicate). The inconsistency actually led to a crash, when compiling class (?x::Int) => C a where {} I've tidied all this up by nuking ClassContext altogether, and using PredType throughout. Lots of modified files, but all in more-or-less trivial ways. I've also added a check that the context of a class or instance decl doesn't include a non-inheritable predicate like (?x::Int). Other things * rename constructor 'Class' from type TypeRep.Pred to 'ClassP' (makes it easier to grep for) * rename constructor HsPClass => HsClassP HsPIParam => HsIParam
-
- 20 Feb, 2001 1 commit
-
-
simonpj authored
A bit more on decoupling the prelude
-
- 20 Dec, 2000 1 commit
-
-
simonpj authored
Add comments and tidy
-
- 24 Nov, 2000 1 commit
-
-
simonpj authored
1. Make the new version machinery work. I think it does now! 2. Consequence of (1): Move the generation of default method names to one place (namely in RdrHsSyn.mkClassOpSigDM 3. Major clean up on HsDecls.TyClDecl These big constructors should have been records ages ago, and they are now. At last.
-
- 07 Nov, 2000 1 commit
-
-
simonmar authored
This commit completes the merge of compiler part of the HEAD with the before-ghci-branch to before-ghci-branch-merged.
-
- 06 Nov, 2000 1 commit
-
-
simonpj authored
Dealing with instance-decl imports; and removing unnecessary imports
-
- 01 Nov, 2000 1 commit
-
-
simonpj authored
More renamer commits Versioning now works properly I think. The main irritation is that interface files now have fuly-qualified names for *everything*, even things defined in that module. This is a deficiency in the pretty printing for interface files. Probable solution: add something to the SDoc styles. But not today.
-
- 31 Oct, 2000 1 commit
-
-
simonpj authored
PrelBase compiles!
-
- 24 Oct, 2000 1 commit
-
-
simonpj authored
Mainly MkIface
-
- 23 Oct, 2000 1 commit
-
-
simonpj authored
Mainly renamer
-
- 12 Oct, 2000 1 commit
-
-
sewardj authored
Rename a bunch of mkSrc* things into mk*'s.
-
- 03 Oct, 2000 1 commit
-
-
simonpj authored
-------------------------------------- Adding generics SLPJ Oct 2000 -------------------------------------- This big commit adds Hinze/PJ-style generic class definitions, based on work by Andrei Serjantov. For example: class Bin a where toBin :: a -> [Int] fromBin :: [Int] -> (a, [Int]) toBin {| Unit |} Unit = [] toBin {| a :+: b |} (Inl x) = 0 : toBin x toBin {| a :+: b |} (Inr y) = 1 : toBin y toBin {| a :*: b |} (x :*: y) = toBin x ++ toBin y fromBin {| Unit |} bs = (Unit, bs) fromBin {| a :+: b |} (0:bs) = (Inl x, bs') where (x,bs') = fromBin bs fromBin {| a :+: b |} (1:bs) = (Inr y, bs') where (y,bs') = fromBin bs fromBin {| a :*: b |} bs = (x :*: y, bs'') where (x,bs' ) = fromBin bs (y,bs'') = fromBin bs' Now we can say simply instance Bin a => Bin [a] and the compiler will derive the appropriate code automatically. (About 9k lines of diffs. Ha!) Generic related things ~~~~~~~~~~~~~~~~~~~~~~ * basicTypes/BasicTypes: The EP type (embedding-projection pairs) * types/TyCon: An extra field in an algebraic tycon (genInfo) * types/Class, and hsSyn/HsBinds: Each class op (or ClassOpSig) carries information about whether it a) has no default method b) has a polymorphic default method c) has a generic default method There's a new data type for this: Class.DefMeth * types/Generics: A new module containing good chunk of the generic-related code It has a .hi-boot file (alas). * typecheck/TcInstDcls, typecheck/TcClassDcl: Most of the rest of the generics-related code * hsSyn/HsTypes: New infix type form to allow types of the form data a :+: b = Inl a | Inr b * parser/Parser.y, Lex.lhs, rename/ParseIface.y: Deal with the new syntax * prelude/TysPrim, TysWiredIn: Need to generate generic stuff for the wired-in TyCons * rename/RnSource RnBinds: A rather gruesome hack to deal with scoping of type variables from a generic patterns. Details commented in the ClassDecl case of RnSource.rnDecl. Of course, there are many minor renamer consequences of the other changes above. * lib/std/PrelBase.lhs Data type declarations for Unit, :+:, :*: Slightly unrelated housekeeping ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * hsSyn/HsDecls: ClassDecls now carry the Names for their implied declarations (superclass selectors, tycon, etc) in a list, rather than laid out one by one. This simplifies code between the parser and the type checker. * prelude/PrelNames, TysWiredIn: All the RdrNames are now together in PrelNames. * utils/ListSetOps: Add finite mappings based on equality and association lists (Assoc a b) Move stuff from List.lhs that is related
-
- 22 Sep, 2000 1 commit
-
-
simonpj authored
-------------------------------------------------- Tidying up HsLit, and making it possible to define your own numeric library Simon PJ 22 Sept 00 -------------------------------------------------- ** NOTE: I did these changes on the aeroplane. They should compile, and the Prelude still compiles OK, but it's entirely possible that I've broken something The original reason for this many-file but rather shallow commit is that it's impossible in Haskell to write your own numeric library. Why? Because when you say '1' you get (Prelude.fromInteger 1), regardless of what you hide from the Prelude, or import from other libraries you have written. So the idea is to extend the -fno-implicit-prelude flag so that in addition to no importing the Prelude, you can rebind fromInteger -- Applied to literal constants fromRational -- Ditto negate -- Invoked by the syntax (-x) the (-) used when desugaring n+k patterns After toying with other designs, I eventually settled on a simple, crude one: rather than adding a new flag, I just extended the semantics of -fno-implicit-prelude so that uses of fromInteger, fromRational and negate are all bound to "whatever is in scope" rather than "the fixed Prelude functions". So if you say {-# OPTIONS -fno-implicit-prelude #-} module M where import MyPrelude( fromInteger ) x = 3 the literal 3 will use whatever (unqualified) "fromInteger" is in scope, in this case the one gotten from MyPrelude. On the way, though, I studied how HsLit worked, and did a substantial tidy up, deleting quite a lot of code along the way. In particular. * HsBasic.lhs is renamed HsLit.lhs. It defines the HsLit type. * There are now two HsLit types, both defined in HsLit. HsLit for non-overloaded literals (like 'x') HsOverLit for overloaded literals (like 1 and 2.3) * HsOverLit completely replaces Inst.OverloadedLit, which disappears. An HsExpr can now be an HsOverLit as well as an HsLit. * HsOverLit carries the Name of the fromInteger/fromRational operation, so that the renamer can help with looking up the unqualified name when -fno-implicit-prelude is on. Ditto the HsExpr for negation. It's all very tidy now. * RdrHsSyn contains the stuff that handles -fno-implicit-prelude (see esp RdrHsSyn.prelQual). RdrHsSyn also contains all the "smart constructors" used by the parser when building HsSyn. See for example RdrHsSyn.mkNegApp (previously the renamer (!) did the business of turning (- 3#) into -3#). * I tidied up the handling of "special ids" in the parser. There's much less duplication now. * Move Sven's Horner stuff to the desugarer, where it belongs. There's now a nice function DsUtils.mkIntegerLit which brings together related code from no fewer than three separate places into one single place. Nice! * A nice tidy-up in MatchLit.partitionEqnsByLit became possible. * Desugaring of HsLits is now much tidier (DsExpr.dsLit) * Some stuff to do with RdrNames is moved from ParseUtil.lhs to RdrHsSyn.lhs, which is where it really belongs. * I also removed many unnecessary imports from modules quite a bit of dead code in divers places
-
- 01 Aug, 2000 1 commit
-
-
simonpj 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.
-
- 14 Jul, 2000 1 commit
-
-
simonpj authored
This commit completely re-does the kind-inference mechanism. Previously it was inter-wound with type inference, but that was always hard to understand, and it finally broke when we started checking for ambiguity when type-checking a type signature (details irrelevant). So now kind inference is more clearly separated, so that it never takes place at the same time as type inference. The biggest change is in TcTyClsDecls, which does the kind inference for a group of type and class declarations. It now contains comments to explain how it all works. There are also comments in TypeRep which describes the slightly tricky way in which we deal with the fact that kind 'type' (written '*') actually has 'boxed type' and 'unboxed type' as sub-kinds. The whole thing is a bit of a hack, because we don't really have sub-kinding, but it's less of a hack than before. A lot of general tidying up happened at the same time. In particular, I removed some dead code here and there
-
- 31 May, 2000 1 commit
-
-
lewie authored
Cleanup pass on functional dependencies. Most noticeably, make it so that signatures involving classes with functional dependencies work. Also, Fundeps are now properly handled by the simplifier, resolving problems where the fundeps were sometimes being discarded too early, and sometimes hanging around too long. Took out the early ambiguity testing in the renamer, because that's too early (you don't know the fundeps yet). Now, the ambiguity test happens in the typechecker. Functional Dependencies should now be up to snuff with Mark's paper, however, the derived instances and superclass extensions found in hugs are still not in there. It would be nice if this were merged into 4.07. I have diffs against the 4.07 tree in case it's too thorny working around Simon's big commit.
-
- 25 May, 2000 1 commit
-
-
simonpj authored
~~~~~~~~~~~~ Apr/May 2000 ~~~~~~~~~~~~ This is a pretty big commit! It adds stuff I've been working on over the last month or so. DO NOT MERGE IT WITH 4.07! Interface file formats have changed a little; you'll need to make clean before remaking. Simon PJ Recompilation checking ~~~~~~~~~~~~~~~~~~~~~~ Substantial improvement in recompilation checking. The version management is now entirely internal to GHC. ghc-iface.lprl is dead! The trick is to generate the new interface file in two steps: - first convert Types etc to HsTypes etc, and thereby build a new ParsedIface - then compare against the parsed (but not renamed) version of the old interface file Doing this meant adding code to convert *to* HsSyn things, and to compare HsSyn things for equality. That is the main tedious bit. Another improvement is that we now track version info for fixities and rules, which was missing before. Interface file reading ~~~~~~~~~~~~~~~~~~~~~~ Make interface files reading more robust. * If the old interface file is unreadable, don't fail. [bug fix] * If the old interface file mentions interfaces that are unreadable, don't fail. [bug fix] * When we can't find the interface file, print the directories we are looking in. [feature] Type signatures ~~~~~~~~~~~~~~~ * New flag -ddump-types to print type signatures Type pruning ~~~~~~~~~~~~ When importing data T = T1 A | T2 B | T3 C it seems excessive to import the types A, B, C as well, unless the constructors T1, T2 etc are used. A,B,C might be more types, and importing them may mean reading more interfaces, and so on. So the idea is that the renamer will just import the decl data T unless one of the constructors is used. This turns out to be quite easy to implement. The downside is that we must make sure the constructors are always available if they are really needed, so I regard this as an experimental feature. Elimininate ThinAir names ~~~~~~~~~~~~~~~~~~~~~~~~~ Eliminate ThinAir.lhs and all its works. It was always a hack, and now the desugarer carries around an environment I think we can nuke ThinAir altogether. As part of this, I had to move all the Prelude RdrName defns from PrelInfo to PrelMods --- so I renamed PrelMods as PrelNames. I also had to move the builtinRules so that they are injected by the renamer (rather than appearing out of the blue in SimplCore). This is if anything simpler. Miscellaneous ~~~~~~~~~~~~~ * Tidy up the data types involved in Rules * Eliminate RnEnv.better_provenance; use Name.hasBetterProv instead * Add Unique.hasKey :: Uniquable a => a -> Unique -> Bool It's useful in a lot of places * Fix a bug in interface file parsing for __U[!]
-
- 23 Mar, 2000 1 commit
-
-
simonpj authored
This utterly gigantic commit is what I've been up to in background mode in the last couple of months. Originally the main goal was to get rid of Con (staturated constant applications) in the CoreExpr type, but one thing led to another, and I kept postponing actually committing. Sorry. Simon, 23 March 2000 I've tested it pretty thoroughly, but doubtless things will break. Here are the highlights * Con is gone; the CoreExpr type is simpler * NoRepLits have gone * Better usage info in interface files => less recompilation * Result type signatures work * CCall primop is tidied up * Constant folding now done by Rules * Lots of hackery in the simplifier * Improvements in CPR and strictness analysis Many bug fixes including * Sergey's DoCon compiles OK; no loop in the strictness analyser * Volker Wysk's programs don't crash the CPR analyser I have not done much on measuring compilation times and binary sizes; they could have got worse. I think performance has got significantly better, though, in most cases. Removing the Con form of Core expressions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The big thing is that For every constructor C there are now *two* Ids: C is the constructor's *wrapper*. It evaluates and unboxes arguments before calling $wC. It has a perfectly ordinary top-level defn in the module defining the data type. $wC is the constructor's *worker*. It is like a primop that simply allocates and builds the constructor value. Its arguments are the actual representation arguments of the constructor. Its type may be different to C, because: - useless dict args are dropped - strict args may be flattened For every primop P there is *one* Id, its (curried) Id Neither contructor worker Id nor the primop Id have a defminition anywhere. Instead they are saturated during the core-to-STG pass, and the code generator generates code for them directly. The STG language still has saturated primops and constructor applications. * The Const type disappears, along with Const.lhs. The literal part of Const.lhs reappears as Literal.lhs. Much tidying up in here, to bring all the range checking into this one module. * I got rid of NoRep literals entirely. They just seem to be too much trouble. * Because Con's don't exist any more, the funny C { args } syntax disappears from inteface files. Parsing ~~~~~~~ * Result type signatures now work f :: Int -> Int = \x -> x -- The Int->Int is the type of f g x y :: Int = x+y -- The Int is the type of the result of (g x y) Recompilation checking and make ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * The .hi file for a modules is not touched if it doesn't change. (It used to be touched regardless, forcing a chain of recompilations.) The penalty for this is that we record exported things just as if they were mentioned in the body of the module. And the penalty for that is that we may recompile a module when the only things that have changed are the things it is passing on without using. But it seems like a good trade. * -recomp is on by default Foreign declarations ~~~~~~~~~~~~~~~~~~~~ * If you say foreign export zoo :: Int -> IO Int then you get a C produre called 'zoo', not 'zzoo' as before. I've also added a check that complains if you export (or import) a C procedure whose name isn't legal C. Code generation and labels ~~~~~~~~~~~~~~~~~~~~~~~~~~ * Now that constructor workers and wrappers have distinct names, there's no need to have a Foo_static_closure and a Foo_closure for constructor Foo. I nuked the entire StaticClosure story. This has effects in some of the RTS headers (i.e. s/static_closure/closure/g) Rules, constant folding ~~~~~~~~~~~~~~~~~~~~~~~ * Constant folding becomes just another rewrite rule, attached to the Id for the PrimOp. To achieve this, there's a new form of Rule, a BuiltinRule (see CoreSyn.lhs). The prelude rules are in prelude/PrelRules.lhs, while simplCore/ConFold.lhs has gone. * Appending of constant strings now works, using fold/build fusion, plus the rewrite rule unpack "foo" c (unpack "baz" c n) = unpack "foobaz" c n Implemented in PrelRules.lhs * The CCall primop is tidied up quite a bit. There is now a data type CCall, defined in PrimOp, that packages up the info needed for a particular CCall. There is a new Id for each new ccall, with an big "occurrence name" {__ccall "foo" gc Int# -> Int#} In interface files, this is parsed as a single Id, which is what it is, really. Miscellaneous ~~~~~~~~~~~~~ * There were numerous places where the host compiler's minInt/maxInt was being used as the target machine's minInt/maxInt. I nuked all of these; everything is localised to inIntRange and inWordRange, in Literal.lhs * Desugaring record updates was broken: it didn't generate correct matches when used withe records with fancy unboxing etc. It now uses matchWrapper. * Significant tidying up in codeGen/SMRep.lhs * Add __word, __word64, __int64 terminals to signal the obvious types in interface files. Add the ability to print word values in hex into C code. * PrimOp.lhs is no longer part of a loop. Remove PrimOp.hi-boot* Types ~~~~~ * isProductTyCon no longer returns False for recursive products, nor for unboxed products; you have to test for these separately. There's no reason not to do CPR for recursive product types, for example. Ditto splitProductType_maybe. Simplification ~~~~~~~~~~~~~~~ * New -fno-case-of-case flag for the simplifier. We use this in the first run of the simplifier, where it helps to stop messing up expressions that the (subsequent) full laziness pass would otherwise find float out. It's much more effective than previous half-baked hacks in inlining. Actually, it turned out that there were three places in Simplify.lhs that needed to know use this flag. * Make the float-in pass push duplicatable bindings into the branches of a case expression, in the hope that we never have to allocate them. (see FloatIn.sepBindsByDropPoint) * Arrange that top-level bottoming Ids get a NOINLINE pragma This reduced gratuitous inlining of error messages. But arrange that such things still get w/w'd. * Arrange that a strict argument position is regarded as an 'interesting' context, so that if we see foldr k z (g x) then we'll be inclined to inline g; this can expose a build. * There was a missing case in CoreUtils.exprEtaExpandArity that meant we were missing some obvious cases for eta expansion Also improve the code when handling applications. * Make record selectors (identifiable by their IdFlavour) into "cheap" operations. [The change is a 2-liner in CoreUtils.exprIsCheap] This means that record selection may be inlined into function bodies, which greatly improves the arities of overloaded functions. * Make a cleaner job of inlining "lone variables". There was some distributed cunning, but I've centralised it all now in SimplUtils.analyseCont, which analyses the context of a call to decide whether it is "interesting". * Don't specialise very small functions in Specialise.specDefn It's better to inline it. Rather like the worker/wrapper case. * Be just a little more aggressive when floating out of let rhss. See comments with Simplify.wantToExpose A small change with an occasional big effect. * Make the inline-size computation think that case x of I# x -> ... is *free*. CPR analysis ~~~~~~~~~~~~ * Fix what was essentially a bug in CPR analysis. Consider letrec f x = let g y = let ... in f e1 in if ... then (a,b) else g x g has the CPR property if f does; so when generating the final annotated RHS for f, we must use an envt in which f is bound to its final abstract value. This wasn't happening. Instead, f was given the CPR tag but g wasn't; but of course the w/w pass gives rotten results in that case!! (Because f's CPR-ness relied on g's.) On they way I tidied up the code in CprAnalyse. It's quite a bit shorter. The fact that some data constructors return a constructed product shows up in their CPR info (MkId.mkDataConId) not in CprAnalyse.lhs Strictness analysis and worker/wrapper ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * BIG THING: pass in the demand to StrictAnal.saExpr. This affects situations like f (let x = e1 in (x,x)) where f turns out to have strictness u(SS), say. In this case we can mark x as demanded, and use a case expression for it. The situation before is that we didn't "know" that there is the u(SS) demand on the argument, so we simply computed that the body of the let expression is lazy in x, and marked x as lazily-demanded. Then even after f was w/w'd we got let x = e1 in case (x,x) of (a,b) -> $wf a b and hence let x = e1 in $wf a b I found a much more complicated situation in spectral/sphere/Main.shade, which improved quite a bit with this change. * Moved the StrictnessInfo type from IdInfo to Demand. It's the logical place for it, and helps avoid module loops * Do worker/wrapper for coerces even if the arity is zero. Thus: stdout = coerce Handle (..blurg..) ==> wibble = (...blurg...) stdout = coerce Handle wibble This is good because I found places where we were saying case coerce t stdout of { MVar a -> ... case coerce t stdout of { MVar b -> ... and the redundant case wasn't getting eliminated because of the coerce.
-
- 02 Mar, 2000 1 commit
-
-
lewie authored
Further refine and fix how `with' partitions the LIE. Also moved the partitioning function from Inst to TcSimplify. Fixed layout bug with `with'. Fixed another wibble w/ importing defs w/ implicit params. Make 4-tuples outputable (a convenience in debugging measure).
-
- 22 Feb, 2000 1 commit
-
-
panne authored
Load deprecations from interface files into a deprecation environment which maps Names to RenamedDeprecations. This map is not used yet, but very soon it will... This commit fixes a bug related to implicit parameters, too: Previously, an interface file containing the name "with" could not be read by the interface parser. This broke Malcolm's HaXml 0.9 (released today). Remember Sven's glaexts-commandment (Jeffrey? :-) : Always keep Lex.lhs's ghcExtensionKeywordsFM and ParseIface.y's var_fs production in synch!
-
- 28 Jan, 2000 1 commit
-
-
lewie authored
First pass at implicit parameters. Honest, I didn't really go in *intending* to modify every file in the typechecker... ;-) The breadth of the change is partly due to generalizing contexts so that they are not hardwired to be (Class, [Type]) pairs. See types/Type.lhs for details (look for PredType).
-
- 30 Nov, 1999 1 commit
-
-
lewie authored
First bits o' functional dependencies - just the syntax and related datatypes, plus started moving some of the static checks from the renamer (where we don't know about fundeps) to later in the typechecker.
-
- 29 Nov, 1999 1 commit
-
-
simonpj authored
Make it so that a class decl generates default method decls for every method, not just for the ones that the user supplies default-methods for. GHC will never call these default-default methods, because when it finds an instance decl with no defn for a method, *and* the class decl doesn't have a user-programmed default method, it whips up a new default method for that instance decl so that the error message is more informative than the default-default method would be. But Hugs isn't so smart, and wants to call something from the class decl. This change required fiddling with more than I expected. Sigh. Simon
-
- 17 Sep, 1999 1 commit
-
-
simonpj authored
This bunch of commits represents work in progress on inlining and worker/wrapper stuff. Currently, I think it makes the compiler slightly worse than 4.04, for reasons I don't yet understand. But it means that Simon and I can both peer at what is going on. * Substantially improve handling of coerces in worker/wrapper * exprIsDupable for an application (f e1 .. en) wasn't calling exprIsDupable on the arguments!! So applications with few, but large, args were being dupliated. * sizeExpr on an application wasn't doing a nukeScrutDiscount on the arg of an application!! So bogus discounts could accumulate from arguments! * Improve handling of INLINE pragmas in calcUnfoldingGuidance. It was really wrong before
-
- 15 Jul, 1999 1 commit
-
-
keithw authored
This commit makes a start at implementing polymorphic usage annotations. * The module Type has now been split into TypeRep, containing the representation Type(..) and other information for `friends' only, and Type, providing the public interface to Type. Due to a bug in the interface-file slurping prior to ghc-4.04, {-# SOURCE #-} dependencies must unfortunately still refer to TypeRep even though they are not friends. * Unfoldings in interface files now print as __U instead of __u. UpdateInfo now prints as __UA instead of __U. * A new sort of variables, UVar, in their own namespace, uvName, has been introduced for usage variables. * Usage binders __fuall uv have been introduced. Usage annotations are now __u - ty (used once), __u ! ty (used possibly many times), __u uv ty (used uv times), where uv is a UVar. __o and __m have gone. All this still lives only in a TyNote, *for now* (but not for much longer). * Variance calculation for TyCons has moved from typecheck/TcTyClsDecls to types/Variance. * Usage annotation and inference are now done together in a single pass. Provision has been made for inferring polymorphic usage annotations (with __fuall) but this has not yet been implemented. Watch this space!
-
- 23 Jun, 1999 1 commit
-
-
simonmar authored
Make scoped type variables work.
-
- 07 Jun, 1999 1 commit
-
-
simonmar authored
Existential contexts on datatype declarations.
-
- 01 Jun, 1999 1 commit
-
-
simonmar authored
This commit replaces the old yacc parser with a Happy-generated one. Notes: - The generated .hs file is *big*. Best to use a recent version of Happy, and even better to add the -c flag to use unsafeCoerce# with ghc (versions 4.02+ please). - The lexer has grown all sorts of unsightly growths and should be put down as soon as possible. - Parse errors may result in strange diagnostics. I'm looking into this. - HsSyn now contains a few extra constructors due to the way patterns are parsed as expressions in the parser. - The layout rule is implemented according to the Haskell report. I found a couple of places in the libraries where we previously weren't adhering to this - in particular the rule about "nested contexts must be more indented than outer contexts". The rule is necessary to disambiguate in the presence of empty declaration lists.
-
- 18 May, 1999 1 commit
-
-
simonpj authored
RULES-NOTES
-