1. 05 Aug, 2012 1 commit
  2. 18 Jul, 2012 1 commit
  3. 13 Jul, 2012 1 commit
  4. 27 Jun, 2012 1 commit
    • Simon Peyton Jones's avatar
      Add silent superclass parameters (again) · aa1e0976
      Simon Peyton Jones authored and chak@cse.unsw.edu.au.'s avatar chak@cse.unsw.edu.au. committed
      Silent superclass parameters solve the problem that
      the superclasses of a dicionary construction can easily
      turn out to be (wrongly) bottom.  The problem and solution
      are described in
         Note [Silent superclass arguments] in TcInstDcls
      
      I first implemented this fix (with Dimitrios) in Dec 2010, but removed
      it again in Jun 2011 becuase we thought it wasn't necessary any
      more. (The reason we thought it wasn't necessary is that we'd stopped
      generating derived superclass constraints for *wanteds*.  But we were
      wrong; that didn't solve the superclass-loop problem.)
      
      So we have to re-implement it.  It's not hard.  Main features:
      
        * The IdDetails for a DFunId says how many silent arguments it has
      
        * A DFunUnfolding describes which dictionary args are
          just parameters (DFunLamArg) and which are a function to apply
          to the parameters (DFunPolyArg).  This adds the DFunArg type
          to CoreSyn
      
        * Consequential changes to IfaceSyn.  (Binary hi file format changes
          slightly.)
      
        * TcInstDcls changes to generate the right dfuns
      
        * CoreSubst.exprIsConApp_maybe handles the new DFunUnfolding
      
      The thing taht is *not* done yet is to alter the vectoriser to
      pass the relevant extra argument when building a PA dictionary.
      aa1e0976
  5. 12 Jun, 2012 1 commit
  6. 11 Jun, 2012 1 commit
  7. 05 Jun, 2012 1 commit
  8. 09 May, 2012 2 commits
  9. 02 May, 2012 1 commit
    • Simon Peyton Jones's avatar
      Allow cases with empty alterantives · ac230c5e
      Simon Peyton Jones authored
      This patch allows, for the first time, case expressions with an empty
      list of alternatives. Max suggested the idea, and Trac #6067 showed
      that it is really quite important.
      
      So I've implemented the idea, fixing #6067. Main changes
      
       * See Note [Empty case alternatives] in CoreSyn
      
       * Various foldr1's become foldrs
      
       * IfaceCase does not record the type of the alternatives.
         I added IfaceECase for empty-alternative cases.
      
       * Core Lint does not complain about empty cases
      
       * MkCore.castBottomExpr constructs an empty-alternative case
         expression   (case e of ty {})
      
       * CoreToStg converts '(case e of {})' to just 'e'
      ac230c5e
  10. 27 Apr, 2012 4 commits
    • Simon Peyton Jones's avatar
      Revert "Add -faggressive-primops" · 75336070
      Simon Peyton Jones authored
      This reverts commit 745ec959.
      
      Sigh. Seg fault
      75336070
    • Simon Peyton Jones's avatar
      Revert "Refactoring in CoreUtils/CoreArity" · a2ae0d77
      Simon Peyton Jones authored
      This reverts commit e3f8557c.
      
      Sigh. Seg fault.
      a2ae0d77
    • Simon Peyton Jones's avatar
      Refactoring in CoreUtils/CoreArity · e3f8557c
      Simon Peyton Jones authored
      In the previous commit about "aggressive primops" I wanted a new
      function CoreUtils.exprCertainlyTerminates.  In doing this I ended up
      with a significant refactoring in CoreUtils.  The new structure has
      quite a lot of nice sharing:
      
               exprIsCheap             = exprIsCheap' isHNFApp
               exprIsExpandable        = exprIsCheap' isConLikeApp
      
               exprIsHNF               = exprIsHNFlike isHNFApp
               exprIsConLike           = exprIsHNFlike isConLikeApp
               exprCertainlyTerminates = exprIsHNFlike isTerminatingApp
      
      This patch also does some renaming
      
          CheapAppFun      -->   FunAppAnalyser
          isCheapApp       -->   isHNFApp
          isExpandableApp  -->   isConLikeApp
      e3f8557c
    • Simon Peyton Jones's avatar
      Add -faggressive-primops · 745ec959
      Simon Peyton Jones authored
      I'm experimenting with making GHC a bit more aggressive about
      
        a) dropping case expressions if the result is unused
              Simplify.rebuildCase, CaseElim equation
      
        b) floating case expressions inwards
              FloatIn.fiExpr, AnnCase
      
      In both cases the new behaviour is gotten with a static (debug)
      flag -faggressive-primops.  The extra "aggression" is to allow
      discarding and floating in for side-effecting operations.  See
      the new, extensive Note [PrimOp can_fail and has_side_effects]
      and Note [Aggressive PrimOps] in PrimoOp.
      
      When discarding a case with unused binders, in the lifted-type
      case it's definitely ok if the scrutinee terminates; previously
      we were checking exprOkForSpeculation, which is significantly
      worse.
      
      There's a related change to CoreUtils/CoreArity, but I'll put that
      in the next commit.
      745ec959
  11. 30 Mar, 2012 1 commit
  12. 21 Mar, 2012 1 commit
    • batterseapower's avatar
      Make impossible-alternative-finding code more reusable · aecacda1
      batterseapower authored
      Makes the following changes:
       1. Generalises the type signatures of some functions relating to alternatives
          so that the type of "variables" and "expression" is not specified
       2. Puts the bulk of the alternative-filtering code into a new function filterAlts
          (in CoreUtils) that can be used outside of the SimplM monad
       3. Allows prepareAlts to return a null alternatives list if none are applicable -
          it turns out that this case was already handled by the caller (in the simplifier).
          This should result in a modest optimisation improvement in some cases.
      
      Conflicts:
      
      	compiler/coreSyn/CoreUtils.lhs
      	compiler/simplCore/SimplUtils.lhs
      aecacda1
  13. 04 Mar, 2012 1 commit
  14. 16 Feb, 2012 1 commit
  15. 19 Jan, 2012 1 commit
  16. 16 Jan, 2012 1 commit
  17. 13 Jan, 2012 1 commit
    • Simon Peyton Jones's avatar
      Add -faggressive-primops plus refactoring in CoreUtils · 601c983d
      Simon Peyton Jones authored
      I'm experimenting with making GHC a bit more aggressive about
        a) dropping case expressions if the result is unused
              Simplify.rebuildCase, CaseElim equation
      
        b) floating case expressions inwards
              FloatIn.fiExpr, AnnCase
      
      In both cases the new behaviour is gotten with a static (debug)
      flag -faggressive-primops.  The extra "aggression" is to allow
      discarding and floating in for side-effecting operations.  See
      the new, extensive Note [PrimOp can_fail and has_side_effects]
      in PrimoOp.
      
      When discarding a case with unused binders, in the lifted-type
      case it's definitely ok if the scrutinee terminates; previously
      we were checking exprOkForSpeculation, which is significantly
      worse.
      
      So I wanted a new function CoreUtils.exprCertainlyTerminates.
      In doing this I ended up with a significant refactoring in
      CoreUtils.  The new structure has quite a lot of nice sharing:
      
          exprIsCheap             = exprIsCheap' isHNFApp
          exprIsExpandable        = exprIsCheap' isConLikeApp
      
          exprIsHNF               = exprIsHNFlike isHNFApp
          exprIsConLike           = exprIsHNFlike isConLikeApp
          exprCertainlyTerminates = exprIsHNFlike isTerminatingApp
      601c983d
  18. 12 Jan, 2012 1 commit
    • Simon Peyton Jones's avatar
      Fix Trac #5658: strict bindings not floated in · 3beb1a83
      Simon Peyton Jones authored
      Two changes here
      
      * The main change here is to enhance the FloatIn pass so that it can
        float case-bindings inwards.  In particular the case bindings for
        array indexing.
      
      * Also change the code in Simplify, to allow a case on array
        indexing (ie can_fail is true) to be discarded altogether if its
        results are unused.
      
      Lots of new comments in PrimOp about can_fail and has_side_effects
      
      Some refactoring to share the FloatBind data structure between
      FloatIn and FloatOut
      3beb1a83
  19. 09 Jan, 2012 1 commit
  20. 07 Dec, 2011 1 commit
    • Simon Marlow's avatar
      Improve optimisation in the presence of SCCs (fixes #5363) · eea40328
      Simon Marlow authored
      We had some special cases to handle things like
      
        case (scc c (case E of alts)) of alts'
      
      but it only worked when there was a single scc in the way.  This
      generalises the optimisation to handle multiple sccs and ticks, so
      that we can catch most case-of-case optimisations that would normally
      apply in the absence of profiling.
      
      This fixes the example in #5363, and nofib results (with -prof
      -fprof-auto) show that allocation universally goes down or stays the
      same.
      eea40328
  21. 16 Nov, 2011 1 commit
  22. 14 Nov, 2011 2 commits
  23. 11 Nov, 2011 2 commits
  24. 10 Nov, 2011 1 commit
  25. 09 Nov, 2011 1 commit
  26. 04 Nov, 2011 2 commits
    • Simon Marlow's avatar
      Improve optimisation for ticks · 659d5d06
      Simon Marlow authored
      We want to prevent the SCC from getting in the way when we have
      case-of-scc-of-case, and the case-of-case would transform, so we push
      the scc inside the inner case to allow the case-of-case to take
      place.  See comments for details.
      659d5d06
    • Ian Lynagh's avatar
      Use -fwarn-tabs when validating · 1df19864
      Ian Lynagh authored
      We only use it for "compiler" sources, i.e. not for libraries.
      Many modules have a -fno-warn-tabs kludge for now.
      1df19864
  27. 02 Nov, 2011 2 commits
    • Simon Marlow's avatar
      be9e727c
    • Simon Marlow's avatar
      Overhaul of infrastructure for profiling, coverage (HPC) and breakpoints · 7bb0447d
      Simon Marlow authored
      User visible changes
      ====================
      
      Profilng
      --------
      
      Flags renamed (the old ones are still accepted for now):
      
        OLD            NEW
        ---------      ------------
        -auto-all      -fprof-auto
        -auto          -fprof-exported
        -caf-all       -fprof-cafs
      
      New flags:
      
        -fprof-auto              Annotates all bindings (not just top-level
                                 ones) with SCCs
      
        -fprof-top               Annotates just top-level bindings with SCCs
      
        -fprof-exported          Annotates just exported bindings with SCCs
      
        -fprof-no-count-entries  Do not maintain entry counts when profiling
                                 (can make profiled code go faster; useful with
                                 heap profiling where entry counts are not used)
      
      Cost-centre stacks have a new semantics, which should in most cases
      result in more useful and intuitive profiles.  If you find this not to
      be the case, please let me know.  This is the area where I have been
      experimenting most, and the current solution is probably not the
      final version, however it does address all the outstanding bugs and
      seems to be better than GHC 7.2.
      
      Stack traces
      ------------
      
      +RTS -xc now gives more information.  If the exception originates from
      a CAF (as is common, because GHC tends to lift exceptions out to the
      top-level), then the RTS walks up the stack and reports the stack in
      the enclosing update frame(s).
      
      Result: +RTS -xc is much more useful now - but you still have to
      compile for profiling to get it.  I've played around a little with
      adding 'head []' to GHC itself, and +RTS -xc does pinpoint the problem
      quite accurately.
      
      I plan to add more facilities for stack tracing (e.g. in GHCi) in the
      future.
      
      Coverage (HPC)
      --------------
      
       * derived instances are now coloured yellow if they weren't used
       * likewise record field names
       * entry counts are more accurate (hpc --fun-entry-count)
       * tab width is now correct (markup was previously off in source with
         tabs)
      
      Internal changes
      ================
      
      In Core, the Note constructor has been replaced by
      
              Tick (Tickish b) (Expr b)
      
      which is used to represent all the kinds of source annotation we
      support: profiling SCCs, HPC ticks, and GHCi breakpoints.
      
      Depending on the properties of the Tickish, different transformations
      apply to Tick.  See CoreUtils.mkTick for details.
      
      Tickets
      =======
      
      This commit closes the following tickets, test cases to follow:
      
        - Close #2552: not a bug, but the behaviour is now more intuitive
          (test is T2552)
      
        - Close #680 (test is T680)
      
        - Close #1531 (test is result001)
      
        - Close #949 (test is T949)
      
        - Close #2466: test case has bitrotted (doesn't compile against current
          version of vector-space package)
      7bb0447d
  28. 23 Sep, 2011 1 commit
    • Simon Peyton Jones's avatar
      Add a transformation limit to the simplifier (Trac #5448) · 24a2353a
      Simon Peyton Jones authored
      This addresses the rare cases where the simplifier diverges
      (see the above ticket).  We were already counting how many simplifier
      steps were taking place, but with no limit.  This patch adds a limit;
      at which point we halt compilation, and print out useful stats. The
      stats show what is begin inlined, and how often, which points you
      directly to the problem.  The limit is set based on the size of the
      program.
      
      Instead of halting compilation, we could instead just inhibit
      inlining, which would let compilation of the module complete. This is
      a bit harder to implement, and it's likely to mean that you unrolled
      the function 1143 times and then ran out of ticks; you probably don't
      want to complete parsing on this highly-unrolled program.
      
      Flags: -dsimpl-tick-factor=N.  Default is 100 (percent).
             A bigger number increases the allowed maximum tick count.
      24a2353a
  29. 07 Sep, 2011 1 commit
  30. 06 Sep, 2011 1 commit
  31. 21 Jul, 2011 1 commit
    • Simon Peyton Jones's avatar
      Simplify the treatment of RULES in OccurAnal · f88b20f4
      Simon Peyton Jones authored
      I realised that my recently-added cunning stuff about
      RULES for imported Ids was simply wrong, so this patch
      removes it.   See Note [Rules for imported functions],
      which explains it all.
      
      This patch also does quite a bit of refactoring in
      the treatment of loop breakers.
      f88b20f4
  32. 15 Jul, 2011 1 commit