ghc.git
13 months agoLet the simplifier know that seq# forces wip/seq-res-eval
David Feuer [Tue, 5 Jun 2018 16:45:34 +0000 (12:45 -0400)] 
Let the simplifier know that seq# forces

Summary:
Add a special case in `simplAlt` to record that the result of
`seq#` is in WHNF.

Reviewers: simonmar, bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15226

Differential Revision: https://phabricator.haskell.org/D4796

13 months agoImplement QuantifiedConstraints
Simon Peyton Jones [Sat, 27 Jan 2018 14:32:34 +0000 (14:32 +0000)] 
Implement QuantifiedConstraints

We have wanted quantified constraints for ages and, as I hoped,
they proved remarkably simple to implement.   All the machinery was
already in place.

The main ticket is Trac #2893, but also relevant are
  #5927
  #8516
  #9123 (especially!  higher kinded roles)
  #14070
  #14317

The wiki page is
  https://ghc.haskell.org/trac/ghc/wiki/QuantifiedConstraints
which in turn contains a link to the GHC Proposal where the change
is specified.

Here is the relevant Note:

Note [Quantified constraints]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The -XQuantifiedConstraints extension allows type-class contexts like
this:

  data Rose f x = Rose x (f (Rose f x))

  instance (Eq a, forall b. Eq b => Eq (f b))
        => Eq (Rose f a)  where
    (Rose x1 rs1) == (Rose x2 rs2) = x1==x2 && rs1 >= rs2

Note the (forall b. Eq b => Eq (f b)) in the instance contexts.
This quantified constraint is needed to solve the
 [W] (Eq (f (Rose f x)))
constraint which arises form the (==) definition.

