This project is mirrored from Pull mirroring failed .
Repository mirroring has been paused due to too many failed attempts. It can be resumed by a project maintainer.
Last successful update .
  1. 30 Oct, 2017 1 commit
    • Ben Gamari's avatar
      Add -falignment-sanitization flag · cecd2f2d
      Ben Gamari authored
      Here we add a flag to instruct the native code generator to add
      alignment checks in all info table dereferences. This is helpful in
      catching pointer tagging issues.
      Thanks to @jrtc27 for uncovering the tagging issues on Sparc which
      inspired this flag.
      Test Plan: Validate
      Reviewers: simonmar, austin, erikd
      Reviewed By: simonmar
      Subscribers: rwbarton, trofi, thomie, jrtc27
      Differential Revision:
  2. 29 Oct, 2017 2 commits
    • Joachim Breitner's avatar
      Implement a dedicated exitfication pass #14152 · 0e953da1
      Joachim Breitner authored
      The idea is described in #14152, and can be summarized: Float the exit
      path out of a joinrec, so that the simplifier can do more with it.
      See the test case for a nice example.
      The floating goes against what the simplifier usually does, hence we
      need to be careful not inline them back.
      The position of exitification in the pipeline was chosen after a small
      amount of experimentation, but may need to be improved. For example,
      exitification can allow rewrite rules to fire, but for that it would
      have to happen before the `simpl_phases`.
    reports these nice performance wins:
          Nofib allocations
          fannkuch-redux    78446640  - 99.92%      64560
          k-nucleotide     109466384  - 91.32%    9502040
          simple            72424696  -  5.96%   68109560
          Nofib instruction counts
          fannkuch-redux  1744331636  -  3.86% 1676999519
          k-nucleotide    2318221965  -  6.30% 2172067260
          scs             1978470869  -  3.35% 1912263779
          simple           669858104  -  3.38%  647206739
          spectral-norm    186423292  -  5.37%  176411536
      Differential Revision:
    • Joachim Breitner's avatar
      simplNonRecJoinPoint: Handle Shadowing correctly · 97ca0d24
      Joachim Breitner authored
      Previously, (since 33452dfc), simplNonRecJoinPoint would do the wrong
      thing in the presence of shadowing: It analyzed the RHS of a join
      binding with the environment for the body. In particular, with
          foo x =
            join x = x * x
            in x
      where there is shadowing, it renames the inner x to x1, and should
          foo x =
            join x1 = x * x
            in x1
      but because the substitution (x ↦ x1) is also used on the RHS we get the
          foo x =
            join x1 = x1 * x1
            in x1
      Fixed this by adding a `rhs_se` parameter, analogous to `simplNonRecE`
      and `simplLazyBind`.
      Differential Revision:
  3. 27 Oct, 2017 4 commits
    • Bartosz Nitka's avatar
      Make tagForCon non-linear · faf60e85
      Bartosz Nitka authored
      Computing the number of constructors for TyCon is linear
      in the number of constructors.
      That's wasteful if all you want to check is if that
      number is smaller than what fits in tag bits
      (usually 8 things).
      What this change does is to use a function that can
      determine the ineqaulity without computing the size.
      This improves compile time on a module with a
      data type that has 10k constructors.
      The variance in total time is (suspiciously) high,
      but going by the best of 3 the numbers are 8.186s vs 7.511s.
      For 1000 constructors the difference isn't noticeable:
      0.646s vs 0.624s.
      The hot spots were cgDataCon and cgEnumerationTyCon
      where tagForCon is called in a loop.
      One alternative would be to pass down the size.
      Test Plan: harbormaster
      Reviewers: bgamari, simonmar, austin
      Reviewed By: simonmar
      Subscribers: rwbarton, thomie
      Differential Revision:
    • Simon Marlow's avatar
      ApplicativeDo: handle BodyStmt (#12143) · 41f90559
      Simon Marlow authored
      It's simple to treat BodyStmt just like a BindStmt with a wildcard
      pattern, which is enough to fix #12143 without going all the way to
      using `<*` and `*>` (#10892).
      Test Plan:
      * new test cases in `ado004.hs`
      * validate
      Reviewers: niteria, simonpj, bgamari, austin, erikd
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #12143
      Differential Revision:
    • Simon Peyton Jones's avatar
      Fix an exponential-blowup case in SpecConstr · 7d7d94fb
      Simon Peyton Jones authored
      Trac #14379 showed a case where use of "forcing" to do
      "damn the torpedos" specialisation without resource limits
      (which 'vector' does a lot) led to exponential blowup.
      The fix is easy.  Finding it wasn't.  See Note [Forcing
      specialisation] and the one-line change in decreaseSpecCount.
    • Simon Peyton Jones's avatar
  4. 25 Oct, 2017 9 commits
    • Tobias Dammers's avatar
      Factor out readField (#14364) · dbd81f7e
      Tobias Dammers authored
      Improves compiler performance of deriving Read instances, as suggested
      in the issue.
      Additionally, we introduce `readSymField`, a companion to `readField`
      that parses symbol-type fields (where the field name is a symbol, e.g.
      `(#)`, rather than an alphanumeric identifier. The decision between
      these two functions is made a compile time, because we already know
      which one we need based on the field name.
      Reviewers: austin, hvr, bgamari, RyanGlScott
      Reviewed By: bgamari
      Subscribers: RyanGlScott, rwbarton, thomie
      Differential Revision:
    • Alec Theriault's avatar
      Fix a bug in 'alexInputPrevChar' · 821adee1
      Alec Theriault authored
      The lexer hacks around unicode by squishing any character into a 'Word8'
      and then storing the actual character in its state. This happens at
      That is all and well, but we ought to be careful that the characters we
      retrieve via 'alexInputPrevChar' also fit this convention.
      In fact, #13986 exposes nicely what can go wrong: the regex in the left
      context of the type application rule uses the '$idchar' character set
      which relies on the unicode hack. However, a left context corresponds
      to a call to 'alexInputPrevChar', and we end up passing full blown
      unicode characters to '$idchar', despite it not being equipped to deal
      with these.
      Test Plan: Added a regression test case
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #13986
      Differential Revision:
    • Daishi Nakajima's avatar
      Implement `-Wpartial-fields` warning (#7169) · f7f270eb
      Daishi Nakajima authored
      Warning on declaring a partial record selector.
      However, disable warn with field names that start with underscore.
      Test Plan: Added 1 test case.
      Reviewers: austin, bgamari, simonpj
      Reviewed By: bgamari, simonpj
      Subscribers: goldfire, simonpj, duog, rwbarton, thomie
      GHC Trac Issues: #7169
      Differential Revision:
    • Tobias Dammers's avatar
      Performance improvements linear regAlloc (#7258) · df636682
      Tobias Dammers authored
      When allocating and potentially spilling registers, we need to check
      the desired allocations against current allocations to decide where we
      can spill to, cq. which allocations we can toss and if so, how.
      Previously, this was done by walking the Cartesian product of the
      current allocations (`assig`) and the allocations to keep (`keep`),
      which has quadratic complexity. This patch introduces two improvements:
      1. pre-filter the `assig` list, because we are only interested in two
      types of allocations (in register, and in register+memory), which will
      only make up a small and constant portion of the list; and
      2. use set / map operations instead of lists, which reduces algorithmic
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie
      Differential Revision:
    • Douglas Wilson's avatar
      Fix space leak in BinIface.getSymbolTable · 1c15d8ed
      Douglas Wilson authored
      Replace a call to mapAccumR, which uses linear stack space, with a
      gadget that uses constant space.
      Remove an unused parameter from fromOnDiskName.
      The tests T1292_imports and T4239 are now reporting imported names in a
      different order. I don't completely understand why, but I presume it is
      because the symbol tables are now read more strictly. The new order
      seems better in T1792_imports, and equally random in T4239.
      There are several performance test improvements.
      Test Plan: ./validate
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: alexbiehl, rwbarton, thomie
      Differential Revision:
    • Tobias Dammers's avatar
      Make layLeft and reduceDoc stricter (#7258) · 2a4c24e4
      Tobias Dammers authored
      Making the pretty-printer based assembly output stricter in
      strategically chosen locations produces a minor performance improvement
      when compiling large derived Read instance (on the order of 5-10%).
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie
      Differential Revision:
    • Ben Gamari's avatar
      typecheck: Clarify errors mentioned in #14385 · bf83435b
      Ben Gamari authored
    • Tamar Christina's avatar
      Revert "Update Win32 version for GHC 8.4." · b1ad0bb3
      Tamar Christina authored
      This reverts commit 561bdca1.
    • Tamar Christina's avatar
      Update Win32 version for GHC 8.4. · 561bdca1
      Tamar Christina authored
      Summary: Update to Win32 2.6 which is the expected version release for 8.4
      This bumps the required submodule s as well.
      Test Plan: ./validate
      Reviewers: austin, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie
      Differential Revision:
  5. 24 Oct, 2017 2 commits
  6. 23 Oct, 2017 1 commit
  7. 20 Oct, 2017 2 commits
    • Simon Peyton Jones's avatar
      Improve kick-out in the constraint solver · 3acd6164
      Simon Peyton Jones authored
      This patch was provoked by Trac #14363.  Turned out that we were
      kicking out too many constraints in TcSMonad.kickOutRewritable, and
      that mean that the work-list never became empty: infinite loop!
      That in turn made me look harder at the Main Theorem in
      Note [Extending the inert equalities].
      Main changes
      * Replace TcType.isTyVarExposed by TcType.isTyVarHead.  The
        over-agressive isTyVarExposed is what caused Trac #14363.
        See Note [K3: completeness of solving] in TcSMonad.
      * TcType.Make anyRewriteableTyVar role-aware.  In particular,
            a ~R ty
        cannot rewrite
            b ~R f a
        See Note [anyRewriteableTyVar must be role-aware].  That means
        it has to be given a role argument, which forces a little
        I think this change is fixing a bug that hasn't yet been reported.
        The actual reported bug is handled by the previous bullet.  But
        this change is definitely the Right Thing
      The main changes are in TcSMonad.kick_out_rewritable, and in TcType
      (isTyVarExposed ---> isTyVarHead).
      I did a little unforced refactoring:
       * Use the cc_eq_rel field of a CTyEqCan when it is available, rather
         than recomputing it.
       * Define eqCanRewrite :: EqRel -> EqRel -> EqRel, and use it, instead
         of duplicating its logic
    • Simon Peyton Jones's avatar
      Comments and white space · c1efc6e6
      Simon Peyton Jones authored
  8. 19 Oct, 2017 5 commits
  9. 18 Oct, 2017 3 commits
    • Gabor Greif's avatar
      Typofix in comment · aba77860
      Gabor Greif authored
    • Simon Peyton Jones's avatar
      Better solving for representational equalities · 5a66d574
      Simon Peyton Jones authored
      This patch adds a bit of extra solving power for representational
      equality constraints to fix Trac #14333
      The main changes:
      * Fix a buglet in TcType.isInsolubleOccursCheck which wrongly
        reported a definite occurs-check error for (a ~R# b a)
      * Get rid of TcSMonad.emitInsolubles.  It had an ad-hoc duplicate-removal
        piece that is better handled in interactIrred, now that insolubles
        are Irreds.
        We need a little care to keep inert_count (which does not include
        insolubles) accurate.
      * Refactor TcInteract.solveOneFromTheOther, to return a much simpler
        type.  It was just over-complicated before.
      * Make TcInteract.interactIrred look for constraints that match
        either way around, in TcInteract.findMatchingIrreds
      This wasn't hard and it cleaned up quite a bit of code.
    • Simon Peyton Jones's avatar
      Don't deeply expand insolubles · 74cd1be0
      Simon Peyton Jones authored
      Trac #13450 went bananas if we expand insoluble constraints.
      Better just to leave them un-expanded.
      I'm not sure in detail about why it goes so badly wrong; but
      regardless, the less we mess around with insoluble contraints
      the better the error messages will be.
  10. 17 Oct, 2017 2 commits
  11. 16 Oct, 2017 6 commits
    • Jessica Clarke's avatar
      RtClosureInspect: Fix inspecting Char# on 64-bit big-endian · d6c33da8
      Jessica Clarke authored
      Char# is represented with a full machine word, whereas Char's Storable
      instance uses an Int32, so we can't just treat it like a single-element
      Char array. Instead, read it as an Int and use chr to turn it into a
      Char. This fixes Trac #11262.
      Reviewers: austin, hvr, bgamari
      Reviewed By: bgamari
      Subscribers: rwbarton, thomie
      GHC Trac Issues: #11262
      Differential Revision:
    • Edward Z. Yang's avatar
      Levity polymorphic Backpack. · fd8b044e
      Edward Z. Yang authored
      This patch makes it possible to specify non * kinds of
      abstract data types in signatures, so you can have
      levity polymorphism through Backpack, without the runtime
      representation constraint!
      Signed-off-by: default avatarEdward Z. Yang <>
      Test Plan: validate
      Reviewers: andrewthad, bgamari, austin, goldfire
      Reviewed By: bgamari
      Subscribers: goldfire, rwbarton, thomie
      GHC Trac Issues: #13955
      Differential Revision:
    • Herbert Valerio Riedel's avatar
      Implement new `compareByteArrays#` primop · e3ba26f8
      Herbert Valerio Riedel authored
      The new primop
          compareByteArrays# :: ByteArray# -> Int# {- offset -}
                             -> ByteArray# -> Int# {- offset -}
                             -> Int# {- length -}
                             -> Int#
      allows to compare the subrange of the first `ByteArray#` to
      the (same-length) subrange of the second `ByteArray#` and returns a
      value less than, equal to, or greater than zero if the range is found,
      respectively, to be byte-wise lexicographically less than, to match,
      or be greater than the second range.
      Under the hood, the new primop is implemented in terms of the standard
      ISO C `memcmp(3)` function. It is currently an out-of-line primop but
      work is underway to optimise this into an inline primop for a future
      follow-up Differential (see D4091).
      This primop has applications in packages like `text`, `text-short`,
      `bytestring`, `text-containers`, `primitive`, etc.  which currently
      have to incur the overhead of an ordinary FFI call to directly or
      indirectly invoke `memcmp(3)` as well has having to deal with some
      While at it, this also improves the documentation for the existing
      `copyByteArray#` primitive which has a non-trivial type-signature
      that significantly benefits from a more explicit description of its
      Reviewed By: bgamari
      Differential Revision:
    • Herbert Valerio Riedel's avatar
      Fix panic for `ByteArray#` arguments in CApiFFI foreign imports · add85cc2
      Herbert Valerio Riedel authored
      Declarations such as
        foreign import capi  unsafe "string.h strlen"
            c_strlen_capi :: ByteArray# -> IO CSize
        foreign import capi  unsafe "string.h memset"
            c_memset_capi :: MutableByteArray# s -> CInt -> CSize -> IO ()
      would cause GHC to panic because the CApiFFI c-wrapper generator didn't
      know what C type to use for `(Mutable)ByteArray#` types (unlike the
      `ccall` codepath).
      This addresses #9274
      Reviewed By: bgamari
      Differential Revision:
    • Peter Trommler's avatar
      Fix typo · 6aa6a86b
      Peter Trommler authored
    • Peter Trommler's avatar
      Fix typo · afac6b11
      Peter Trommler authored
  12. 12 Oct, 2017 2 commits
    • Simon Peyton Jones's avatar
      Do not bind coercion variables in SpecConstr rules · fb050a33
      Simon Peyton Jones authored
      Trac #14270 showed that SpecConstr could cause nasty Lint failures
      if it generates a RULE that binds coercion varables.  See
       * Note [SpecConstr and casts], and
       * the test simplCore/should_compile/T14270.
      This doesn't feel like the final word to me, because somehow the
      specialisation "ought" to work.  So I left in a debug WARN to yell if
      the new check acutally fires.
      Meanwhile, it stops the erroneous specialisation.
      binding coercion
    • Simon Peyton Jones's avatar
      Do not quantify over deriving clauses · 82b77ec3
      Simon Peyton Jones authored
      Trac #14331 showed that in a data type decl like
         data D = D deriving (C (a :: k))
      we were quantifying D over the 'k' in the deriving clause.  Yikes.
      Easily fixed, by deleting code in RnTypes.extractDataDefnKindVars
      See the discussion on the ticket, esp comment:8.
  13. 11 Oct, 2017 1 commit