1. 30 Jul, 2015 23 commits
  2. 29 Jul, 2015 1 commit
  3. 28 Jul, 2015 3 commits
    • Simon Marlow's avatar
      Eliminate zero_static_objects_list() · f83aab95
      Simon Marlow authored
      Summary:
      [Revised version of D1076 that was committed and then backed out]
      
      In a workload with a large amount of code, zero_static_objects_list()
      takes a significant amount of time, and furthermore it is in the
      single-threaded part of the GC.
      
      This patch uses a slightly fiddly scheme for marking objects on the
      static object lists, using a flag in the low 2 bits that flips between
      two states to indicate whether an object has been visited during this
      GC or not.  We also have to take into account objects that have not
      been visited yet, which might appear at any time due to runtime linking.
      
      Test Plan: validate
      
      Reviewers: austin, ezyang, rwbarton, bgamari, thomie
      
      Reviewed By: bgamari, thomie
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D1106
      f83aab95
    • Simon Peyton Jones's avatar
      Fallout from more assiduous RULE warnings · a1dd7dd6
      Simon Peyton Jones authored
      GHC now warns if rules compete, so that it's not predicatable
      which will work and which will not. E.g.
      
      {-# RULES
        f (g x) = ...
        g True  = ...
        #-}
      
      If we had (f (g True)) it's not clear which rule would fire.
      
      This showed up fraility in the libraries.
      
      * Suppress warnigns in Control.Arrow, Control.Category for class
        methods. At the moment we simply don't have a good way to write a
        RULE with a class method in the LHS.  See Trac #1595.  Arrow and
        Category attempt to do so; I have silenced the complaints with
        -fno-warn-inline-rule-shadowing, but it's not a great solution.
      
      * Adjust the NOINLINE pragma on 'GHC.Base.map' to account for the
        map/coerce rule
      
      * Adjust the rewrite rules in Enum, especially for the "literal 1"
        case.  See Note [Enum Integer rules for literal 1].
      
      * Suppress warnings for 'bytestring' e.g.
         libraries/bytestring/Data/ByteString.hs:895:1: warning:
            Rule "ByteString specialise break (x==)" may never fire
              because rule "Class op ==" for ‘==’ might fire first
            Probable fix: add phase [n] or [~n] to the competing rule
      a1dd7dd6
    • Joachim Breitner's avatar
      Test case for #10698 · e343c0a7
      Joachim Breitner authored
      the expected error message is from an older version of GHC; I don’t know
      the exact error message that we should get here until the bug is
      fixed...
      e343c0a7
  4. 27 Jul, 2015 7 commits
    • Simon Marlow's avatar
      Revert "Eliminate zero_static_objects_list()" · a1e8620f
      Simon Marlow authored
      This reverts commit b949c96b.
      a1e8620f
    • Simon Marlow's avatar
      Revert "RetainerProfile: Add missing UNTAG_STATIC_LIST_PTR" · 09925c36
      Simon Marlow authored
      This reverts commit 09d05050.
      09925c36
    • Simon Peyton Jones's avatar
      Improve warnings for rules that might not fire · 2d88a531
      Simon Peyton Jones authored
      Two main things here
      
      * Previously we only warned about the "head" function of the rule,
        but actually the warning applies to any free variable on the LHS.
      
      * We now warn not only when one of these free vars can inline, but
        also if it has an active RULE (c.f. Trac #10528)
      
      See Note [Rules and inlining/other rules] in Desugar
      
      This actually shows up quite a few warnings in the libraries, notably
      in Control.Arrow, where it correctly points out that rules like
          "compose/arr"   forall f g .
                          (arr f) . (arr g) = arr (f . g)
      might never fire, because the rule for 'arr' (dictionary selection)
      might fire first.  I'm not really sure what to do here; there is some
      discussion in Trac #10595.
      
      A minor change is adding BasicTypes.pprRuleName to pretty-print RuleName.
      2d88a531
    • Simon Peyton Jones's avatar
      Do not inline or apply rules on LHS of rules · bc4b64ca
      Simon Peyton Jones authored
      This is the right thing to do anyway, and fixes Trac #10528
      bc4b64ca
    • rwbarton's avatar
      Remove runSTRep from PrelNames · 81fffc4b
      rwbarton authored
      It has no special treatment in the compiler any more. The last use
      was removed in 99d4e5b4 "Implement cardinality analysis".
      
      Test Plan: validate
      
      Reviewers: austin, bgamari, simonpj
      
      Reviewed By: simonpj
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D1099
      81fffc4b
    • spinda's avatar
      Add UInfixT to TH types (fixes #10522) · 21782739
      spinda authored
      UInfixT is like UInfixE or UInfixP but for types. Template Haskell
      splices can use it to punt fixity handling to GHC when constructing
      types.
      
      UInfixT is converted in compiler/hsSyn/Convert to a right-biased tree of
      HsOpTy, which is already rearranged in compiler/rename/RnTypes to match
      operator fixities.
      
      This patch consists of (1) adding UInfixT to the AST, (2) implementing
      the conversion and updating relevant comments, (3) updating
      pretty-printing and library support, and (4) adding tests.
      
      Test Plan: validate
      
      Reviewers: austin, goldfire, bgamari
      
      Reviewed By: bgamari
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D1088
      
      GHC Trac Issues: #10522
      21782739
    • Adam Sandberg Eriksson's avatar
      Implementation of StrictData language extension · f842ad6c
      Adam Sandberg Eriksson authored
      This implements the `StrictData` language extension, which lets the
      programmer default to strict data fields in datatype declarations on a
      per-module basis.
      
      Specification and motivation can be found at
      https://ghc.haskell.org/trac/ghc/wiki/StrictPragma
      
      This includes a tricky parser change due to conflicts regarding `~` in
      the type level syntax: all ~'s are parsed as strictness annotations (see
      `strict_mark` in Parser.y) and then turned into equality constraints at
      the appropriate places using `RdrHsSyn.splitTilde`.
      
      Updates haddock submodule.
      
      Test Plan: Validate through Harbormaster.
      
      Reviewers: goldfire, austin, hvr, simonpj, tibbe, bgamari
      
      Reviewed By: simonpj, tibbe, bgamari
      
      Subscribers: lelf, simonpj, alanz, goldfire, thomie, bgamari, mpickering
      
      Differential Revision: https://phabricator.haskell.org/D1033
      
      GHC Trac Issues: #8347
      f842ad6c
  5. 26 Jul, 2015 3 commits
    • rwbarton's avatar
      Comment tweaks only · 474d4ccc
      rwbarton authored
      474d4ccc
    • rwbarton's avatar
      Add missing parentheses in eqBigNatWord# · c55f61ca
      rwbarton authored
      Summary:
      I'm pretty sure that parentheses were intended here. But oddly, they
      make very little difference.
      
      The presumably intended expression
          (sizeofBigNat# bn ==# 1#) `andI#` (bigNatToWord bn `eqWord#` w#)
      is 1# exactly when bn consists of a single limb equal to w#, clearly.
      
      In the original expression
          sizeofBigNat# bn ==# 1# `andI#` (bigNatToWord bn `eqWord#` w#)
      the right-hand side of ==# is always 0# or 1#. So it is 1# when bn
      consists of a single limb equal to w#. It is also 1# when bn has
      zero limbs and the word past the end of bn does not happen to be
      equal to w#. So in practice the difference is that nullBigNat was
      eqBigNatWord# to almost everything, but eqBigNatWord# is never
      supposed to be called on nullBigNat anyways.
      
      Note that even the corrected version might perform an out-of-bounds
      memory access if passed nullBigNat, because `andI#` is not guaranteed
      to short-circuit, though in fact GHC does convert isZeroBigNat to a
      series of branches in my local build.
      
      Test Plan: validate
      
      Reviewers: hvr, bgamari, goldfire, austin
      
      Reviewed By: hvr, bgamari
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D1095
      c55f61ca
    • rwbarton's avatar
      Use isTrue# around primitive comparisons in integer-gmp · 7e70c063
      rwbarton authored
      Summary:
      The form
        case na# ==# nb# of
          0# -> ...
          _  -> ...
      sometimes generates convoluted assembly, see #10676.
      timesInt2Integer was the most spectacular offender, especially as
      it is a rather cheap function overall (no calls to gmp).
      
      I checked a few instances and some of the old generated assembly
      was fine already, but I changed them all for consistency. The new
      form is also more consistent with use of these primops in general.
      
      Test Plan: validate
      
      Reviewers: hvr, bgamari, goldfire, austin
      
      Reviewed By: hvr
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D1094
      7e70c063
  6. 25 Jul, 2015 2 commits
    • Edward Z. Yang's avatar
      070f76ac
    • Sergei Trofimovich's avatar
      renamer: fix module-level deprecation message · b04bed0a
      Sergei Trofimovich authored
      Noticed today that deprecation warnings are
      slightly broken in -HEAD:
      
        mtl-2.2.1/Control/Monad/Error/Class.hs:46:1: warning:
          Module ‘Control.Monad.Trans.Error’ is deprecated:
            ([", U, s, e,  , C, o, n, t, r, o, l, ., M, o, n, a, d, ., T, r, a,
              n, s, ., E, x, c, e, p, t,  , i, n, s, t, e, a, d, "],
             Use Control.Monad.Trans.Except instead)
      
      Commit e6191d1c
      
      
      slightly changed WarningTxt declaration:
      
      -data WarningTxt = WarningTxt (Located SourceText) [Located FastString]
      -                | DeprecatedTxt (Located SourceText) [Located FastString]
      +data WarningTxt = WarningTxt (Located SourceText)
      +                             [Located (SourceText,FastString)]
      +                | DeprecatedTxt (Located SourceText)
      +                                [Located (SourceText,FastString)]
      
      But 'moduleWarn' function was not updated to do the stripping.
      Signed-off-by: default avatarSergei Trofimovich <siarheit@google.com>
      
      Reviewers: austin, bgamari, hvr, goldfire, rwbarton, alanz
      
      Reviewed By: rwbarton, alanz
      
      Subscribers: thomie
      
      Differential Revision: https://phabricator.haskell.org/D1096
      
      GHC Trac Issues: #10313
      b04bed0a
  7. 24 Jul, 2015 1 commit