1. 26 Sep, 2001 9 commits
    • simonpj's avatar
      [project @ 2001-09-26 15:12:33 by simonpj] · e0d750be
      simonpj authored
      		Simon's big commit
      This commit, which I don't think I can sensibly do piecemeal, consists
      of the things I've been doing recently, mainly directed at making
      Manuel, George, and Marcin happier with RULES.
      Reogranise the simplifier
      1. The simplifier's environment is now an explicit parameter.  This
      makes it a bit easier to figure out where it is going.
      2. Constructor arguments can now be arbitrary expressions, except
      when the application is the RHS of a let(rec).  This makes it much
      easier to match rules like
      	    "foo"  f (h x, g y) = f' x y
      In the simplifier, it's Simplify.mkAtomicArgs that ANF-ises a
      constructor application where necessary.  In the occurrence analyser,
      there's a new piece of context info (OccEncl) to say whether a
      constructor app is in a place where it should be in ANF.  (Unless
      it knows this it'll give occurrence info which will inline the
      argument back into the constructor app.)
      3. I'm experimenting with doing the "float-past big lambda" transformation
      in the full laziness pass, rather than mixed in with the simplifier (was
      4.  Arrange that
      	case (coerce (S,T) (x,y)) of ...
      will simplify.  Previous it didn't.
      A local change to CoreUtils.exprIsConApp_maybe.
      5. Do a better job in CoreUtils.exprEtaExpandArity when there's an
      error function in one branch.
      Phase numbers, RULES, and INLINE pragmas
      1.  Phase numbers decrease from N towards zero (instead of increasing).
      This makes it easier to add new earlier phases, which is what users want
      to do.
      2.  RULES get their own phase number, N, and are disabled in phases before N.
      e.g. 	{-# RULES "foo" [2] forall x y.  f (x,y) = f' x y #-}
      Note the [2], which says "only active in phase 2 and later".
      3.  INLINE and NOINLINE pragmas have a phase number to.  This is now treated
      in just the same way as the phase number on RULE; that is, the Id is not inlined
      in phases earlier than N.  In phase N and later the Id *may* be inlined, and
      here is where INLINE and NOINLINE differ: INLNE makes the RHS look small, so
      as soon as it *may* be inlined it probably *will* be inlined.
      The syntax of the phase number on an INLINE/NOINLINE pragma has changed to be
      like the RULES case (i.e. in square brackets).  This should also make sure
      you examine all such phase numbers; many will need to change now the numbering
      is reversed.
      Inlining Ids is no longer affected at all by whether the Id appears on the
      LHS of a rule.  Now it's up to the programmer to put a suitable INLINE/NOINLINE
      pragma to stop it being inlined too early.
      Implementation notes:
      *  A new data type, BasicTypes.Activation says when a rule or inline pragma
      is active.   Functions isAlwaysActive, isNeverActive, isActive, do the
      obvious thing (all in BasicTypes).
      * Slight change in the SimplifierSwitch data type, which led to a lot of
      simplifier-specific code moving from CmdLineOpts to SimplMonad; a Good Thing.
      * The InlinePragma in the IdInfo of an Id is now simply an Activation saying
      when the Id can be inlined.  (It used to be a rather bizarre pair of a
      Bool and a (Maybe Phase), so this is much much easier to understand.)
      * The simplifier has a "mode" environment switch, replacing the old
      black list.  Unfortunately the data type decl has to be in
      CmdLineOpts, because it's an argument to the CoreDoSimplify switch
          data SimplifierMode = SimplGently | SimplPhase Int
      Here "gently" means "no rules, no inlining".   All the crucial
      inlining decisions are now collected together in SimplMonad
      (preInlineUnconditionally, postInlineUnconditionally, activeInline,
      1.  Only dictionary *functions* are made INLINE, not dictionaries that
      have no parameters.  (This inline-dictionary-function thing is Marcin's
      idea and I'm still not sure whether it's a good idea.  But it's definitely
      a Bad Idea when there are no arguments.)
      2.  Be prepared to specialise an INLINE function: an easy fix in
      But there is still a problem, which is that the INLINE wins
      at the call site, so we don't use the specialised version anyway.
      I'm still unsure whether it makes sense to SPECIALISE something
      you want to INLINE.
      Random smaller things
      * builtinRules (there was only one, but may be more) in PrelRules are now
        incorporated.   They were being ignored before...
      * OrdList.foldOL -->  OrdList.foldrOL, OrdList.foldlOL
      * Some tidying up of the tidyOpenTyVar, tidyTyVar functions.  I've
        forgotten exactly what!
    • simonpj's avatar
      [project @ 2001-09-26 15:11:50 by simonpj] · 5cd3527d
      simonpj authored
      	Code generation and SRT hygiene
      This is a big tidy up commit.  I don't think it breaks anything,
      but it certainly makes the code clearer (to me).
      I'm not certain that you can use it without sucking in my other
      big commit... they come from the same tree.
      Core-to-STG, live variables and Static Reference Tables (SRTs)
      I did a big tidy-up of the live-variable computation in CoreToStg.
      The key idea is that the live variables consist of two parts:
      	dynamic live vars
      	static live vars (CAFs)
      These two always travel round together, but they were always
      treated separately by the code until now. Now it's a new data type:
      type LiveInfo = (StgLiveVars, 	-- Dynamic live variables;
      				-- i.e. ones with a nested (non-top-level) binding
      		 CafSet)	-- Static live variables;
      				-- i.e. top-level variables that are CAFs or refer to them
      There's lots of documentation in CoreToStg.
      Code generation
      Arising from this, I found that SRT labels were stored in
      a LambdaFormInfo during code generation, whereas they *ought*
      to be in the ClosureInfo (which in turn contains a LambdaFormInfo).
      This led to lots of changes in ClosureInfo, and I took the opportunity
      to make it into a labelled record.
      Similarly, I made the data type in AbstractC a bit more explicit:
        -- C_SRT is what StgSyn.SRT gets translated to...
        -- we add a label for the table, and expect only the 'offset/length' form
      data C_SRT = NoC_SRT
      	   | C_SRT CLabel !Int{-offset-} !Int{-length-}
      (Previously there were bottoms lying around.)
    • chak's avatar
      [project @ 2001-09-26 13:42:50 by chak] · 03aa2ef6
      chak authored
      - split documentation off into a separate package
      - adapt to new docbook setup in RH7.1
    • rrt's avatar
      [project @ 2001-09-26 11:44:30 by rrt] · a355da9a
      rrt authored
      Make the print stylesheet generate a TOC for sets (so the PDF manual
      has a front TOC indicating that it contains both the user's guide and
      libraries guide).
      A simple question with a simple answer; how refreshing.
    • simonmar's avatar
      [project @ 2001-09-26 10:38:02 by simonmar] · e8ec5846
      simonmar authored
      ENODEV should really be an UnsupportedOperation, not NoSuchThing.
    • simonmar's avatar
      [project @ 2001-09-26 10:35:41 by simonmar] · 0ea9ecaf
      simonmar authored
      A failure while trying to set O_NONBLOCK on a file descriptor should
      be a non-fatal error.  It turns out that on FreeBSD it is an error
      (ENODEV) to try to set O_NONBLOCK on /dev/null.
    • simonmar's avatar
      [project @ 2001-09-26 09:41:26 by simonmar] · 2c910672
      simonmar authored
      Let's try that last commit again, and get it right this time...
    • simonmar's avatar
      [project @ 2001-09-26 09:16:00 by simonmar] · 6e554967
      simonmar authored
      When skipping a nested comment, keep track of the source location of
      the comment opener, so that we can report it in an error message
      rather than reporting the line at the end of the file.
      Also noticed a couple of ineficiencies in the nested comment code, so
      fixed those too.
    • simonmar's avatar
      [project @ 2001-09-26 08:59:42 by simonmar] · 159b1202
      simonmar authored
      Add the text about ForeignPtr vs. Ptr
  2. 25 Sep, 2001 6 commits
  3. 24 Sep, 2001 10 commits
  4. 23 Sep, 2001 4 commits
    • ken's avatar
      [project @ 2001-09-23 21:29:35 by ken] · a5840900
      ken authored
      We need to pass the -w flag to gcc when compilng *_stub.c files
      in addition to when compilng *.hc files.
    • ken's avatar
      [project @ 2001-09-23 20:46:46 by ken] · 6705e0ed
      ken authored
      CLEAN_FILES += PrelPrimopWrappers.hs # MERGE TO STABLE
    • ken's avatar
      [project @ 2001-09-23 20:45:55 by ken] · 4078bb33
      ken authored
      Disable debugging message.  (Only affects Alpha.)  MERGE TO STABLE
    • ken's avatar
      [project @ 2001-09-23 20:45:24 by ken] · 9d3bc150
      ken authored
      Fix the "find" commands we use to build a source distribution.
      Previously, it said things like "-exec path/{}", which doesn't work
      on many find's ({} really should only appear by itself in an argument).
      Now we pipe the output of find -print to sed and then to sh.  I hope
      the piping to sh doesn't break source distribution creation on Win32.
  5. 22 Sep, 2001 5 commits
  6. 21 Sep, 2001 6 commits