2 years agoMinor spelling, grammar, and formatting fixes
Ryan Scott [Tue, 21 Feb 2017 14:43:43 +0000 (09:43 -0500)] 
Minor spelling, grammar, and formatting fixes

[ci skip]

2 years agoFix SetLevels for join points
Simon Peyton Jones [Fri, 17 Feb 2017 15:03:52 +0000 (15:03 +0000)] 
Fix SetLevels for join points

This fixes Trac #13255.  The trouble was that we had a bottoming
join point, and tried to float it to top level. But it had free
JoinIds, so we tried to abstract over them.

Disaster.  Lint should have caught it, but didn't (now fixed).

This patch fixes the original problem.

2 years agoImprove Core Lint, mainly for join points
Simon Peyton Jones [Fri, 17 Feb 2017 15:03:01 +0000 (15:03 +0000)] 
Improve Core Lint, mainly for join points

* lintSingleBinding: check that join points have
                     a valid join-point type
  (Trac #13281)

* lintIdBinder: check that a JoinId is bound by
                a non-top-level let
  i.e.  not a top level binder
        not lambda/case binder

* Check for empty Rec [] bindings

* Rename lintIdBndrs to lintLetBndrs

2 years agotestsuite: Fix allocations of T10547
Ben Gamari [Tue, 21 Feb 2017 14:12:34 +0000 (09:12 -0500)] 
testsuite: Fix allocations of T10547

Previously the comment was correct, but the expected value itself was never

2 years agoRefactor inferConstraints not to use CPS
Simon Peyton Jones [Tue, 21 Feb 2017 14:27:30 +0000 (14:27 +0000)] 
Refactor inferConstraints not to use CPS

For some odd reason inferConstraints was using a CPS style,
which is entirely unnecessary.  This patch straightens it out.

No change in what it does.

2 years agoFix computation of dfun_tvs in mkNewTypeEqn
Simon Peyton Jones [Tue, 21 Feb 2017 13:29:16 +0000 (13:29 +0000)] 
Fix computation of dfun_tvs in mkNewTypeEqn

This bug was causing Trac #13297.

We were recomputing ds_tvs, and doing it wrongly (by omitting
variables that appear only in mtheta).  But actually plain 'tvs'
is just fine.  So code deleted, and bug fixed.

2 years agoFix DeriveAnyClass (again)
Simon Peyton Jones [Tue, 21 Feb 2017 10:27:41 +0000 (10:27 +0000)] 
Fix DeriveAnyClass (again)

This patch fixes Trac #13272.  The general approach was fine, but
we were simply not generating the correct implication constraint
(in particular generating fresh unification variables).  I added
a lot more commentary to Note [Gathering and simplifying
constraints for DeriveAnyClass]

I'm still not very happy with the overall architecture.  It feels
more complicate than it should.

2 years agoSpelling in comments only
Simon Peyton Jones [Tue, 21 Feb 2017 10:25:27 +0000 (10:25 +0000)] 
Spelling in comments only

2 years Add option for debug symbols
Ben Gamari [Tue, 21 Feb 2017 00:08:59 +0000 (19:08 -0500)] Add option for debug symbols

2 years agoBump time submodule to 1.8
Ben Gamari [Mon, 20 Feb 2017 21:01:04 +0000 (16:01 -0500)] 
Bump time submodule to 1.8

This unfortunately had quite a number of knock-on effects, including a need for
new releases of directory and unix.

2 years agoBump Win32 submodule to
Ben Gamari [Mon, 20 Feb 2017 20:59:35 +0000 (15:59 -0500)] 
Bump Win32 submodule to

2 years agoBump a few more performance regressions from Type-indexed Typeable
Ben Gamari [Mon, 20 Feb 2017 18:30:49 +0000 (13:30 -0500)] 
Bump a few more performance regressions from Type-indexed Typeable

These are right on the edge of acceptance and are only reproducible on a
stressed machine.

2 years agoBump Cabal submodule
Ben Gamari [Mon, 20 Feb 2017 16:11:03 +0000 (11:11 -0500)] 
Bump Cabal submodule

We are now tracking the 2.0 branch.

2 years agoA number of Typeable wibbles from review
Ben Gamari [Sun, 19 Feb 2017 15:07:56 +0000 (10:07 -0500)] 
A number of Typeable wibbles from review

I forgot to fold these in to the patch merged earlier.

2 years agoRemove redundant import
Simon Peyton Jones [Fri, 17 Feb 2017 14:57:26 +0000 (14:57 +0000)] 
Remove redundant import

2 years agoFix Core pretty printer
Simon Peyton Jones [Fri, 17 Feb 2017 14:56:13 +0000 (14:56 +0000)] 
Fix Core pretty printer

If a JoinId (bogusly) ends up in an argument position we printed
    f jump j
rather than
    f (jump j)

Easy to fix.

2 years agoKill off the remaining Rec []
Simon Peyton Jones [Fri, 17 Feb 2017 14:55:06 +0000 (14:55 +0000)] 
Kill off the remaining Rec []

The desugarer was producing an empty Rec group, which is never
supposed to happen.  This small patch stops that happening.

Next up: Lint should check.

2 years agoChange -dppr-ticks to -dsuppress-ticks
Simon Peyton Jones [Fri, 17 Feb 2017 14:50:59 +0000 (14:50 +0000)] 
Change -dppr-ticks to -dsuppress-ticks

I spent about two hours today hunting fruitlessly for a simplifier
bug (when fixing Trac #13255), only to find that it was caused by
-ddump-X silently suppressing all ticks in Core.

I think this has happened to me once before.

So I've changed to make tick-printing on by default (like coercions,
etc), with a flag -dsuppress-ticks (like -dsuppress-coercions) to
suppress them.


-dppr-ticks is still there, but deprecated.

2 years agoTypos in manual, tests and comments
Gabor Greif [Wed, 15 Feb 2017 17:13:26 +0000 (18:13 +0100)] 
Typos in manual, tests and comments

2 years agoRemove ghc-api/landmine tests
Alan Zimmerman [Sun, 19 Feb 2017 11:40:52 +0000 (13:40 +0200)] 
Remove ghc-api/landmine tests

They take a long time to run, and are effectively superseded by the -ddump-*-ast

2 years agoImprove Haddock documentation for compact.
Edward Z. Yang [Sat, 18 Feb 2017 01:30:16 +0000 (17:30 -0800)] 
Improve Haddock documentation for compact.

Test Plan: none

Reviewers: simonmar, bgamari, austin

Subscribers: thomie

Differential Revision:

2 years agoDisable Typeable binding generation for unboxed sums
Ben Gamari [Sun, 12 Feb 2017 14:06:00 +0000 (09:06 -0500)] 
Disable Typeable binding generation for unboxed sums

These things are simply too expensive to generate at the moment. More
work is needed here; see #13276 and #13261.

2 years agoType-indexed Typeable
Ben Gamari [Thu, 2 Feb 2017 06:29:26 +0000 (01:29 -0500)] 
Type-indexed Typeable

This at long last realizes the ideas for type-indexed Typeable discussed in A
Reflection on Types (#11011). The general sketch of the project is described on
the Wiki (Typeable/BenGamari). The general idea is that we are adding a type
index to `TypeRep`,

    data TypeRep (a :: k)

This index allows the typechecker to reason about the type represented by the `TypeRep`.
This index representation mechanism is exposed as `Type.Reflection`, which also provides
a number of patterns for inspecting `TypeRep`s,

pattern TRFun :: forall k (fun :: k). ()
              => forall (r1 :: RuntimeRep) (r2 :: RuntimeRep)
                        (arg :: TYPE r1) (res :: TYPE r2).
                 (k ~ Type, fun ~~ (arg -> res))
              => TypeRep arg
              -> TypeRep res
              -> TypeRep fun

pattern TRApp :: forall k2 (t :: k2). ()
              => forall k1 (a :: k1 -> k2) (b :: k1). (t ~ a b)
              => TypeRep a -> TypeRep b -> TypeRep t

-- | Pattern match on a type constructor.
pattern TRCon :: forall k (a :: k). TyCon -> TypeRep a

-- | Pattern match on a type constructor including its instantiated kind
-- variables.
pattern TRCon' :: forall k (a :: k). TyCon -> [SomeTypeRep] -> TypeRep a

In addition, we give the user access to the kind of a `TypeRep` (#10343),

    typeRepKind :: TypeRep (a :: k) -> TypeRep k

Moreover, all of this plays nicely with 8.2's levity polymorphism, including the
newly levity polymorphic (->) type constructor.

Library changes

The primary change here is the introduction of a Type.Reflection module to base.
This module provides access to the new type-indexed TypeRep introduced in this
patch. We also continue to provide the unindexed Data.Typeable interface, which
is simply a type synonym for the existentially quantified SomeTypeRep,

    data SomeTypeRep where SomeTypeRep :: TypeRep a -> SomeTypeRep

Naturally, this change also touched Data.Dynamic, which can now export the
Dynamic data constructor. Moreover, I removed a blanket reexport of
Data.Typeable from Data.Dynamic (which itself doesn't even import Data.Typeable

We also add a kind heterogeneous type equality type, (:~~:), to


The implementation strategy is described in Note [Grand plan for Typeable] in
TcTypeable. None of it was difficult, but it did exercise a number of parts of
the new levity polymorphism story which had not yet been exercised, which took
some sorting out.

The rough idea is that we augment the TyCon produced for each type constructor
with information about the constructor's kind (which we call a KindRep). This
allows us to reconstruct the monomorphic result kind of an particular
instantiation of a type constructor given its kind arguments.

Unfortunately all of this takes a fair amount of work to generate and send
through the compilation pipeline. In particular, the KindReps can unfortunately
get quite large. Moreover, the simplifier will float out various pieces of them,
resulting in numerous top-level bindings. Consequently we mark the KindRep
bindings as noinline, ensuring that the float-outs don't make it into the
interface file. This is important since there is generally little benefit to
inlining KindReps and they would otherwise strongly affect compiler performance.


Initially I was hoping to also clear up the remaining holes in Typeable's
coverage by adding support for both unboxed tuples (#12409) and unboxed sums
(#13276). While the former was fairly straightforward, the latter ended up being
quite difficult: while the implementation can support them easily, enabling this
support causes thousands of Typeable bindings to be emitted to the GHC.Types as
each arity-N sum tycon brings with it N promoted datacons, each of which has a
KindRep whose size which itself scales with N. Doing this was simply too
expensive to be practical; consequently I've disabled support for the time

Even after disabling sums this change regresses compiler performance far more
than I would like. In particular there are several testcases in the testsuite
which consist mostly of types which regress by over 30% in compiler allocations.
These include (considering the "bytes allocated" metric),

 * T1969:  +10%
 * T10858: +23%
 * T3294:  +19%
 * T5631:  +41%
 * T6048:  +23%
 * T9675:  +20%
 * T9872a: +5.2%
 * T9872d: +12%
 * T9233:  +10%
 * T10370: +34%
 * T12425: +30%
 * T12234: +16%
 * 13035:  +17%
 * T4029:  +6.1%

I've spent quite some time chasing down the source of this regression and while
I was able to make som improvements, I think this approach of generating
Typeable bindings at time of type definition is doomed to give us unnecessarily
large compile-time overhead.

In the future I think we should consider moving some of all of the Typeable
binding generation logic back to the solver (where it was prior to
91c6b1f54aea658b0056caec45655475897f1972). I've opened #13261 documenting this

2 years agoGeneralize kind of the (->) tycon
Ben Gamari [Thu, 2 Feb 2017 01:25:33 +0000 (20:25 -0500)] 
Generalize kind of the (->) tycon

This is generalizes the kind of `(->)`, as discussed in #11714.

This involves a few things,

 * Generalizing the kind of `funTyCon`, adding two new `RuntimeRep`
(->) :: forall (r1 :: RuntimeRep) (r2 :: RuntimeRep)
               (a :: TYPE r1) (b :: TYPE r2).
        a -> b -> *

 * Unsaturated applications of `(->)` are expressed as explicit

 * Saturated applications of `(->)` are expressed as `FunTy` as they are

 * Saturated applications of `(->)` are expressed by a new `FunCo`
constructor in coercions

 * `splitTyConApp` needs to ensure that `FunTy`s are split to a
   of `(->)` with the appropriate `RuntimeRep` arguments

 * Teach CoreLint to check that all saturated applications of `(->)` are
represented with `FunTy`

At the moment I assume that `Constraint ~ *`, which is an annoying
source of complexity. This will
be simplified once D3023 is resolved.

Also, this introduces two known regressions,

`tcfail181`, `T10403`
Only shows the instance,

    instance Monad ((->) r) -- Defined in ‘GHC.Base’

in its error message when -fprint-potential-instances is used. This is
because its instance head now mentions 'LiftedRep which is not in scope.
I'm not entirely sure of the right way to fix this so I'm just accepting
the new output for now.

T5963 (Typeable)

T5963 is now broken since Data.Typeable.Internals.mkFunTy computes its
fingerprint without the RuntimeRep variables that (->) expects. This
will be fixed with the merge of D2010.

Haddock performance

The `haddock.base` and `haddock.Cabal` tests regress in allocations by
about 20%. This certainly hurts, but it's also not entirely unexpected:
the size of every function type grows with this patch and Haddock has a
lot of functions in its heap.

2 years agoBump nofib submodule
Ben Gamari [Thu, 16 Feb 2017 21:38:43 +0000 (16:38 -0500)] 
Bump nofib submodule

2 years agoBump libraries/array submodule
Ben Gamari [Thu, 16 Feb 2017 21:38:32 +0000 (16:38 -0500)] 
Bump libraries/array submodule

2 years agoSay 'data' explicitly in IfAbstractTyCon output.
Edward Z. Yang [Mon, 13 Feb 2017 06:36:19 +0000 (22:36 -0800)] 
Say 'data' explicitly in IfAbstractTyCon output.

Signed-off-by: Edward Z. Yang <>
2 years agoImprovements/bugfixes to signature reexport handling.
Edward Z. Yang [Mon, 13 Feb 2017 00:02:44 +0000 (16:02 -0800)] 
Improvements/bugfixes to signature reexport handling.

A number of changes:

- Keep the TcGblEnv from typechecking the local signature
  around when we do merging.  In particular, we setup
  tcg_imports and tcg_rdr_env according to the local
  signature.  This improves our error output (for example,
  see bkpfail04) and also fixes a bug with reexporting
  modules in signatures (see bkpreex07)

- Fix a bug in thinning, where if we had signature A(module A),
  this previously would have *thinned out* all of the inherited
  signatures.  Now we treat every inherited signature as having
  come from an import like "import A", so a module A reexport
  will pick them up.

- Recompilation checking now keeps track of dependent source files
  of the source signature; previously we forgot to retain this

There's a manual update too.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: bgamari, austin

Subscribers: thomie

Differential Revision:

2 years agoFix recompilation tracking on signatures.
Edward Z. Yang [Sun, 12 Feb 2017 12:28:38 +0000 (04:28 -0800)] 
Fix recompilation tracking on signatures.

Previously we weren't tracking these dependencies at all,
because we couldn't "find" the interface for {A.H}.  Now
we've associated hole names to the correct module identity
so we will pick them up.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: bgamari, austin

Subscribers: thomie, snowleopard

Differential Revision:

2 years agoFix a Backpack recompilation avoidance bug when signatures change.
Edward Z. Yang [Sun, 12 Feb 2017 10:44:01 +0000 (02:44 -0800)] 
Fix a Backpack recompilation avoidance bug when signatures change.

Recompilation avoidance checks if -this-unit-id has changed by relying
on the "wanted module" check in readIface ("Something is amiss...").
Unfortunately, this check didn't check if the instantiation made
sense, which meant that if you changed the signatures of a Backpack
package, we'd still treat the old signatures as up-to-date.

The way I fixed this was by having findAndReadIface take in a 'Module'
representing the /actual/ module we were intending to lookup.  We
convert this into the 'Module' we expect to see in 'mi_module' and
now do a more elaborate check that will also verify that instantiations
make sense.

Along the way, I robustified the logging infrastructure for
recompilation checking, and folded wrongIfaceModErr (which
was dead code) into the error message.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: bgamari, austin

Subscribers: thomie, snowleopard

Differential Revision:

2 years agoSimplify OutputableBndr
Simon Peyton Jones [Fri, 17 Feb 2017 13:58:58 +0000 (13:58 +0000)] 
Simplify OutputableBndr

This replaces three methods in OutputableBndr with one,
and adds comments.

There's also a tiny change in the placement of equals signs in
debug-prints.  I like it better that way, but if it complicates
life for anyone we can put it back.

2 years agoFix a substitution bug in cseCase
Simon Peyton Jones [Fri, 17 Feb 2017 12:47:39 +0000 (12:47 +0000)] 
Fix a substitution bug in cseCase

There was a missing substTy in cseCase!  Wow.  I'm surprised
it has not caused problems.  Anyway, easily fixed.

2 years agoHonour -dsuppress-uniques more thoroughly
Simon Peyton Jones [Fri, 17 Feb 2017 13:14:00 +0000 (13:14 +0000)] 
Honour -dsuppress-uniques more thoroughly

I found that tests
and friends were printing uniques, which makes the test fragile.
But -dsuppress-uniques made no difference!  It turned out that
pprName wasn't properly consulting Opt_SuppressUniques.

This patch fixes the problem, and updates those three tests to
use -dsuppress-uniques

2 years agoComments only, about inl_inline and inl_act
Simon Peyton Jones [Fri, 17 Feb 2017 00:01:46 +0000 (00:01 +0000)] 
Comments only, about inl_inline and inl_act

2 years agoBetter perf for haddock.base, haddock.Cabal
Simon Peyton Jones [Thu, 16 Feb 2017 17:44:58 +0000 (17:44 +0000)] 
Better perf for haddock.base, haddock.Cabal

I think this is due to
  commit 6bab649bde653f13c15eba30d5007bef4a9a9d3a
  Author: Simon Peyton Jones <>
  Date:   Thu Feb 16 09:42:32 2017 +0000

      Improve checking of joins in Core Lint

Improvement is around 5%.

2 years agoUse the correct origin in SectionL and Section R
Simon Peyton Jones [Thu, 16 Feb 2017 12:51:36 +0000 (12:51 +0000)] 
Use the correct origin in SectionL and Section R

This fixes Trac #13285.

The CallStack stuff is all driven by a CtOrigin of (OccurenceOf f),
and we were instead using SectionOrigin.  Boo!

Easily fixed; and I did a little refactoring as usual.

2 years agoImprove checking of joins in Core Lint
Simon Peyton Jones [Thu, 16 Feb 2017 09:42:32 +0000 (09:42 +0000)] 
Improve checking of joins in Core Lint

This patch addresses the rather expensive treatment of join points,
identified in Trac #13220 comment:17

Before we were tracking the "bad joins".  Now we track the good ones.
That is easier to think about, and much more efficient; see CoreLint
Note [Join points].

On the way I did some other modest refactoring, among other things
removing a duplicated call of lintIdBndr for let-bindings.

On teh

2 years agoComments and tiny refactor only
Simon Peyton Jones [Thu, 16 Feb 2017 09:41:55 +0000 (09:41 +0000)] 
Comments and tiny refactor only

2 years agoTypos [ci skip]
Gabor Greif [Mon, 13 Feb 2017 14:32:49 +0000 (15:32 +0100)] 
Typos [ci skip]

2 years agoDon't warn about missing methods for instances in signatures.
Edward Z. Yang [Tue, 14 Feb 2017 18:16:04 +0000 (13:16 -0500)] 
Don't warn about missing methods for instances in signatures.

Test Plan: validate

Reviewers: bgamari, austin, dfeuer

Reviewed By: dfeuer

Subscribers: dfeuer, thomie

Differential Revision:

2 years agoMake deSugarExpr use runTcInteractive
Reid Barton [Tue, 14 Feb 2017 18:13:56 +0000 (13:13 -0500)] 
Make deSugarExpr use runTcInteractive

Preparation for #13102, which needs to add more logic to
runTcInteractive, which would need to be duplicated in deSugarExpr.

In order to break an import cycle, I had to move
"Dependency/fingerprinting code" to a new module
DsUsage; which seems sensible anyways.

Test Plan: validate

Reviewers: simonpj, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie, snowleopard

Differential Revision:

2 years agoCheck local type family instances against all imported ones
Reid Barton [Tue, 14 Feb 2017 18:13:37 +0000 (13:13 -0500)] 
Check local type family instances against all imported ones

We previously checked type family instance declarations
in a module for consistency with all instances that we happened
to have read into the EPS or HPT. It was possible to arrange that
an imported type family instance (used by an imported function)
was in a module whose interface file was never read during
compilation; then we wouldn't check consistency of local instances
with this imported instance and as a result type safety was lost.

With this patch, we still check consistency of local type family
instances with all type family instances that we have loaded; but
we make sure to load the interface files of all our imports that
define family instances first. More selective consistency checking
is left to #13102.

On the other hand, we can now safely assume when we import a module
that it has been checked for consistency with its imports. So we
can save checking in checkFamInstConsistency, and overall we should
have less work to do now.

This patch also adds a note describing the Plan for ensuring type
family consistency.

Test Plan: Two new tests added; harbormaster

Reviewers: austin, simonpj, bgamari

Reviewed By: simonpj, bgamari

Subscribers: ggreif, thomie

Differential Revision:

2 years agoUpdate .mailmap [skip ci]
Matthew Pickering [Tue, 14 Feb 2017 16:15:55 +0000 (16:15 +0000)] 
Update .mailmap [skip ci]

2 years agoImplement HasField constraint solving and modify OverloadedLabels
Adam Gundry [Tue, 14 Feb 2017 14:53:28 +0000 (09:53 -0500)] 
Implement HasField constraint solving and modify OverloadedLabels

This implements automatic constraint solving for the new HasField class
and modifies the existing OverloadedLabels extension, as described in
the GHC proposal
( Per the current
form of the proposal, it does *not* currently introduce a separate
`OverloadedRecordFields` extension.

This replaces D1687.

The users guide documentation still needs to be written, but I'll do
that after the implementation is merged, in case there are further
design changes.

Test Plan: new and modified tests in overloadedrecflds

Reviewers: simonpj, goldfire, dfeuer, bgamari, austin, hvr

Reviewed By: bgamari

Subscribers: maninalift, dfeuer, ysangkok, thomie, mpickering

Differential Revision:

2 years agoAllow type defaulting for multi-param type classes with ExtendedDefaultRules
vivid-synth [Tue, 14 Feb 2017 14:51:54 +0000 (09:51 -0500)] 
Allow type defaulting for multi-param type classes with ExtendedDefaultRules

Expressions like the following will now typecheck:

    data A x = A deriving Show

    class ToA a x where
       toA :: a -> A x

    instance ToA Integer x where
       toA _ = A

    main = print (toA 5 :: A Bool)

The new defaulting rules are

Find all the unsolved constraints. Then:

* Find those that have exactly one free type variable, and partition
  that subset into groups that share a common type variable `a`.
* Now default `a` (to one of the types in the default list) if at least
  one of the classes `Ci` is an interactive class

Reviewers: goldfire, bgamari, austin, mpickering, simonpj

Reviewed By: bgamari, simonpj

Subscribers: mpickering, simonpj, goldfire, thomie

Differential Revision:

2 years agoFix ExtraSymbols jump table on Windows.
Tamar Christina [Tue, 14 Feb 2017 14:44:53 +0000 (09:44 -0500)] 
Fix ExtraSymbols jump table on Windows.

This corrects the `jump islands` calculations for Windows.  The code was
incorrectly creating a new entry for every `usage` of a symbol instead
of every used symbol. e.g. if a symbol is used 5 times it used to create
5 jump islands. This is incorrect and not in line with what the `ELF`
and `Mach-O` linkers do. Also since we allocate `n` spaces where `n` is
number of symbols, we would quickly run out of space and abort.

Test Plan: ./validate

Reviewers: simonmar, hvr, erikd, bgamari, austin

Reviewed By: bgamari

Subscribers: thomie, #ghc_windows_task_force

Differential Revision:

2 years agoExpand list of always loaded Windows shared libs
Tamar Christina [Tue, 14 Feb 2017 14:43:02 +0000 (09:43 -0500)] 
Expand list of always loaded Windows shared libs

When the `GCC` driver envokes the pipeline a `SPEC` is used to determine
how to configure the compiler and which libraries to pass along.

For Windows/mingw, this specfile is

This expands the list of base DLLs with the ones that GCC always links,
and adds extra sibling dlls of `stdc++` in case it is linked in.

Following D3028 this patch only needs to load the always load only the
top level individual shared libs.

Test Plan: ./validate

Reviewers: RyanGlScott, austin, bgamari, erikd, simonmar

Reviewed By: bgamari

Subscribers: RyanGlScott, thomie, #ghc_windows_task_force

Differential Revision:

2 years agoRefactor renaming of operators/sections to fix DuplicateRecordFields bugs
Adam Gundry [Tue, 14 Feb 2017 14:35:06 +0000 (09:35 -0500)] 
Refactor renaming of operators/sections to fix DuplicateRecordFields bugs

A variety of panics were possible because the get_op function in
RnTypes didn't handle the possibility that its argument might be an
ambiguous record field. I've made its return type more informative to
correctly handle occurrences of record fields.  Fixes Trac #13132.

Test Plan: new test

Reviewers: bgamari, simonpj, austin

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoTcUnify: Assert precondition of matchExpectedTyConApp
Ben Gamari [Tue, 14 Feb 2017 14:31:08 +0000 (09:31 -0500)] 
TcUnify: Assert precondition of matchExpectedTyConApp

Test Plan: Validate

Reviewers: simonpj, austin

Subscribers: thomie

Differential Revision:

2 years agoTypecast covers entire expression to fix format warning.
bollu [Tue, 14 Feb 2017 13:43:58 +0000 (08:43 -0500)] 
Typecast covers entire expression to fix format warning.

- Fixes (#12636).
- changes all the typecasts to _unsinged long long_ to
  have the format specifiers work.

Reviewers: austin, bgamari, erikd, simonmar, Phyx

Reviewed By: erikd, Phyx

Subscribers: thomie

Differential Revision:

2 years agoDebug: Use local symbols for unwind points (#13278)
Ben Gamari [Tue, 14 Feb 2017 13:43:40 +0000 (08:43 -0500)] 
Debug: Use local symbols for unwind points (#13278)

While this apparently didn't matter on Linux, the OS X toolchain seems
to treat local and external symbols differently during linking. Namely,
the linker assumes that an external symbol marks the beginning of a new,
unused procedure, and consequently drops it.

Fixes regression introduced in D2741.

Test Plan: `debug` testcase on OS X

Reviewers: austin, simonmar, rwbarton

Reviewed By: rwbarton

Subscribers: rwbarton, thomie

Differential Revision:

2 years agoTypos in notes and comments [ci skip]
Gabor Greif [Mon, 13 Feb 2017 12:37:59 +0000 (13:37 +0100)] 
Typos in notes and comments [ci skip]

2 years agoDisable PVP warnings temporarily.
Edward Z. Yang [Sat, 11 Feb 2017 07:15:30 +0000 (23:15 -0800)] 
Disable PVP warnings temporarily.

While the intent is good, they are actually too aggressive:
if a module reexports an identifier from a signature, we will
warn (even though we should not!)  We'll have to implement
this differently.

Signed-off-by: Edward Z. Yang <>
2 years agoSlightly reword not-exported message.
Edward Z. Yang [Fri, 10 Feb 2017 08:54:55 +0000 (00:54 -0800)] 
Slightly reword not-exported message.

Signed-off-by: Edward Z. Yang <>
2 years agoRemove obsolete Backpack manual.
Edward Z. Yang [Fri, 10 Feb 2017 08:50:22 +0000 (00:50 -0800)] 
Remove obsolete Backpack manual.

Signed-off-by: Edward Z. Yang <>
2 years agoSetup more error context for Backpack operations.
Edward Z. Yang [Tue, 7 Feb 2017 23:02:40 +0000 (15:02 -0800)] 
Setup more error context for Backpack operations.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: bgamari, simonpj, austin

Subscribers: thomie

Differential Revision:

2 years agoAdd index entry for signature files / Backpack.
Edward Z. Yang [Fri, 10 Feb 2017 08:48:42 +0000 (00:48 -0800)] 
Add index entry for signature files / Backpack.

Signed-off-by: Edward Z. Yang <>
2 years agoBump hoopl submodule to
Ben Gamari [Sun, 12 Feb 2017 01:20:16 +0000 (20:20 -0500)] 
Bump hoopl submodule to

2 years agoBinary: Correct endian issue when cross-compiling
alexbiehl [Sun, 12 Feb 2017 00:25:27 +0000 (19:25 -0500)] 
Binary: Correct endian issue when cross-compiling

Using `WORDS_BIGENDIAN` wasn't such a great idea after all!
When cross compiling host and target endianess may differ and
`WORDS_BIGENDIAN` refers to host endianess.

Reviewers: austin, bgamari, trofi

Reviewed By: bgamari, trofi

Subscribers: rwbarton, trofi, thomie

Differential Revision:

2 years agoApply SplitSections to all C compilations
Simon Brenner [Sun, 12 Feb 2017 00:25:16 +0000 (19:25 -0500)] 
Apply SplitSections to all C compilations

Previously this was added only to the RTS's C files (those are the bulk
of it though), but there are C bits in ghc-prim, integer-gmp and base

Followup for #8405, allows the large table of character properties in
base to be stripped when not used.

Test Plan: validate

Reviewers: austin, bgamari, simonmar

Reviewed By: bgamari

Subscribers: thomie, snowleopard

Differential Revision:

2 years agobufWrite: Save extra syscall when data fills handle buffer completely.
Niklas Hambüchen [Sun, 12 Feb 2017 00:24:49 +0000 (19:24 -0500)] 
bufWrite: Save extra syscall when data fills handle buffer completely.

The bug is that the check `if (size - w > count)` should be
`if (size - w >= count)` instead (`>=` instead of `>`),
because we can do the write all fine if it fits exactly.
This allows us to do 1 instead of 2 write syscalls the case it fits.

An example of when this matters is when an application writes output
in chunks that are a fraction of the handle buffer size.

For example, assume the buffer size is 8 KB, and the application writes
four 2 KB chunks.
Until now, this would result in 3 copies to the handle buffer, but
the 4th one would not be allowed in by `size - w > count`
(because `size - w == count` is the case), so we'd end up with a write
syscall of only 6 KB data instead of 8 KB, thus creating more syscalls

Implementing this fix (switching to `size - w >= count`), we also have
to flush the buffer if we fill it completely.

If we made only the changes described so far, that would have the
unintended side effect that writes of the size equal to the handle
buffer size (`count == size`) suddenly also go to the handle buffer
first: The data would first be copied to the handle buffer, and then
immediately get flushed to the underlying FD.  We don't want that extra
`memcpy`, because it'd be unnecessary: The point of handle buffering is
to coalesce smaller writes, and there are no smaller writes in this
case.  For example, if you specify 8 KB buffers (which menas you want
your data to be written out in 8 KB blocks), and you get data that's
already 8 KB in size, you can write that out as an 8 KB straight away,
zero-copy fashion.  For this reason, adding to the handle buffer now got
an additional condition `count < size`.  That way, writes equal to the
buffer size go straight to the FD, as they did before this commit.

Reviewers: simonmar, austin, hvr, bgamari

Reviewed By: simonmar

Subscribers: mpickering, thomie

Differential Revision:

2 years agoFix: hPutBuf issues unnecessary empty write syscalls for large writes (#13246)
Niklas Hambüchen [Sun, 12 Feb 2017 00:24:30 +0000 (19:24 -0500)] 
Fix: hPutBuf issues unnecessary empty write syscalls for large writes (#13246)

Until now, any `hPutBuf` that wrote `>= the handle buffer size` would
trigger an unnecessary `write("")` system call before the actual write
system call.

This is fixed by making sure that we never flush an empty handle buffer:
Only flush `when (w > 0)`.

Reviewers: simonmar, austin, hvr, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoFix: Default FD buffer size is not a power of 2 (#13245)
Niklas Hambüchen [Sun, 12 Feb 2017 00:23:37 +0000 (19:23 -0500)] 
Fix: Default FD buffer size is not a power of 2 (#13245)

Reviewers: simonmar, austin, hvr, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoAvoid repeated list elem checks
David Feuer [Sun, 12 Feb 2017 00:23:20 +0000 (19:23 -0500)] 
Avoid repeated list elem checks

Convert a list to a set before testing membership multiple times.

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie

Differential Revision:

2 years agoBinary: Only allocate un-interned FastStrings
alexbiehl [Sun, 12 Feb 2017 00:22:26 +0000 (19:22 -0500)] 
Binary: Only allocate un-interned FastStrings

Test Plan: Validate

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agozonkCt tries to maintain the canonical form of a Ct.
Christiaan Baaij [Sun, 12 Feb 2017 00:21:52 +0000 (19:21 -0500)] 
zonkCt tries to maintain the canonical form of a Ct.

For example,
 - a CDictCan should stay a CDictCan;
 - a CTyEqCan should stay a CTyEqCan (if the LHS stays as a variable.).
 - a CHoleCan should stay a CHoleCan

Why?  For CDicteqCan see Trac #11525.

Test Plan: Validate

Reviewers: austin, adamgundry, simonpj, goldfire, bgamari

Reviewed By: simonpj, bgamari

Subscribers: thomie

Differential Revision:

2 years agorts/Profiling: Factor out report generation
Ben Gamari [Sun, 12 Feb 2017 00:21:22 +0000 (19:21 -0500)] 
rts/Profiling: Factor out report generation

Here we move the actual report generation logic to
`rts/ProfilerReport.c`. This break is actually quite clean,

    void writeCCSReport( FILE *prof_file, CostCentreStack const *ccs,
                         ProfilerTotals totals );

This is more profiler refactoring in preparation for machine-readable

Test Plan: Validate

Reviewers: austin, erikd, simonmar

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

2 years agorts/Profiling: Kill a few globals and add consts
Ben Gamari [Sun, 12 Feb 2017 00:20:56 +0000 (19:20 -0500)] 
rts/Profiling: Kill a few globals and add consts

Previously it was quite difficult to follow the dataflow through this
file due to global mutation and rather non-descriptive types.

This is a cleanup in preparation for factoring out the report-generating
logic, which is itself in preparation for somedayteaching the profiler
to produce more machine-readable reports (JSON perhaps?).

Test Plan: Validate

Reviewers: austin, erikd, simonmar

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

2 years agoFix #13214 by correctly setting up dep_orphs for signatures.
Edward Z. Yang [Sun, 12 Feb 2017 00:20:36 +0000 (19:20 -0500)] 
Fix #13214 by correctly setting up dep_orphs for signatures.

Prior to this, I hadn't thought about orphan handling at all.
This commit implements the semantics that if a signature
(transitively) imports an orphan instance, that instance
is considered in scope no matter what the implementing module
is.  (As it turns out, this is the semantics that falls out
when orphans are recorded transitively.)

This patch fixes a few bugs:

1. Put semantic modules in dep_orphs rather than identity
2. Don't put the implementing module in dep_orphs when
   merging signatures (this is a silly bug that happened
   because we were reusing calculateAvails, which is
   designed for imports. It mostly works for signature
   merging, except this case.)
3. When renaming a signature, blast in the orphans of the
   implementing module inside Dependencies.

Signed-off-by: Edward Z. Yang <>
Test Plan: validate

Reviewers: bgamari, austin

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoImprove the Occurrence Analyzer’s handling of one-shot functions
Joachim Breitner [Sun, 12 Feb 2017 00:20:24 +0000 (19:20 -0500)] 
Improve the Occurrence Analyzer’s handling of one-shot functions

When determining whether an expression is used saturatedly, count the
number of value arguments that the occurrence analyser sees, and add
the number of one-shot arguments that we know (from the strictness
analyser) are passed from the context.

perf results suggest no noticable change in allocations, reduction of
code sizes, and performance regression possibliy due to loss of join

Test Plan:

Reviewers: simonpj, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoMark orphan instances and rules in --show-iface output
Reid Barton [Sun, 12 Feb 2017 00:20:08 +0000 (19:20 -0500)] 
Mark orphan instances and rules in --show-iface output

Test Plan: new test Orphans

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoDwarf.Types: Use DW_CFA_same_value encoding when possible
Ben Gamari [Sun, 12 Feb 2017 00:19:42 +0000 (19:19 -0500)] 
Dwarf.Types: Use DW_CFA_same_value encoding when possible

This is a bit smaller than the alternative, DW_CFA_val_expression. Also
a bit of refactoring.

Test Plan: Validate

Reviewers: scpmw, simonmar, austin

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

2 years agoIcmmMachOpFoldM: clarify panic message
Sergei Trofimovich [Sat, 11 Feb 2017 13:05:24 +0000 (13:05 +0000)] 
IcmmMachOpFoldM: clarify panic message

When adding a new primop cinimod noticed
uninformative ghc panic:
    cmmMachOpFoldM: unknown unary op

This change tweaks panic to contain the op:
    cmmMachOpFoldM: unknown unary op: MO_F_Neg W64

Signed-off-by: Sergei Trofimovich <>
2 years agoRefactor DeriveAnyClass's instance context inference
Ryan Scott [Fri, 10 Feb 2017 21:12:46 +0000 (16:12 -0500)] 
Refactor DeriveAnyClass's instance context inference

Currently, `DeriveAnyClass` has two glaring flaws:

* It only works on classes whose argument is of kind `*` or `* -> *` (#9821).
* The way it infers constraints makes no sense. It basically co-opts the
  algorithms used to infer contexts for `Eq` (for `*`-kinded arguments) or
  `Functor` (for `(* -> *)`-kinded arguments). This tends to produce overly
  constrained instances, which in extreme cases can lead to legitimate things
  failing to typecheck (#12594). Or even worse, it can trigger GHC panics
  (#12144 and #12423).

This completely reworks the way `DeriveAnyClass` infers constraints to fix
these two issues. It now uses the type signatures of the derived class's
methods to infer constraints (and to simplify them). A high-level description
of how this works is included in the GHC users' guide, and more technical notes
on what is going on can be found as comments (and a Note) in `TcDerivInfer`.

Fixes #9821, #12144, #12423, #12594.

Test Plan: ./validate

Reviewers: dfeuer, goldfire, simonpj, austin, bgamari

Subscribers: dfeuer, thomie

Differential Revision:

2 years agoRelax test TH_addCStub2 so it succeeds on travis.
Facundo Domínguez [Fri, 10 Feb 2017 02:20:17 +0000 (23:20 -0300)] 
Relax test TH_addCStub2 so it succeeds on travis.

Test Plan: ./validate

Reviewers: bgamari, nomeata, austin, mpickering

Reviewed By: mpickering

Subscribers: mpickering, rwbarton, mboes, thomie

Differential Revision:

2 years agoPrevent Template Haskell splices from throwing a spurious TypeInType error
Ryan Scott [Fri, 10 Feb 2017 15:31:10 +0000 (10:31 -0500)] 
Prevent Template Haskell splices from throwing a spurious TypeInType error

There was a rather annoying corner case where splicing poly-kinded
Template Haskell declarations could trigger an error muttering about
`TypeInType` not being enabled, whereas the equivalent non-TH code would
compile without issue. This was causing by overzealous validity check in the
renamer, wherein failed to distinguish between two different `Exact` names
with the same `OccName`. As a result, it mistakenly believed some type
variables were being used as both type and kind variables simultaneously! Ack.

This avoids the issue by simply disabling the aforementioned validity check
for Exact names. Fixes #12503.

Test Plan: ./validate

Reviewers: austin, bgamari, goldfire

Subscribers: thomie

Differential Revision:

2 years agoChange rewritableTyVarsOfType to anyRewritableTyVar
Simon Peyton Jones [Fri, 10 Feb 2017 13:54:48 +0000 (13:54 +0000)] 
Change rewritableTyVarsOfType to anyRewritableTyVar

This fixes the regression in FrozenErrorTests, eliminates the
awkward "crash on forall" in rewritableTyVars, and makes it more
efficient too.

2 years agoSpelling in comments [ci skip]
Gabor Greif [Fri, 10 Feb 2017 08:12:12 +0000 (09:12 +0100)] 
Spelling in comments [ci skip]

2 years agoTH-spliced class instances are pretty-printed incorrectly post-#3384
Alan Zimmerman [Sun, 29 Jan 2017 20:35:41 +0000 (22:35 +0200)] 
TH-spliced class instances are pretty-printed incorrectly post-#3384

The HsSyn prettyprinter tests patch 499e43824bda967546ebf95ee33ec1f84a114a7c
broke the pretty-printing of Template Haskell-spliced class instances.

Test Plan: ./validate

Reviewers: RyanGlScott, austin, goldfire, bgamari

Reviewed By: RyanGlScott, bgamari

Subscribers: thomie

Differential Revision:

2 years agoGuard rewritableTyVarsOfType
Simon Peyton Jones [Thu, 9 Feb 2017 12:12:21 +0000 (12:12 +0000)] 
Guard rewritableTyVarsOfType

We only want to use rewriteableTyVarsOfType on CDictCan,
CFunEqCan (and maybe CIrredCan).  But not CTyEqCan.

But we were -- for insolubles.  So I narrowed the scope of
the insuluble kick-out.

2 years agotestsuite: Add testcase for #13248
Ben Gamari [Thu, 9 Feb 2017 04:31:04 +0000 (23:31 -0500)] 
testsuite: Add testcase for #13248

2 years agoBump bytestring submodule
Ben Gamari [Wed, 8 Feb 2017 22:41:51 +0000 (17:41 -0500)] 
Bump bytestring submodule

2 years agoLibrary docs: Document the order for sort and sortOn.
Alexander Kjeldaas [Wed, 8 Feb 2017 23:26:02 +0000 (00:26 +0100)] 
Library docs: Document the order for sort and sortOn.

This closes GH-22.

2 years agoBump array submodule
Ben Gamari [Thu, 9 Feb 2017 02:47:34 +0000 (21:47 -0500)] 
Bump array submodule

Previously test output was left in inconsistent state.

2 years agoTweaks and typos in manual, note refs, comments
Gabor Greif [Wed, 8 Feb 2017 13:14:36 +0000 (14:14 +0100)] 
Tweaks and typos in manual, note refs, comments

2 years agoImplement addCStub in template-haskell.
Facundo Domínguez [Tue, 7 Feb 2017 21:55:34 +0000 (18:55 -0300)] 
Implement addCStub in template-haskell.

addCStub allows injecting C code in the current module to be included
in the final object file.

Test Plan: ./validate

Reviewers: simonpj, goldfire, austin, bgamari

Reviewed By: bgamari

Subscribers: bitonic, duncan, mboes, thomie

Differential Revision:

2 years agoBump array submodule
Ben Gamari [Wed, 8 Feb 2017 23:59:55 +0000 (18:59 -0500)] 
Bump array submodule


2 years agoFix documentation for setByteArray#
Ben Gamari [Wed, 8 Feb 2017 23:55:32 +0000 (18:55 -0500)] 
Fix documentation for setByteArray#

The documentation was previously unusably incomplete.

2 years agousers-guide: Document defaults for remaining optimization flags
Ben Gamari [Wed, 8 Feb 2017 20:49:46 +0000 (15:49 -0500)] 
users-guide: Document defaults for remaining optimization flags

2 years agoAdd dump flags for the renamed and typechecked hsSyn ASTs
Alan Zimmerman [Wed, 8 Feb 2017 11:20:02 +0000 (13:20 +0200)] 
Add dump flags for the renamed and typechecked hsSyn ASTs

D2958 brought in the "dump-parsed-ast" functionality.

Extend it to include "dump-rn-ast" and "dump-tc-ast"

Test Plan: ./validate

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision:

2 years agoBack-pedal the fix for Trac #8155
Simon Peyton Jones [Wed, 8 Feb 2017 16:15:11 +0000 (16:15 +0000)] 
Back-pedal the fix for Trac #8155

I implemented a rather elaborate fix for #8155 ages ago, which
which turns out to be
  a) unnecesssary in this particular case
  b) harmful to the defaulting story; see comment:15 of #12923.

So this patch reverts the elaborate bit. The bit I removed is
described in "Historical note" under Note [approximateWC].

2 years agoKill inaccessible-branch complaints in record update
Simon Peyton Jones [Wed, 8 Feb 2017 16:12:36 +0000 (16:12 +0000)] 
Kill inaccessible-branch complaints in record update

Trac #12957 (the original case in the Description) showed a record
update that yielded an "inaccessible code" warning. This should not
happen; it's just some redundant code generated by the desugarer (later
pruned away) and it's not the user's fault.

This patch suppresses the warning.  See Check.hs
Note [Inaccessible warnings for record updates]

2 years agoAdd some commented-out tracing in SpecConstr
Simon Peyton Jones [Wed, 8 Feb 2017 16:12:11 +0000 (16:12 +0000)] 
Add some commented-out tracing in SpecConstr

2 years agoFix stop_thread unwinding information
Ben Gamari [Wed, 8 Feb 2017 04:00:10 +0000 (23:00 -0500)] 
Fix stop_thread unwinding information

This corrects the unwind information for `stg_stop_thread`, which
allows us to unwind back to the C stack after reaching the end of the
STG stack.

Test Plan: Validate

Reviewers: simonmar, austin, erikd

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

2 years agoCmmLayoutStack: Correctly annotate Sp adjustments with unwinding information
Ben Gamari [Wed, 8 Feb 2017 03:58:48 +0000 (22:58 -0500)] 
CmmLayoutStack: Correctly annotate Sp adjustments with unwinding information

Test Plan: Validate

Reviewers: austin, simonmar

Subscribers: thomie

Differential Revision:

2 years agoCmm: Add support for undefined unwinding statements
Ben Gamari [Wed, 8 Feb 2017 03:56:36 +0000 (22:56 -0500)] 
Cmm: Add support for undefined unwinding statements

And use to mark `stg_stack_underflow_frame`, which we are unable to
determine a caller from.

To simplify parsing at the moment we steal the `return` keyword to
indicate an undefined unwind value. Perhaps this should be revisited.

Reviewers: scpmw, simonmar, austin, erikd

Subscribers: dfeuer, thomie

Differential Revision:

2 years agoCmmLayoutStack: Add unwind information on stack fixups
Ben Gamari [Wed, 8 Feb 2017 03:51:50 +0000 (22:51 -0500)] 
CmmLayoutStack: Add unwind information on stack fixups

Currently stack fixup blocks don't include unwinding information,
leaving a small window where our unwinding information is incorrect. Fix
this by adding unwinding information to emitted fixup blocks.

Reviewers: scpmw, simonmar, austin

Reviewed By: simonmar

Subscribers: thomie

Differential Revision:

2 years agoGeneralize CmmUnwind and pass unwind information through NCG
Ben Gamari [Wed, 8 Feb 2017 03:49:06 +0000 (22:49 -0500)] 
Generalize CmmUnwind and pass unwind information through NCG

As discussed in D1532, Trac Trac #11337, and Trac Trac #11338, the stack
unwinding information produced by GHC is currently quite approximate.
Essentially we assume that register values do not change at all within a
basic block. While this is somewhat true in normal Haskell code, blocks
containing foreign calls often break this assumption. This results in
unreliable call stacks, especially in the code containing foreign calls.
This is worse than it sounds as unreliable unwinding information can at
times result in segmentation faults.

This patch set attempts to improve this situation by tracking unwinding
information with finer granularity. By dispensing with the assumption of
one unwinding table per block, we allow the compiler to accurately
represent the areas surrounding foreign calls.

Towards this end we generalize the representation of unwind information
in the backend in three ways,

 * Multiple CmmUnwind nodes can occur per block

 * CmmUnwind nodes can now carry unwind information for multiple
   registers (while not strictly necessary; this makes emitting
   unwinding information a bit more convenient in the compiler)

 * The NCG backend is given an opportunity to modify the unwinding
   records since it may need to make adjustments due to, for instance,
   native calling convention requirements for foreign calls (see

This sets the stage for resolving #11337 and #11338.

Test Plan: Validate

Reviewers: scpmw, simonmar, austin, erikd

Subscribers: qnikst, thomie

Differential Revision:

2 years agoImprove -dsuppress-coercions
Simon Peyton Jones [Wed, 8 Feb 2017 11:31:32 +0000 (11:31 +0000)] 
Improve -dsuppress-coercions

The -dsuppress-coercions flag was being ignored when printing the
CastIt constructor in SimplUtils.SimplCont.  This fixes ths problem,
and improves what is printed when suppressing coercions, to show the
size of the suppressed coercion.

2 years agoImprove the simple optimiser
Simon Peyton Jones [Tue, 7 Feb 2017 00:32:43 +0000 (00:32 +0000)] 
Improve the simple optimiser

The previous version of the simple optimiser would leave
beta-redexes, which was bad for join points.  E.g.

  join j x = ....   -- a join point
  in (\x. j x) y

This would be ok if we beta-reduced the (\x) but not if
we don't.

This patch improves the simple optimiser, to follow the plan
described in "Secrets of the GHC inliner", and implemented in
the Mighty Simplifier.  It turns out not to be too hard to
use the same plan here, and we get slightly better code as
a result.