Here are the moving parts
  * Language extension {-# LANGUAGE QuantifiedConstraints #-}
    and add it to ghc-boot-th:GHC.LanguageExtensions.Type.Extension

  * A new form of evidence, EvDFun, that is used to discharge
    such wanted constraints

  * checkValidType gets some changes to accept forall-constraints
    only in the right places.

  * Type.PredTree gets a new constructor ForAllPred, and
    and classifyPredType analyses a PredType to decompose
    the new forall-constraints

  * Define a type TcRnTypes.QCInst, which holds a given
    quantified constraint in the inert set

  * TcSMonad.InertCans gets an extra field, inert_insts :: [QCInst],
    which holds all the Given forall-constraints.  In effect,
    such Given constraints are like local instance decls.

  * When trying to solve a class constraint, via
    TcInteract.matchInstEnv, use the InstEnv from inert_insts
    so that we include the local Given forall-constraints
    in the lookup.  (See TcSMonad.getInstEnvs.)

  * topReactionsStage calls doTopReactOther for CIrredCan and
    CTyEqCan, so they can try to react with any given
    quantified constraints (TcInteract.matchLocalInst)

  * TcCanonical.canForAll deals with solving a
    forall-constraint.  See
       Note [Solving a Wanted forall-constraint]
       Note [Solving a Wanted forall-constraint]

  * We augment the kick-out code to kick out an inert
    forall constraint if it can be rewritten by a new
    type equality; see TcSMonad.kick_out_rewritable

Some other related refactoring
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Move SCC on evidence bindings to post-desugaring, which fixed
  #14735, and is generally nicer anyway because we can use
  existing CoreSyn free-var functions.  (Quantified constraints
  made the free-vars of an ev-term a bit more complicated.)

* In LookupInstResult, replace GenInst with OneInst and NotSure,
  using the latter for multiple matches and/or one or more
  unifiers

13 months agoDocument the fact that cmm dumps won't show unreachable blocks.
klebinger.andreas@gmx.at [Mon, 4 Jun 2018 17:26:22 +0000 (13:26 -0400)] 
Document the fact that cmm dumps won't show unreachable blocks.

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4788

13 months agoFix broken test T14547.
HE, Tao [Sun, 3 Jun 2018 21:18:54 +0000 (17:18 -0400)] 
Fix broken test T14547.

Phab:D4571 lags behind HEAD for too many commits. The commit of
Phab:4571 1f88f541aad1e36d01f22f9e71dfbc247e6558e2 brought some
unintentional changes (not belong to [Phab:4571's Diff
16314](https://phabricator.haskell.org/differential/diff/16314/)) into
ghc-head, breaking T14557.

Let's fix that.

Test Plan: make test TEST="T14547"

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15222

Differential Revision: https://phabricator.haskell.org/D4778

13 months agoBump stm and haskeline submodules
Ben Gamari [Sun, 3 Jun 2018 21:18:12 +0000 (17:18 -0400)] 
Bump stm and haskeline submodules

13 months agoRefactor SetLevels.abstractVars
Simon Peyton Jones [Fri, 1 Jun 2018 15:42:11 +0000 (16:42 +0100)] 
Refactor SetLevels.abstractVars

This patch is pure refactoring: using utility functions
rather than special-purpose code, especially for closeOverKinds

13 months agoExpand type synonyms when Linting a forall
Simon Peyton Jones [Fri, 1 Jun 2018 15:36:57 +0000 (16:36 +0100)] 
Expand type synonyms when Linting a forall

Trac #14939 showed a type like
   type Alg cls ob = ob
   f :: forall (cls :: * -> Constraint) (b :: Alg cls *). b

where the kind of the forall looks like (Alg cls *), with a
free cls. This tripped up Core Lint.

I fixed this by making Core Lint a bit more forgiving, expanding
type synonyms if necessary.

I'm worried that this might not be the whole story; notably
typeKind looks suspect.  But it certainly fixes this problem.

13 months agoDo a late CSE pass
Simon Peyton Jones [Fri, 1 Jun 2018 11:53:41 +0000 (12:53 +0100)] 
Do a late CSE pass

When investigating something else I found that a condition
was being re-evaluated in wheel-seive1.  Why, when CSE should
find it?  Because the opportunity only showed up after
LiberateCase

This patch adds a late CSE pass. Rather than give it an extra
flag I do it when (cse && (spec_constr || liberate_case)), so
roughly speaking it happense with -O2.

In any case, CSE is very cheap.

Nofib results are minor but in the right direction:

        Program           Size    Allocs   Runtime   Elapsed  TotalMem
--------------------------------------------------------------------------------
           anna          -0.1%     -0.0%     0.163     0.163      0.0%
          eliza          -0.1%     -0.4%     0.001     0.001      0.0%
           fft2          -0.1%      0.0%     0.087     0.087      0.0%
           mate          -0.0%     -1.3%     -0.8%     -0.8%      0.0%
      paraffins          -0.0%     -0.1%     +0.9%     +0.9%      0.0%
            pic          -0.0%     -0.1%     0.009     0.009      0.0%
   wheel-sieve1          -0.2%     -0.0%     -0.1%     -0.1%      0.0%
--------------------------------------------------------------------------------
            Min          -0.6%     -1.3%     -2.4%     -2.4%      0.0%
            Max          +0.0%     +0.0%     +3.8%     +3.8%    +23.8%
 Geometric Mean          -0.0%     -0.0%     +0.2%     +0.2%     +0.2%

13 months agoProvide `getWithUserData` and `putWithUserData`
Matthew Pickering [Mon, 4 Jun 2018 02:05:46 +0000 (02:05 +0000)] 
Provide `getWithUserData` and `putWithUserData`

Summary:
This makes it possible to serialise Names and FastStrings in user
programs, for example, when writing a source plugin.

When writing my first source plugin, I wanted to serialise names but it
wasn't possible easily without exporting additional constructors. This
interface is sufficient and abstracts nicely over the symbol table and
dictionary.

Reviewers: alpmestan, bgamari

Reviewed By: alpmestan

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15223

Differential Revision: https://phabricator.haskell.org/D4782

13 months agotestsuite: Really mark T14547 as broken
Ben Gamari [Sun, 3 Jun 2018 20:49:45 +0000 (16:49 -0400)] 
testsuite: Really mark T14547 as broken

13 months agotestsuite: Mark T14547 as broken
Ben Gamari [Sun, 3 Jun 2018 14:24:55 +0000 (10:24 -0400)] 
testsuite: Mark T14547 as broken

13 months agoAdd tests for #8128 and #8740
Ryan Scott [Sun, 3 Jun 2018 11:47:51 +0000 (07:47 -0400)] 
Add tests for #8128 and #8740

Commit 08073e16cf672d8009309e4e55d4566af1ecaff4 (#11066) ended up
fixing these, fortunately enough.

13 months agoFix typo in OverloadedLabels docs
Joachim Breitner [Sun, 3 Jun 2018 08:09:15 +0000 (10:09 +0200)] 
Fix typo in OverloadedLabels docs

as helpfully reported by elpinal (#15217).

13 months agoImprove exhaustiveness checking for literal values and patterns, fix #14546
HE, Tao [Sun, 3 Jun 2018 04:38:30 +0000 (00:38 -0400)] 
Improve exhaustiveness checking for literal values and patterns, fix #14546

Currently, we parse both the **integral literal** value and the patterns
as `OverLit HsIntegral`.  For example:

```
  case 0::Int of
      0 -> putStrLn "A"
      1 -> putStrLn "B"
      _ -> putStrLn "C"
```

When checking the exhaustiveness of pattern matching, we translate the
`0` in value position as `PmOLit`, but translate the `0` and `1` in
pattern position as `PmSLit`. The inconsistency leads to the failure of
`eqPmLit` to detect the equality and report warning of "Pattern match is
redundant" on pattern `0`, as reported in #14546. In this patch we
remove the specialization of `OverLit` patterns, and keep the overloaded
number literal in pattern as it is to maintain the consistency.  Now we
can capture the exhaustiveness of pattern `0` and the redundancy of
pattern `1` and `_`.

For **string literals**, we parse the string literals as `HsString`.
When  `OverloadedStrings` is enabled, it further be turned as `HsOverLit
HsIsString`, whether it's type is `String` or not. For example:

```
  case "foo" of
      "foo" -> putStrLn "A"
      "bar" -> putStrLn "B"
      "baz" -> putStrLn "C"
```

Previously, the overloaded string values are translated to `PmOLit` and
the non-overloaded string values are translated to `PmSLit`. However the
string patterns, both overloaded and non-overloaded, are translated to
list of characters. The inconsistency leads to wrong warnings about
redundant and non-exhaustive pattern matching warnings, as reported
in #14546.

In order to catch the redundant pattern in following case:

```
  case "foo" of
      ('f':_) -> putStrLn "A"
      "bar" -> putStrLn "B"
```

In this patch, we translate non-overloaded string literals, both in
value position and pattern position, as list of characters. For
overloaded string literals, we only translate it to list of characters
only when it's type is `stringTy`, since we know nothing about the
`toString` methods.  But we know that if two overloaded strings are
syntax equal, then they are equal. Then if it's type is not `stringTy`,
we just translate it to `PmOLit`. We can still capture the
exhaustiveness of pattern `"foo"` and the redundancy of pattern `"bar"`
and `"baz"` in the following code:

```
{-# LANGUAGE OverloadedStrings #-}
main = do
  case "foo" of
      "foo" -> putStrLn "A"
      "bar" -> putStrLn "B"
      "baz" -> putStrLn "C"
```

Test Plan: make test TEST="T14546"

Reviewers: bgamari, simonpj

Reviewed By: bgamari, simonpj

Subscribers: simonpj, thomie, carter

GHC Trac Issues: #14546

Differential Revision: https://phabricator.haskell.org/D4571

13 months agoAllow aligning of cmm procs at specific boundry
klebinger.andreas@gmx.at [Sun, 3 Jun 2018 04:37:59 +0000 (00:37 -0400)] 
Allow aligning of cmm procs at specific boundry

Allows to align CmmProcs at the given boundries.

It makes performance usually worse but can be helpful
to limit the effect of a unrelated function B becoming
faster/slower after changing function A.

Test Plan: ci, using it.

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15148

Differential Revision: https://phabricator.haskell.org/D4706

13 months agotcExtendTyVarEnv2 changed to tcExtendNameTyVarEnv
Alanas Plascinskas [Sun, 3 Jun 2018 03:23:48 +0000 (23:23 -0400)] 
tcExtendTyVarEnv2 changed to tcExtendNameTyVarEnv

Reviewers: mpickering, goldfire, bgamari

Reviewed By: mpickering

Subscribers: goldfire, rwbarton, thomie, carter

GHC Trac Issues: #15017

Differential Revision: https://phabricator.haskell.org/D4732

13 months agoTurn "inaccessible code" error into a warning
Tobias Dammers [Sun, 3 Jun 2018 03:23:22 +0000 (23:23 -0400)] 
Turn "inaccessible code" error into a warning

With GADTs, it is possible to write programs such that the type
constraints make some code branches inaccessible.

Take, for example, the following program ::

    {-# LANGUAGE GADTs #-}

    data Foo a where
     Foo1 :: Foo Char
     Foo2 :: Foo Int

    data TyEquality a b where
            Refl :: TyEquality a a

    checkTEQ :: Foo t -> Foo u -> Maybe (TyEquality t u)
    checkTEQ x y = error "unimportant"

    step2 :: Bool
    step2 = case checkTEQ Foo1 Foo2 of
             Just Refl -> True -- Inaccessible code
             Nothing -> False

Clearly, the `Just Refl` case cannot ever be reached, because the `Foo1`
and `Foo2` constructors say `t ~ Char` and `u ~ Int`, while the `Refl`
constructor essentially mandates `t ~ u`, and thus `Char ~ Int`.

Previously, GHC would reject such programs entirely; however, in
practice this is too harsh. Accepting such code does little harm, since
attempting to use the "impossible" code will still produce errors down
the chain, while rejecting it means we cannot legally write or generate
such code at all.

Hence, we turn the error into a warning, and provide
`-Winaccessible-code` to control GHC's behavior upon encountering this
situation.

Test Plan: ./validate

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #11066

Differential Revision: https://phabricator.haskell.org/D4744

13 months agoFix a bad interaction between GADTs and COMPLETE sets
Ryan Scott [Sun, 3 Jun 2018 03:22:54 +0000 (23:22 -0400)] 
Fix a bad interaction between GADTs and COMPLETE sets

As observed in #14059 (starting at comment 5), the error
messages surrounding a program involving GADTs and a `COMPLETE` set
became worse between 8.2 and 8.4. The culprit was a new validity
check in 8.4 which filters out `COMPLETE` set candidates if a return
type of any conlike in the set doesn't match the type of the
scrutinee. However, this check was too conservative, since it removed
perfectly valid `COMPLETE` sets that contained GADT constructors,
which quite often have return types that don't match the type of a
scrutinee.

To fix this, I adopted the most straightforward possible solution of
only performing this validity check on //pattern synonym//
constructors, not //data// constructors.

Note that this does not fix #14059 entirely, but instead simply fixes
a particular buglet that was discovered in that ticket.

Test Plan: make test TEST=T14059

Reviewers: bgamari, mpickering

Reviewed By: mpickering

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #14059

Differential Revision: https://phabricator.haskell.org/D4752

13 months agoRemove ~# from surface syntax
David Feuer [Sun, 3 Jun 2018 01:24:04 +0000 (21:24 -0400)] 
Remove ~# from surface syntax

For some reason, it seems that the `ConstraintKinds` commit
introduced `~#` into Haskell syntax, in a pretty broken manner.
Unless and until we have an actual story for unboxed equality,
it doesn't make sense to expose it. Moreover, the way it was
donet was wrong enough and small enough that it will probably be
easier to start over if we do that. Yank it out.

Reviewers: bgamari, RyanGlScott

Reviewed By: RyanGlScott

Subscribers: RyanGlScott, rwbarton, thomie, mpickering, carter

GHC Trac Issues: #15209

Differential Revision: https://phabricator.haskell.org/D4763

13 months agoHandle abi-depends correctly in ghc-pkg
Tobias Dammers [Sun, 3 Jun 2018 01:23:21 +0000 (21:23 -0400)] 
Handle abi-depends correctly in ghc-pkg

When inferring the correct abi-depends, we now look at all the package
databases in the stack, up to and including the current one, because
these are the ones that the current package can legally depend on. While
doing so, we will issue warnings:

- In verbose mode, we warn about every package that declares
  abi-depends:, whether we actually end up overriding them with the
  inferred ones or not ("possibly broken abi-depends").

- Otherwise, we only warn about packages whose declared abi-depends
  does not match what we inferred ("definitely broken abi-depends").

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #14381

Differential Revision: https://phabricator.haskell.org/D4729

13 months agorts: Query system rlimit for maximum address-space size
Ben Gamari [Sun, 3 Jun 2018 01:22:52 +0000 (21:22 -0400)] 
rts: Query system rlimit for maximum address-space size

When we attempt to reserve the heap, we query the system's rlimit to
establish the starting point for our search over sizes.

Test Plan: Validate

Reviewers: erikd, simonmar

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #14492

Differential Revision: https://phabricator.haskell.org/D4754

13 months agoFix #15214 by listing (~) in isBuiltInOcc_maybe
Ryan Scott [Sun, 3 Jun 2018 01:18:43 +0000 (21:18 -0400)] 
Fix #15214 by listing (~) in isBuiltInOcc_maybe

This changes an obscure error (which mistakenly mentions
Template Haskell) to one that makes more sense.

Test Plan: make test TEST=T15214

Reviewers: bgamari, mpickering

Reviewed By: bgamari, mpickering

Subscribers: mpickering, rwbarton, thomie, carter

GHC Trac Issues: #15214

Differential Revision: https://phabricator.haskell.org/D4768

13 months agoCheck for singletons when creating Bag/OrdList from a list.
klebinger.andreas@gmx.at [Sun, 3 Jun 2018 01:18:19 +0000 (21:18 -0400)] 
Check for singletons when creating Bag/OrdList from a list.

This gives us `One x` instead of `Many (x : [])` reducing overhead.
For compiling spectral/simple with -O0 difference was ~ -0.05%
allocations.

The only drawback is that something like toOL (x:panic "") will now
panic.  But that seems like a reasonable tradeoff.

Test Plan: ci, looking at +RTS -s

Reviewers: bgamari, jmct

Reviewed By: bgamari

Subscribers: jmct, rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4770

13 months agoFix #13777 by improving the underdetermined CUSK error message
Ryan Scott [Sun, 3 Jun 2018 01:16:40 +0000 (21:16 -0400)] 
Fix #13777 by improving the underdetermined CUSK error message

The error message that GHC emits from underdetermined CUSKs
is rather poor, since:

1. It may print an empty list of user-written variables if there
    are none in the declaration.
2. It may not mention any `forall`-bound, underdetermined
    variables in the result kind.

To resolve these issues, this patch:

1. Doesn't bother printing a herald about user-written
    variables if there are none.
2. Prints the result kind to advertise any
    underdetermination it may exhibit.

Test Plan: make test TEST=T13777

Reviewers: goldfire, bgamari

Reviewed By: goldfire

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #13777

Differential Revision: https://phabricator.haskell.org/D4771

13 months agoExtended the plugin system to run plugins on more representations
Boldizsar Nemeth [Sat, 2 Jun 2018 23:08:40 +0000 (19:08 -0400)] 
Extended the plugin system to run plugins on more representations

Extend GHC plugins to access parsed, type checked representation,
interfaces that are loaded. And splices that are evaluated. The goal is
to enable development tools to access the GHC representation in the
pre-existing build environment.

See the full proposal here:
https://ghc.haskell.org/trac/ghc/wiki/ExtendedPluginsProposal

Reviewers: goldfire, bgamari, ezyang, angerman, mpickering

Reviewed By: mpickering

Subscribers: ezyang, angerman, mpickering, ulysses4ever, rwbarton, thomie, carter

GHC Trac Issues: #14709

Differential Revision: https://phabricator.haskell.org/D4342

13 months agoBump version of stm submodule back to 2.4
Ben Gamari [Sun, 3 Jun 2018 01:07:43 +0000 (21:07 -0400)] 
Bump version of stm submodule back to 2.4

Haskeline doesn't have its upper bound lifted yet.

13 months agotestsuite: Don't assume location of bash
Ben Gamari [Sat, 2 Jun 2018 22:27:16 +0000 (18:27 -0400)] 
testsuite: Don't assume location of bash

13 months agorts: Rip out support for STM invariants
Ben Gamari [Sat, 2 Jun 2018 15:48:39 +0000 (11:48 -0400)] 
rts: Rip out support for STM invariants

This feature has some very serious correctness issues (#14310),
introduces a great deal of complexity, and hasn't seen wide usage.
Consequently we are removing it, as proposed in Proposal #77 [1]. This
is heavily based on a patch from fryguybob.

Updates stm submodule.

[1] https://github.com/ghc-proposals/ghc-proposals/pull/77

Test Plan: Validate

Reviewers: erikd, simonmar, hvr

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #14310

Differential Revision: https://phabricator.haskell.org/D4760

13 months agoC codegen: print details of pprStatics panics
Sergei Trofimovich [Sat, 2 Jun 2018 21:08:06 +0000 (21:08 +0000)] 
C codegen: print details of pprStatics panics

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
13 months agovectorise: Put it out of its misery
Ben Gamari [Sat, 2 Jun 2018 15:56:58 +0000 (11:56 -0400)] 
vectorise: Put it out of its misery

Poor DPH and its vectoriser have long been languishing; sadly it seems there is
little chance that the effort will be rekindled. Every few years we discuss
what to do with this mass of code and at least once we have agreed that it
should be archived on a branch and removed from `master`. Here we do just that,
eliminating heaps of dead code in the process.

Here we drop the ParallelArrays extension, the vectoriser, and the `vector` and
`primitive` submodules.

Test Plan: Validate

Reviewers: simonpj, simonmar, hvr, goldfire, alanz

Reviewed By: simonmar

Subscribers: goldfire, rwbarton, thomie, mpickering, carter

Differential Revision: https://phabricator.haskell.org/D4761

13 months agoAdd llvm-target for powerpc64le-unknown-linux
Alan Mock [Sat, 2 Jun 2018 15:56:41 +0000 (11:56 -0400)] 
Add llvm-target for powerpc64le-unknown-linux

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15212

Differential Revision: https://phabricator.haskell.org/D4765

13 months agoConservatively estimate levity in worker/wrapper
Ben Gamari [Thu, 31 May 2018 11:49:55 +0000 (07:49 -0400)] 
Conservatively estimate levity in worker/wrapper

The worker/wrapper transform needs to determine the levity of the result to
determine whether it needs to introduce a lambda to preserve laziness of the
result. For this is previously used isUnliftedType. However, this may fail in
the presence of levity polymorphism.

We now instead use isLiftedType_maybe, assuming that a lambda is needed if the
levity of the result cannot be determined.

Fixes #15186.

Test Plan: make test=T15186

Reviewers: simonpj, goldfire, tdammers

Reviewed By: simonpj

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15186

Differential Revision: https://phabricator.haskell.org/D4755

13 months agotestsuite: Add test for #15186
Ben Gamari [Thu, 31 May 2018 11:48:53 +0000 (07:48 -0400)] 
testsuite: Add test for #15186

Summary: Currently broken.

Test Plan: Validate

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15186

Differential Revision: https://phabricator.haskell.org/D4757

13 months agoOptimizations for CmmBlockElim.
klebinger.andreas@gmx.at [Thu, 31 May 2018 00:49:18 +0000 (20:49 -0400)] 
Optimizations for CmmBlockElim.

* Use toBlockList instead of revPostorder.

    Block elimination works on a given Cmm graph by:
     * Getting a list of blocks.
     * Looking for duplicates in these blocks.
     * Removing all but one instance of duplicates.

    There are two (reasonable) ways to get the list of blocks.
     * The fast way: `toBlockList`
       This just flattens the underlying map into a list.
     * The convenient way: `revPostorder`
       Start at the entry label, scan for reachable blocks and return
       only these. This has the advantage of removing all dead code.

    If there is dead code the later is better. Work done on unreachable
    blocks is clearly wasted work. However by the point we run the
    common block elimination pass the input graph already had all dead code
    removed. This is done during control flow optimization in
    CmmContFlowOpt which is our first Cmm pass.

    This means common block elimination is free to use toBlockList
    because revPostorder would return the same blocks. (Although in
    a different order).

* Change the triemap used for grouping by a label list
  from `(TM.ListMap UniqDFM)` to `ListMap (GenMap LabelMap)`.

    * Using GenMap offers leaf compression. Which is a trie
      optimization described by the Note [Compressed TrieMap] in
      CoreSyn/TrieMap.hs

    * Using LabelMap removes the overhead associated with UniqDFM.

  This is deterministic since if we have the same input keys the same
  LabelMap will be constructed.

Test Plan: ci, profiling output

Reviewers: bgamari, simonmar

Reviewed By: bgamari

Subscribers: dfeuer, thomie, carter

GHC Trac Issues: #15103

Differential Revision: https://phabricator.haskell.org/D4597

13 months agoUNREG: mark SRT as writable in generated C code
Sergei Trofimovich [Fri, 1 Jun 2018 08:35:23 +0000 (08:35 +0000)] 
UNREG: mark SRT as writable in generated C code

Noticed section mismatch on UNREG build failure:

```
  HC [stage 1] libraries/integer-gmp/dist-install/build/GHC/Integer/Type.o

     error: conflicting types for 'ufu0_srt'
     static StgWord ufu0_srt[]__attribute__((aligned(8)))= {
                    ^~~~~~~~

     note: previous declaration of 'ufu0_srt' was here
     IRO_(ufu0_srt);
          ^~~~~~~~
```

`IRO_` is a 'const' qualifier.

The error is a leftover from commit 838b69032566ce6ab3918d70e8d5e098d0bcee02
"Merge FUN_STATIC closure with its SRT" where part of SRT was moved
into closure itself and made SRTs writable.

This change puts all SRTs into writable section.

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Reviewers: simonmar, bgamari

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4731

13 months agoCleanups [ci skip]
Gabor Greif [Fri, 1 Jun 2018 11:16:24 +0000 (13:16 +0200)] 
Cleanups [ci skip]

13 months agoChange jump targets in JMP_TBL from blocks to X86.JumpDest.
Andreas Klebinger [Thu, 31 May 2018 00:40:49 +0000 (20:40 -0400)] 
Change jump targets in JMP_TBL from blocks to X86.JumpDest.

Jump tables always point to blocks when we first generate them.  However
there are rare situations where we can shortcut one of these blocks to a
static address during the asm shortcutting pass.

While we already updated the data section accordingly this patch also
extends this to the references stored in JMP_TBL.

Test Plan: ci

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: thomie, carter

GHC Trac Issues: #15104

Differential Revision: https://phabricator.haskell.org/D4595

13 months agodead strip dylibs on macOS
Moritz Angermann [Thu, 31 May 2018 00:40:11 +0000 (20:40 -0400)] 
dead strip dylibs on macOS

When linking dynamic libraries or executables, we compute the full
transitive closure over the dependencies, and instruct the linker
to link all dependencies.  With deep dependency trees the number
of transitive dependencies can grow quickly.

macOS since the Sierra release has an upper limit on the load
command sizes the linker parses when loading dynamic lirbaries.
As such it is mandatory to keep the number of load commands (and
their size) small on recent macOS releases.

An approach that would just link direct dependencies as specified
by the -package-id flag is insufficient, because GHC can inline
across packages and the library or executable being linked could
refer to symbols deep in the dependency tree.

If we just recursively linked librarys and re-exported their
symbols, this increases the number of symbols in libraries with
many dependencies and ultimately puts excessive strain on the
linker to the point where linking takes a lot longer than even
the compilation of the modules.

We can however build a list of symbols from the obejcts we want
to link, and try to compute the libraries we need to link that
contain those symbols from the transitive dependency closure.
Luckily, we don't need to write this ourselves, but can use
the ld64 `-dead_strip_dylibs` linker flag on macOS to achive
the same result.  This will link only the libraries that are
actually referenced, which is usually a small subset of the
full transitive dependency closure.  As such we should stay
within the load command size limit for almost all but pathological
cases.

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: lelf, rwbarton, thomie, carter

GHC Trac Issues: #14444

Differential Revision: https://phabricator.haskell.org/D4714

13 months agobase/TimerManager: Clamp timer expiration time to maxBound
Ben Gamari [Thu, 31 May 2018 00:39:12 +0000 (20:39 -0400)] 
base/TimerManager: Clamp timer expiration time to maxBound

Previously we would allow the expiration time to overflow, which in
practice meant that `threadDelay maxBound` we return far earlier than
circa 2500 CE. For now we fix this by simply clamping to maxBound.

Fixes #15158.

Test Plan: Validate, run T8089

Reviewers: simonmar, hvr

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15158

Differential Revision: https://phabricator.haskell.org/D4719

13 months agoMake HsDocString a newtype of ByteString
Simon Jakobi [Thu, 31 May 2018 00:38:18 +0000 (20:38 -0400)] 
Make HsDocString a newtype of ByteString

Docstrings don't profit from FastString's interning, so we switch to
a different type that doesn't incur this overhead.

Updates the haddock submodule.

Reviewers: alexbiehl, bgamari

Reviewed By: alexbiehl, bgamari

Subscribers: rwbarton, thomie, mpickering, carter

GHC Trac Issues: #15157

Differential Revision: https://phabricator.haskell.org/D4743

13 months agousers-guide: Fix various issues in debugging flags section
Ben Gamari [Thu, 31 May 2018 00:38:06 +0000 (20:38 -0400)] 
users-guide: Fix various issues in debugging flags section

Reviewers: ggreif

Reviewed By: ggreif

Subscribers: rwbarton, thomie, carter, ggreif

Differential Revision: https://phabricator.haskell.org/D4750

13 months agoconfigure: Make sphinx-build version test work on recent versions
Jens Petersen [Mon, 28 May 2018 03:31:49 +0000 (12:31 +0900)] 
configure: Make sphinx-build version test work on recent versions

On Fedora: `/usr/libexec/sphinx-build --version` outputs `sphinx-build
1.7.2`.  In bindir we actually have sphinx-build-2 and sphinx-build-3
(python2 and python3 versions), which output `sphinx-build-2 1.7.2` and
`sphinx-build-3 1.7.2` respectively.  Dunno what version others are
using but at least this change should works for most versions I suppose.

13 months agobase: Improve documentation of indexArray#
Andrew Martin [Fri, 20 Apr 2018 16:58:54 +0000 (12:58 -0400)] 
base: Improve documentation of indexArray#

13 months agotestsuite: Make T3234 more robust
roland [Sat, 19 May 2018 16:21:42 +0000 (18:21 +0200)] 
testsuite: Make T3234 more robust

Just look for the rule firing that we want to see instead of matching on
the entire dump.

Fixes #15088.

13 months agoSplicePat's should not trip -Wunused-pattern-binds
Alec Theriault [Tue, 8 May 2018 19:24:26 +0000 (12:24 -0700)] 
SplicePat's should not trip -Wunused-pattern-binds

The warning does not consider the fact that the splice pattern may
very well end up binding variables.

13 months agorts/posix: Use less aggressive backoff schedule for heap reservation sizing
Ben Gamari [Wed, 30 May 2018 16:30:52 +0000 (12:30 -0400)] 
rts/posix: Use less aggressive backoff schedule for heap reservation sizing

When we allocate the heap on POSIX platforms we generally just ask for a
1TB chunk of address space and call it a day. However, if the user has
set a ulimit then this request will fail. In this case we would
previously try successively smaller allocation requests, reducing the
request size by a factor of two each time.

However, this means that GHC will significantly allocate a significantly
smaller heap than the available physical memory size in some
circumstances.  Imagine, for instance, a machine with 512 GB of physical
memory but a ulimit of 511 GB: we would be limited to a 256 GB heap.

We now use a less aggressive back-off policy, reducing by one-eighth the
last allocation size each try.

Thanks to luispedro for the suggested approach.

Test Plan: Validate

Reviewers: simonmar, erikd

Subscribers: rwbarton, thomie

GHC Trac Issues: #14492

Differential Revision: https://phabricator.haskell.org/D4215

13 months agotestsuite: Fix hashbangs
Ben Gamari [Wed, 30 May 2018 19:19:30 +0000 (15:19 -0400)] 
testsuite: Fix hashbangs

13 months agoghc-heap: Add dependency from GHC.Exts.Heap.Closures to InfoTableProf
Ben Gamari [Wed, 30 May 2018 15:20:58 +0000 (11:20 -0400)] 
ghc-heap: Add dependency from GHC.Exts.Heap.Closures to InfoTableProf

`ghc -M` currently doesn't properly account for ways when generating
dependencies (#15197). This import ensures correct build-ordering between this
module and GHC.Exts.Heap.InfoTableProf. Otherwise the profiled build may fail as
described in #15197.

13 months agoImplement "An API for deciding whether plugins should cause recompilation"
Matthew Pickering [Sun, 27 May 2018 15:57:27 +0000 (11:57 -0400)] 
Implement "An API for deciding whether plugins should cause recompilation"

This patch implements the API proposed as pull request #108 for plugin
authors to influence the recompilation checker.

It adds a new field to a plugin which computes a `FingerPrint`. This is
recorded in interface files and if it changes then we recompile the
module. There are also helper functions such as `purePlugin` and
`impurePlugin` for constructing plugins which have simple recompilation
semantics but in general, an author can compute a hash as they wish.

Fixes #12567 and #7414

https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/002
2-plugin-recompilation.rst

Reviewers: bgamari, ggreif

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #7414, #12567

Differential Revision: https://phabricator.haskell.org/D4366

13 months agoImproved Valid Hole Fits
Matthías Páll Gissurarson [Sun, 27 May 2018 15:50:49 +0000 (11:50 -0400)] 
Improved Valid Hole Fits

I've changed the name from `Valid substitutions` to `Valid hole fits`,
since "substitution" already has a well defined meaning within the
theory. As part of this change, the flags and output is reanamed, with
substitution turning into hole-fit in most cases. "hole fit" was already
used internally in the code, it's clear and shouldn't cause any
confusion.

In this update, I've also reworked how we manage side-effects in the
hole we are considering.

This allows us to consider local bindings such as where clauses and
arguments to functions, suggesting e.g. `a` for `head (x:xs) where head
:: [a] -> a`.

It also allows us to find suggestions such as `maximum` for holes of
type `Ord a => a -> [a]`, and `max` when looking for a match for the
hole in `g = foldl1 _`, where `g :: Ord a => [a] -> a`.

We also show much improved output for refinement hole fits, and
fixes #14990. We now show the correct type of the function, but we also
now show what the arguments to the function should be e.g. `foldl1 (_ ::
Integer -> Integer -> Integer)` when looking for `[Integer] -> Integer`.

I've moved the bulk of the code from `TcErrors.hs` to a new file,
`TcHoleErrors.hs`, since it was getting too big to not live on it's own.

This addresses the considerations raised in #14969, and takes proper
care to set the `tcLevel` of the variables to the right level before
passing it to the simplifier.

We now also zonk the suggestions properly, which improves the output of
the refinement hole fits considerably.

This also filters out suggestions from the `GHC.Err` module, since even
though `error` and `undefined` are indeed valid hole fits, they are
"trivial", and almost never useful to the user.

We now find the hole fits using the proper manner, namely by solving
nested implications. This entails that the givens are passed along using
the implications the hole was nested in, which in turn should mean that
there will be fewer weird bugs in the typed holes.

I've also added a new sorting method (as suggested by SPJ) and sort by
the size of the types needed to turn the hole fits into the type of the
hole. This gives a reasonable approximation to relevance, and is much
faster than the subsumption check. I've also added a flag to toggle
whether to use this new sorting algorithm (as is done by default) or the
subsumption algorithm. This fixes #14969

I've also added documentation for these new flags and update the
documentation according to the new output.

Reviewers: bgamari, goldfire

Reviewed By: bgamari

Subscribers: simonpj, rwbarton, thomie, carter

GHC Trac Issues: #14969, #14990, #10946

Differential Revision: https://phabricator.haskell.org/D4444

13 months agousers-guide: Point out GNTD may require additional extensions
Ben Gamari [Sun, 27 May 2018 15:50:21 +0000 (11:50 -0400)] 
users-guide: Point out GNTD may require additional extensions

As noted in #15073, GeneralizedNewtypeDeriving may produce code that
uses extensions that do not directly appear in the code written by the
user.  Make this clear in the users guide.

[skip ci]

Test Plan: Read it

Reviewers: RyanGlScott

Reviewed By: RyanGlScott

Subscribers: fosskers, rwbarton, thomie, carter

GHC Trac Issues: #15073

Differential Revision: https://phabricator.haskell.org/D4701

13 months agoExtract hard-coded LLVM opt flags into a file
Kavon Farvardin [Sun, 27 May 2018 15:49:25 +0000 (11:49 -0400)] 
Extract hard-coded LLVM opt flags into a file

To resolve ticket #11295, I think it makes sense to stop hard-coding
the pass sequences used by GHC when compiling with LLVM into the
compiler
itself.

This patchset introduces a companion to the existing `llvm-targets` file
called `llvm-passes`. The passes file is a simple association list that
holds the default LLVM `opt` pass sequence used by GHC. This allows end
users to easily save their favorite optimization flags when compiling
with LLVM.

The main benefit for ticket #11295 is that when adding a custom pass
sequence, it tends to be an extremely long string that would be
unsightly in the code.

This is essentially part 1 of 2 for ticket #11295.

Test Plan: ./validate

Reviewers: bgamari, angerman

Reviewed By: angerman

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4695

13 months agoDefine MCoercion type
ningning [Sun, 27 May 2018 15:49:06 +0000 (11:49 -0400)] 
Define MCoercion type

An attempt on #14975:
During compilation, reflexive casts is discarded for computation.
Currently in some places we use Maybe coercion as inputs. So if a cast
is reflexive it is denoted as Nothing, otherwise Just coercion.

This patch defines the type

data MCoercion = MRefl | MCo Coercion

which is isomorphic to Maybe Coercion but useful in a number of places,
and super-helpful documentation.

Test Plan: validate

Reviewers: bgamari, goldfire, simonpj

Reviewed By: goldfire

Subscribers: mpickering, rwbarton, thomie, carter

GHC Trac Issues: #14975

Differential Revision: https://phabricator.haskell.org/D4699

13 months agorts: Don't madvise if mmap failed
Ben Gamari [Sun, 27 May 2018 15:48:53 +0000 (11:48 -0400)] 
rts: Don't madvise if mmap failed

On 32-bit Linux `outofmem` did not fail with the expected out-of-memory
error message, instead failing with,

    outofmem: internal error: getMBlock: mmap: Invalid argument

This happened because, `my_mmap` would attempt to `madvise` even if the
`mmap` call failed. So while `mmap` returns `ENOMEM` we nevertheless try
to `madvise`, which clobbers `errno`, giving us the unexpected `EINVAL`
error. Consequently we don't detect this to be an out-of-memory error.

This should fix #15060.

Test Plan: `make test TEST=outofmem` on i386

Reviewers: simonmar, erikd

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15060

Differential Revision: https://phabricator.haskell.org/D4704

13 months agoPut the `ev_binds` of main function inside `runMainIO`
HE, Tao [Sun, 27 May 2018 15:48:20 +0000 (11:48 -0400)] 
Put the `ev_binds` of main function inside `runMainIO`

This ensures that the deferred type error can be emitted correctly.

For `main` function in `Main` module, we have

    :Main.main = GHC.TopHandler.runMainIO main

When the type of `main` is not `IO t` and the
`-fdefer-type-errors` is enabled, the `ev_binds`
of `main` function will contain deferred type
errors.

Previously, the `ev_binds` are bound to `runMainIO main`,
rather than `main`, the type error exception at runtime
cannot be handled properly. See Trac #13838.

This patch fix that.

Test Plan: make test TEST="T13838"

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #13838

Differential Revision: https://phabricator.haskell.org/D4708

13 months agoT14732 now passes with the profasm way
Alp Mestanogullari [Sun, 27 May 2018 15:48:01 +0000 (11:48 -0400)] 
T14732 now passes with the profasm way

Simon PJ recently fixed the problem behind this failure
so we can now expect this test to pass in all ways again.

The fixes got introduced in the following commits:
  86bba7d519fb6050f78b7e3bac2b3f54273fd70e
  d191db48c43469ee1818887715bcbc5c0eb1d91f

Test Plan: T14732 (profasm way)

Reviewers: bgamari, RyanGlScott, simonpj

Reviewed By: RyanGlScott, simonpj

Subscribers: simonpj, RyanGlScott, rwbarton, thomie, carter

GHC Trac Issues: #15163

Differential Revision: https://phabricator.haskell.org/D4725

13 months agoDelete duplicate definition of fingerprintByteString
Simon Jakobi [Sat, 26 May 2018 23:19:52 +0000 (01:19 +0200)] 
Delete duplicate definition of fingerprintByteString

13 months agoRemove incorrect comment
Simon Jakobi [Sat, 26 May 2018 23:03:58 +0000 (01:03 +0200)] 
Remove incorrect comment

Moving fingerprintByteString to GHC.Fingerprint would require
adding a dependency on bytestring to base.

13 months agoImprove the documentation of lexically scoped type variables
AntC [Sat, 19 May 2018 07:23:39 +0000 (19:23 +1200)] 
Improve the documentation of lexically scoped type variables

Section 10.16 in the Users Guide. Also reviewed mentions/links from
other sections: none need revision.

Fixes #15146.

13 months agoUpdate repository sub-dir for ghc-heap in ghc-heap.cabal.in
Alp Mestanogullari [Sun, 27 May 2018 15:13:37 +0000 (11:13 -0400)] 
Update repository sub-dir for ghc-heap in ghc-heap.cabal.in

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4735

13 months agoFix validate for GHCi without TABLES_NEXT_TO_CODE
Peter Trommler [Sun, 27 May 2018 15:11:37 +0000 (11:11 -0400)] 
Fix validate for GHCi without TABLES_NEXT_TO_CODE

Suppress warning about unused match.

Fixes #15187

Reviewers: bgamari, simonmar, erikd, hvr

Reviewed By: bgamari, simonmar

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4741

13 months agollvm-targets: Add versioned ARM targets
Guillaume GARDET [Fri, 18 May 2018 06:56:28 +0000 (08:56 +0200)] 
llvm-targets: Add versioned ARM targets

Namely armv6l-unknown-linux-gnueabihf and
armv7l-unknown-linux-gnueabihf.

13 months agoMove printMutableList to Printer.c next to other printers
Ömer Sinan Ağacan [Wed, 30 May 2018 10:02:53 +0000 (13:02 +0300)] 
Move printMutableList to Printer.c next to other printers

13 months agoHandle TREC_CHUNK in printClosure
Ömer Sinan Ağacan [Wed, 30 May 2018 08:55:02 +0000 (11:55 +0300)] 
Handle TREC_CHUNK in printClosure

13 months agotestsuite: Use /usr/bin/env instead of /bin/bash
Ben Gamari [Tue, 29 May 2018 21:37:01 +0000 (17:37 -0400)] 
testsuite: Use /usr/bin/env instead of /bin/bash

Namely in T13719 and T13701.

13 months agotestsuite: Fix incorrectly capitalized True in testlib.py
Ben Gamari [Tue, 29 May 2018 21:36:13 +0000 (17:36 -0400)] 
testsuite: Fix incorrectly capitalized True in testlib.py

13 months agoUnmask readMVar in readChan
David Feuer [Tue, 29 May 2018 20:51:16 +0000 (16:51 -0400)] 
Unmask readMVar in readChan

When `readMVar` was implemented using `takeMVar` and `putMVar`,
we needed to use `modifyMVarMasked` in `readChan` just in case
the `readMVar` was interrupted between taking and putting. Now
that `readMVar` uses an atomic primop, this is impossible, so we can
safely unmask `readMVar`.

Reviewers: hvr, bgamari, simonmar

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4738

13 months agobase: Improve zip documentation
Taylor Fausak [Tue, 22 May 2018 13:29:43 +0000 (09:29 -0400)] 
base: Improve zip documentation

13 months agoUse a less confusing type variable in a few types
Simon Jakobi [Mon, 21 May 2018 18:04:07 +0000 (20:04 +0200)] 
Use a less confusing type variable in a few types

13 months agoMinor refactoring
Gabor Greif [Tue, 29 May 2018 10:16:23 +0000 (12:16 +0200)] 
Minor refactoring

13 months agoTypofix in manual [ci skip]
Gabor Greif [Tue, 29 May 2018 10:15:18 +0000 (12:15 +0200)] 
Typofix in manual [ci skip]

13 months agoremove dead maybeIsLFCon
Gabor Greif [Mon, 28 May 2018 12:14:59 +0000 (14:14 +0200)] 
remove dead maybeIsLFCon

13 months agoTypofixes [ci skip]
Gabor Greif [Fri, 25 May 2018 13:33:21 +0000 (15:33 +0200)] 
Typofixes [ci skip]

13 months agoFactor stack chunk printing out of printTSO
Ömer Sinan Ağacan [Tue, 29 May 2018 07:36:16 +0000 (10:36 +0300)] 
Factor stack chunk printing out of printTSO

Makes it possible to print STACK (StgStack) objects easily in gdb

13 months agoClean up Windows testsuite failures
Tamar Christina [Mon, 28 May 2018 18:34:11 +0000 (19:34 +0100)] 
Clean up Windows testsuite failures

Summary:
Another round and attempt at getting these down to 0.

We really should re-enable the CI and not wait for those cloud based ones.

I've disabled the backpack tests on windows as they are too broad, they test
as much the shell as they do the compiler.

The perf tests have been too long to track down. but the numbers are horrible
but I don't see them getting fixed so just have to accept them.

T9293 has new windows specific output because a Dyn way only flag was added.
This will of course not work on non-Dyn way builds.

Test Plan: ./validate

Reviewers: bgamari, hvr, simonmar

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15107

Differential Revision: https://phabricator.haskell.org/D4668

13 months agoFix 32 bit windows build
Tamar Christina [Mon, 28 May 2018 18:19:18 +0000 (19:19 +0100)] 
Fix 32 bit windows build

Summary:
Fix a number of issues that have broken the 32 bit build.
This makes it build again.

Test Plan: ./validate

Reviewers: hvr, goldfire, bgamari, erikd, simonmar

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4691

13 months agoUpdate GHC.Stats docs
Ömer Sinan Ağacan [Mon, 28 May 2018 06:59:55 +0000 (09:59 +0300)] 
Update GHC.Stats docs

Make it clear that max_live_bytes is updated after a major GC whereas
live_bytes is updated after all GCs (including minor collections) and
considers data in uncollected generations as live.

Reviewers: bgamari, simonmar, hvr

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4734

13 months agobase: Introduce Data.Monoid.Ap
chessai [Wed, 11 Apr 2018 22:28:41 +0000 (18:28 -0400)] 
base: Introduce Data.Monoid.Ap

This data type witnesses the lifting of a monoid into an applicative
pointwise.

13 months agoMark #12447's test case as expected to pass
Ryan Scott [Sat, 26 May 2018 16:38:08 +0000 (12:38 -0400)] 
Mark #12447's test case as expected to pass

This appears to have been fixed at some point between GHC 8.0 and
8.2.

13 months agoAdd regression test for #14246
Ryan Scott [Sat, 26 May 2018 15:58:03 +0000 (11:58 -0400)] 
Add regression test for #14246

13 months agoAdd regression test for #14172
Ryan Scott [Sat, 26 May 2018 15:39:26 +0000 (11:39 -0400)] 
Add regression test for #14172

Commit 433b80dec1cfef787fc1327a9eada1791b11c12e fixed #14172. Let's
add a regression test to ensure that it stays fixed.

13 months agoAdd regression test for #11766
Ryan Scott [Sat, 26 May 2018 14:29:22 +0000 (10:29 -0400)] 
Add regression test for #11766

13 months agotestsuite: Don't rely on find command in T15038
Ben Gamari [Sat, 26 May 2018 08:04:18 +0000 (11:04 +0300)] 
testsuite: Don't rely on find command in T15038

Test Plan: Validate

Reviewers: int-index, osa1

Reviewed By: osa1

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15038

Differential Revision: https://phabricator.haskell.org/D4723

13 months agoComments about the substition invariant
Simon Peyton Jones [Fri, 25 May 2018 11:23:43 +0000 (12:23 +0100)] 
Comments about the substition invariant

13 months agoisDllName: use Opt_ExternalDynamicRefs, not WayDyn
Simon Marlow [Thu, 24 May 2018 10:18:48 +0000 (11:18 +0100)] 
isDllName: use Opt_ExternalDynamicRefs, not WayDyn

This should have been part of D4477, but got missed.

13 months agoAdd -fghci-leak-check to check for space leaks
Simon Marlow [Wed, 2 May 2018 10:01:13 +0000 (11:01 +0100)] 
Add -fghci-leak-check to check for space leaks

Summary:
(re-applying this patch now that D4659 is committed)

Space leaks in GHCi emerge from time to time and tend to come back again
after they get fixed. This is an attempt to limit regressions by

* adding a reliable detection for some classes of space leaks in GHCi
* turning on leak checking for all GHCi tests in the test suite, so that
  we'll notice if the leak appears again.

The idea for detecting space leaks is quite simple:

* find some data that we expect to be GC'd later, make a weak pointer to it
* when we expect the data to be dead, do a `performGC` and then check
  the status of the weak pointer.

It would be nice to apply this trick to lots of things in GHC,
e.g. ensuring that HsSyn is not retained after the desugarer, or
ensuring that CoreSyn from the previous simplifier pass is not retained.

Test Plan: validate

Reviewers: bgamari, simonpj, erikd, niteria

Subscribers: thomie, carter

GHC Trac Issues: #15111

13 months agoMinor typos
Ryan Scott [Thu, 24 May 2018 14:37:35 +0000 (10:37 -0400)] 
Minor typos

13 months agoClean up the conflicting data family instances error message
Ryan Scott [Thu, 24 May 2018 14:33:51 +0000 (10:33 -0400)] 
Clean up the conflicting data family instances error message

Summary:
The way we were pretty-printing conflicting data family
instances in an error message was far from ideal:

1. If a data type had no constructors, it would print an equals sign
   with nothing to the right of it.
2. It would try to print GADTs using Haskell98 syntax.
3. It eta-reduced away some type variables from the LHS.

This patch addresses these three issues:

1. We no longer print constructors at all in this error message.
   There's really no reason to do so in the first place, since
   duplicate data family instances always conflict, regardless of
   their constructors.
2. Since we no longer print constructors, we no longer have to
   worry about whether we're using GADT or Haskell98 syntax.
3. I've put in a fix to ensure that type variables are no longer
   eta-reduced away from the LHS.

Test Plan: make test TEST=T14179

Reviewers: goldfire, bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #14179

Differential Revision: https://phabricator.haskell.org/D4711

13 months agoCheck for mismatched class methods during typechecking
Ryan Scott [Thu, 24 May 2018 14:31:28 +0000 (10:31 -0400)] 
Check for mismatched class methods during typechecking

Summary:
Template Haskell provides a wormhole through which you can
sneak methods that don't belong to a class into an instance for that
class, bypassing the renamer's validity checks. The solution adopted
here is to mirror the treatment for associated type family instances,
which have an additional check in the typechecker which catch
mismatched associated type families that were snuck through using
Template Haskell. I've put a similar check for class methods into
`tcMethods`.

Test Plan: make test TEST=T12387

Reviewers: bgamari, simonpj

Reviewed By: bgamari, simonpj

Subscribers: simonpj, rwbarton, thomie, carter

GHC Trac Issues: #12387

Differential Revision: https://phabricator.haskell.org/D4710

13 months agotestsuite: Bump OS X performance numbers
Ben Gamari [Thu, 24 May 2018 13:59:43 +0000 (09:59 -0400)] 
testsuite: Bump OS X performance numbers

Sadly I can't easily determine the cause of T13701's regression since the tree
was broken.

14 months agoDisable the SRT offset optimisation on MachO platforms
Ben Gamari [Tue, 22 May 2018 13:36:35 +0000 (09:36 -0400)] 
Disable the SRT offset optimisation on MachO platforms

Unfortunately, this optimisation is infeasible on MachO platforms (e.g.
Darwin) due to an object format limitation. Specifically, linking fails
with errors of the form:

     error: unsupported relocation with subtraction expression, symbol
     '_integerzmgmp_GHCziIntegerziType_quotInteger_closure' can not be
     undefined in a subtraction expression

Apparently MachO does not permit relocations' subtraction expressions to
refer to undefined symbols. As far as I can tell this means that it is
essentially impossible to express an offset between symbols living in
different compilation units. This means that we lively can't use this
optimisation on MachO platforms.

Test Plan: Validate on Darwin

Reviewers: simonmar, erikd

Subscribers: rwbarton, thomie, carter, angerman

GHC Trac Issues: #15169

Differential Revision: https://phabricator.haskell.org/D4715

14 months agoFix a bug in SRT generation
Simon Marlow [Tue, 22 May 2018 14:19:55 +0000 (15:19 +0100)] 
Fix a bug in SRT generation

Summary:
I had good intentions, but they were not being followed. In particular,
this comment:

```
---  - we never resolve a reference to a CAF to the contents of its SRT, since
---    the point of SRTs is to keep CAFs alive.
```

was not true, because we updated the srtMap after generating the SRT
for a CAF. Therefore it was possible for another CAF to refer to an
earlier CAF, and the reference to the earlier CAF would be shortcutted
to refer to its SRT instead of pointing to the CAF itself.

The fix is just to not update the srtMap when generating the SRT for a
CAF, but I also refactored the code and comments around this to be a bit
better organised.

Test Plan: Harbourmaster

Reviewers: bgamari, michalt, simonpj, erikd

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #15173, #15168

Differential Revision: https://phabricator.haskell.org/D4721

14 months agoUse dischargeFunEq consistently
Simon Peyton Jones [Wed, 23 May 2018 12:06:53 +0000 (13:06 +0100)] 
Use dischargeFunEq consistently

Trac #15122 turned out to be interesting.

* Were calling dischargeFmv in three places.

* In all three cases we dealt with the Given case
  separately.

* In two of the three cases the Given code was right,
  (albeit duplicated).

* In the third case (in TcCanonical.canCFunEqCan), we had
     ; case flav of
         Given -> return () -- nothing more to do.
  which was utterly wrong.

The solution is easy: move the Given-case handling into
dischargeFmv (now reenamed dischargeFunEq), and delete it
from the call sites.

Result: less code, easier to understand (dischargeFunEq handles
all three cases, not just two out of three), and Trac #15122 is fixed.

14 months agoDon't expose strictness when sm_inline is False
Simon Peyton Jones [Wed, 23 May 2018 12:30:21 +0000 (13:30 +0100)] 
Don't expose strictness when sm_inline is False

This is very much a corner case, but Trac #15163 showed
that if you have a RULE like
    forall x. f (g x) = ..x..

and g = undefined, then the simplifier is likely to discard
that 'x' argument. It is usually right to do so; but not here
because then x is used on the right but not bound on the left.

The fix is a narrow one, aimed at this rather pathalogical case.
See Note [Do not expose strictness if sm_inline=False] in
SimplUtils.

14 months agoAdd missing check to isReflCoVar_maybe
Simon Peyton Jones [Wed, 23 May 2018 12:19:33 +0000 (13:19 +0100)] 
Add missing check to isReflCoVar_maybe

isReflCoVar_maybe is called, by CoreLint, on all sorts of
Vars (tyvars, term vars, coercion vars).  But it was silently
assuming that it was always called on a CoVar, and as a result
could crash fatally.  This is the immediate cause of the panic
in Trac #15163.

It's easy to fix.

NB: this does not completely fix Trac #15163; more to come

14 months agoRemove special case from TcTyVar level check
Simon Peyton Jones [Wed, 23 May 2018 12:14:50 +0000 (13:14 +0100)] 
Remove special case from TcTyVar level check

In TcMType.writeMetaTyVarRef we have an assertion
check, level_check_ok, that the type being written
to a unification variable is not deeper than the level
of the unification varaible itself.

This check used to have a special case for fmv/fsk
flatten vars, but this commit changed fmv/fsks to have
an ordinary level number:

    commit 2bbdd00c6d70bdc31ff78e2a42b26159c8717856
    Author: Simon Peyton Jones <simonpj@microsoft.com>
    Date:   Fri May 18 08:43:11 2018 +0100

    Orient TyVar/TyVar equalities with deepest on the left

So we can delete the isFlattenTyVar special case from
the level_check_ok assertion.  Simpler, less ad hoc.

14 months agoTypo in comments
Gabor Greif [Wed, 7 Feb 2018 15:54:38 +0000 (16:54 +0100)] 
Typo in comments

14 months agoImprove performance of CallArity
Joachim Breitner [Mon, 21 May 2018 15:24:05 +0000 (11:24 -0400)] 
Improve performance of CallArity

the hot path contained a call to

    v `elemUnVarSet` (neighbors g v)

and creating the set of neighbors just to check if `v` is inside
accounted for half the allocations of the test case of #15164.

By introducing a non-allocating function `hasLoopAt` for this we shave
off half the allocations. This brings the total cost of Call Arity down
to 20% of time and 23% of allocations, according to a profiled run. Not
amazing, but still much better.

Differential Revision: https://phabricator.haskell.org/D4718

14 months agoRevert "ghc-pkg: recompute `abi-depends` for updated packages"
Ben Gamari [Mon, 21 May 2018 20:37:31 +0000 (16:37 -0400)] 
Revert "ghc-pkg: recompute `abi-depends` for updated packages"

This reverts commit 1cdc14f9c014f1a520638f7c0a01799ac6d104e6.

This is causing non-deterministic testsuite output.

14 months agoCheck for type families in an instance context
Simon Peyton Jones [Mon, 21 May 2018 12:38:12 +0000 (13:38 +0100)] 
Check for type families in an instance context

This patch adds a check for type families to the instance-decl
termination check.  See Note [Type families in instance contexts]
and Trac #15172.