Skip to content
Snippets Groups Projects
  1. Mar 19, 2014
  2. Mar 14, 2014
  3. Mar 13, 2014
  4. Mar 12, 2014
  5. Mar 11, 2014
    • tibbe's avatar
      Fix incorrect loop condition in inline array allocation · c1d74ab9
      tibbe authored
      Also make sure allocHeapClosure updates profiling counters with the
      memory allocated.
      c1d74ab9
    • Simon Marlow's avatar
      Refactor inline array allocation · b684f27e
      Simon Marlow authored and tibbe's avatar tibbe committed
      - Move array representation knowledge into SMRep
      
      - Separate out low-level heap-object allocation so that we can reuse
        it from doNewArrayOp
      
      - remove card-table initialisation, we can safely ignore the card
        table for newly allocated arrays.
      b684f27e
    • Simon Marlow's avatar
      Represent offsets into heap objects with byte, not word, offsets · a70e7b47
      Simon Marlow authored and tibbe's avatar tibbe committed
      I'd like to be able to pack together non-pointer fields that are less
      than a word in size, and this is a necessary prerequisite.
      a70e7b47
    • tibbe's avatar
      codeGen: allocate small arrays of statically known size inline · 22f010e0
      tibbe authored
      This results in a 46% runtime decrease when allocating an array of 16
      unit elements on a 64-bit machine.
      
      In order to allow newArray# to have both an inline and an out-of-line
      implementation, cgOpApp is refactored slightly. The new implementation
      of cgOpApp should make it easier to add other primops with both inline
      and out-of-line implementations in the future.
      22f010e0
    • Simon Peyton Jones's avatar
      Fix last-minute typo in SetLevels commit ef44a4 · 41f80310
      Simon Peyton Jones authored
      Sorry about that...
      41f80310
    • Simon Peyton Jones's avatar
      Make SetLevels do substitution properly (fixes Trac #8714) · ef44a429
      Simon Peyton Jones authored
      Nowadays SetLevels floats case expressions as well as let-bindings,
      and case expressions bind type variables.  We need to clone all such
      floated binders, to avoid accidental name capture.  But I'd forgotten
      to substitute for the cloned type variables, causing #8714.  (In the
      olden days only Ids were cloned, from let-bindings.)
      
      This patch fixes the bug and does quite a bit of clean-up refactoring
      as well, by putting the context level in the LvlEnv.
      
      There is no effect on performance, except that nofib 'rewrite' improves
      allocations by 3%.  On investigation I think it was a fluke to do with
      loop-cutting in big letrec nests.  But at least it's a fluke in the
      right direction.
      
              Program           Size    Allocs   Runtime   Elapsed  TotalMem
      --------------------------------------------------------------------------------
                  Min          -0.4%     -3.0%    -19.4%    -19.4%    -26.7%
                  Max          -0.0%     +0.0%    +17.9%    +17.9%      0.0%
       Geometric Mean          -0.1%     -0.0%     -0.7%     -0.7%     -0.4%
      ef44a429
    • Simon Peyton Jones's avatar
      Comments only · a10ed3e6
      Simon Peyton Jones authored
      a10ed3e6
  6. Mar 10, 2014
  7. Mar 07, 2014
    • Simon Peyton Jones's avatar
      Fix the treatment of lexically scoped kind variables (Trac #8856) · cf1a0f97
      Simon Peyton Jones authored
      The issue here is described in Note [Binding scoped type variables] in
      TcPat.  When implementing this fix I was able to make things quite a
      bit simpler:
       * The type variables in a type signature now never unify
         with each other, and so can be straightfoward skolems.
       * We only need the SigTv stuff for signatures in patterns,
         and for kind variables.
      cf1a0f97
    • Simon Peyton Jones's avatar
      Make -XDeriveFunctor more generous about non-last arguments (Trac #8678) · cdac487b
      Simon Peyton Jones authored
      When deriving Functor, Foldable, Traversable, we need only look at the
      way that the last type argument is treated.  It's fine for there to
      be existentials etc, provided they don't affect the last type argument.
      
      See Note [Check that the type variable is truly universal] in TcDeriv.
      cdac487b
  8. Mar 06, 2014
    • Simon Peyton Jones's avatar
    • Simon Peyton Jones's avatar
      Make the demand on a binder compatible with type (fixes Trac #8569) · 4b355cd2
      Simon Peyton Jones authored
      Because of GADTs and casts we were getting binders whose
      demand annotation was more deeply nested than made sense
      for its type.
      
      See Note [Trimming a demand to a type], in Demand.lhs,
      which I reproduce here:
      
         Note [Trimming a demand to a type]
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         Consider this:
      
           f :: a -> Bool
           f x = case ... of
                   A g1 -> case (x |> g1) of (p,q) -> ...
                   B    -> error "urk"
      
         where A,B are the constructors of a GADT.  We'll get a U(U,U) demand
         on x from the A branch, but that's a stupid demand for x itself, which
         has type 'a'. Indeed we get ASSERTs going off (notably in
         splitUseProdDmd, Trac #8569).
      
         Bottom line: we really don't want to have a binder whose demand is more
         deeply-nested than its type.  There are various ways to tackle this.
         When processing (x |> g1), we could "trim" the incoming demand U(U,U)
         to match x's type.  But I'm currently doing so just at the moment when
         we pin a demand on a binder, in DmdAnal.findBndrDmd.
      4b355cd2
    • Simon Peyton Jones's avatar
      Add some debug tracing · eeb1400a
      Simon Peyton Jones authored
      eeb1400a
  9. Mar 05, 2014
    • Gabor Greif's avatar
      Typos in comments · 2d828460
      Gabor Greif authored
      2d828460
    • Joachim Breitner's avatar
      Major Call Arity rework · cb8a63cb
      Joachim Breitner authored
      This patch improves the call arity analysis in various ways.
      
      Most importantly, it enriches the analysis result information so that
      when looking at a call, we do not have to make a random choice about
      what side we want to take the information from. Instead we can combine
      the results in a way that does not lose valuable information.
      
      To do so, besides the incoming arities, we store remember "what can be
      called with what", i.e. an undirected graph between the (interesting)
      free variables of an expression. Of course it makes combining the
      results a bit more tricky (especially mutual recursion), but still
      doable.
      
      The actually implemation of the graph structure is abstractly put away
      in a module of its own (UnVarGraph.hs)
      
      The implementation is geared towards efficiently representing the graphs
      that we need (which can contain large complete and large complete
      bipartite graphs, which would be huge in other representations). If
      someone feels like designing data structures: There is surely some
      speed-up to be obtained by improving that data structure.
      
      Additionally, the analysis now takes into account that if a RHS stays a
      thunk, then its calls happen only once, even if the variables the RHS is
      bound to is evaluated multiple times, or is part of a recursive group.
      cb8a63cb
  10. Feb 28, 2014
  11. Feb 27, 2014
    • Simon Marlow's avatar
      Fix a bug in codegen for non-updatable selector thunks (#8817) · b1ddec1e
      Simon Marlow authored
      To evaluate most non-updatable thunks, we can jump directly to the
      entry code if we know what it is.  But not for a selector thunk: these
      might be updated by the garbage collector, so we have to enter the
      closure with an indirect jump through its info pointer.
      b1ddec1e
  12. Feb 26, 2014
    • Richard Eisenberg's avatar
      Fix #8807. · 98b6756b
      Richard Eisenberg authored
      It turns out that the enhanced repPred function in DsMeta assumed
      that the head of any constraint would be a tycon. This assumption
      is false. Happily, the solution involved *deleting* code. I
      just removed repPred in favor of repTy, and added the HsEqTy case
      to repTy, where it should be anyway.
      98b6756b
  13. Feb 25, 2014
  14. Feb 24, 2014
  15. Feb 20, 2014
  16. Feb 19, 2014
  17. Feb 18, 2014
Loading