Permalink
Switch branches/tags
Commits on Apr 29, 2017
  1. Prefer #if defined to #ifdef

    Our new CPP linter enforces this.
    bgamari committed Apr 21, 2017
  2. Enable new warning for fragile/incorrect CPP #if usage

    The C code in the RTS now gets built with `-Wundef` and the Haskell code
    (stages 1 and 2 only) with `-Wcpp-undef`. We now get warnings whereever
    `#if` is used on undefined identifiers.
    
    Test Plan: Validate on Linux and Windows
    
    Reviewers: austin, angerman, simonmar, bgamari, Phyx
    
    Reviewed By: bgamari
    
    Subscribers: thomie, snowleopard
    
    Differential Revision: https://phabricator.haskell.org/D3278
    erikd-ambiata committed with bgamari Apr 4, 2017
Commits on Apr 28, 2017
  1. Improve code generation for conditionals

    This patch in in preparation for the fix to Trac #13397
    
    The code generator has a special case for
      case tagToEnum (a>#b) of
        False -> e1
        True  -> e2
    
    but it was not doing nearly so well on
      case a>#b of
        DEFAULT -> e1
        1#      -> e2
    
    This patch arranges to behave essentially identically in
    both cases.  In due course we can eliminate the special
    case for tagToEnum#, once we've completed Trac #13397.
    
    The changes are:
    
    * Make CmmSink swizzle the order of a conditional where necessary;
      see Note [Improving conditionals] in CmmSink
    
    * Hack the general case of StgCmmExpr.cgCase so that it use
      NoGcInAlts for conditionals.  This doesn't seem right, but it's
      the same choice as the tagToEnum version. Without it, code size
      increases a lot (more heap checks).
    
      There's a loose end here.
    
    * Add comments in CmmOpt.cmmMachOpFoldM
    simonpj committed with treeowl Mar 8, 2017
  2. Re-engineer caseRules to add tagToEnum/dataToTag

    See Note [Scrutinee Constant Folding] in SimplUtils
    
    * Add cases for tagToEnum and dataToTag. This is the main new
      bit.  It allows the simplifier to remove the pervasive uses
      of     case tagToEnum (a > b) of
                False -> e1
                True  -> e2
      and replace it by the simpler
             case a > b of
                DEFAULT -> e1
                1#      -> e2
      See Note [caseRules for tagToEnum]
      and Note [caseRules for dataToTag] in PrelRules.
    
    * This required some changes to the API of caseRules, and hence
      to code in SimplUtils.  See Note [Scrutinee Constant Folding]
      in SimplUtils.
    
    * Avoid duplication of work in the (unusual) case of
         case BIG + 3# of b
           DEFAULT -> e1
           6#      -> e2
    
      Previously we got
         case BIG of
           DEFAULT -> let b = BIG + 3# in e1
           3#      -> let b = 6#       in e2
    
      Now we get
         case BIG of b#
           DEFAULT -> let b = b' + 3# in e1
           3#      -> let b = 6#      in e2
    
    * Avoid duplicated code in caseRules
    
    A knock-on refactoring:
    
    * Move Note [Word/Int underflow/overflow] to Literal, as
      documentation to accompany mkMachIntWrap etc; and get
      rid of PrelRuls.intResult' in favour of mkMachIntWrap
    simonpj committed with treeowl Mar 8, 2017
  3. Move dataConTagZ to DataCon

    Just a simple refactoring to remove duplication
    simonpj committed with treeowl Mar 7, 2017
  4. nativeGen: Use SSE2 SQRT instruction

    Reviewers: austin, dfeuer
    
    Subscribers: dfeuer, rwbarton, thomie
    
    GHC Trac Issues: #13629
    
    Differential Revision: https://phabricator.haskell.org/D3508
    bgamari committed with bgamari Apr 28, 2017
  5. CSE: Fix cut and paste error

    extendCSRecEnv took the map to be extended from cs_map instead of
    cs_rec_map.  Oops!
    
    Test Plan: Validate
    
    Reviewers: simonpj, austin
    
    Subscribers: rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3510
    bgamari committed with bgamari Apr 28, 2017
  6. Use memcpy in cloneArray

    While looking at #13615 I noticed that there was this strange open-coded
    memcpy in the definition of the cloneArray macro. I don't see why this
    should be preferable to memcpy.
    
    Test Plan: Validate, particularly focusing on array operations
    
    Reviewers: simonmar, tibbe, austin, alexbiehl
    
    Reviewed By: tibbe, alexbiehl
    
    Subscribers: alexbiehl, rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3504
    bgamari committed with bgamari Apr 28, 2017
  7. Make the tyvars in TH-reified data family instances uniform

    It turns out we were using two different sets of type variables when
    reifying data family instances in Template Haskell. We were using the
    tyvars quantifying over the instance itself for the LHS, but using the
    tyvars quantifying over the data family instance constructor for the
    RHS. This commit uses the instance tyvars for both the LHS and the RHS,
    fixing #13618.
    
    Test Plan: make test TEST=T13618
    
    Reviewers: goldfire, austin, bgamari
    
    Reviewed By: goldfire, bgamari
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #13618
    
    Differential Revision: https://phabricator.haskell.org/D3505
    RyanGlScott committed with bgamari Apr 28, 2017
  8. Add regression test for #12104

    Commit 2f9f1f8
    (#13487) fixes #12104 as well. This adds a regression test for the
    program reported in #12104 to keep it fixed.
    
    Test Plan: make test TEST=T12104
    
    Reviewers: bgamari, austin
    
    Reviewed By: bgamari
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #12104
    
    Differential Revision: https://phabricator.haskell.org/D3495
    RyanGlScott committed with bgamari Apr 28, 2017
  9. get-win32-tarballs: Grab perl tarball from haskell.org, not GitHub

    Reviewers: austin, dfeuer
    
    Reviewed By: dfeuer
    
    Subscribers: Phyx, rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3509
    bgamari committed with bgamari Apr 28, 2017
  10. Be a bit more eager to inline in a strict context

    If we see f (g x), and f is strict, we want to be a bit more eager to
    inline g, because it may well expose an eval (on x perhaps) that can
    be eliminated or shared.
    
    I saw this in nofib boyer2, function RewriteFuns.onewayunify1.  It
    showed up as a consequence of the preceding patch that makes the
    simplifier do less work (Trac #13379).  We had
    
       f d (g x)
    
    where f was a class-op. Previously we simplified both d and
    (g x) with a RuleArgCtxt (making g a bit more eager to inline).
    But now we simplify only d that way, then fire the rule, and
    only then simplify (g x).  Firing the rule produces a strict
    funciion, so we want to make a strict function encourage
    inlining a bit.
    simonpj committed Apr 27, 2017
  11. Cure exponential behaviour in the simplifier

    This patch nails a Bad Bug exposed in Trac #13379. Roughly,
    a deeply-nested application like
       f (f (f ....) ) )
    could make the simplifier go exponential -- without producing
    an exponential-sized result!
    
    The reason was that we
      - simplified a (big) function argument
      - then decided to inline the function
      - then preInilneUnconditionally the argument
      - and then re-simplified the big argument
    
    And if the "big argument" itself had a similar structure
    things could get very bad.
    
    Once I'd understood, it was easy to fix:
    
    * See Note Note [Avoiding exponential behaviour] for an overview
    
    * The key change is that Simplify.simplLam now as a case for
      (isSimplified dup). This is what removes the perf bug.
    
    * But I also made simplCast more parsimonious about simplifying,
      avoiding doing so when the coercion is Refl
    
    * And similarly I now try to avoid simplifying arguments
      where possible before applying rules.
      See Note [Trying rewrite rules]
    
    The latter two points tackle common cases, and in those cases make the
    simplifier take fewer iterations.
    simonpj committed Apr 26, 2017
  12. Eta expansion and join points

    CoreArity.etaExpand tried to deal with eta-expanding expressions
    with join points.  For example
        let j x = e in \y. b
    
    But it is hard to eta-expand this in the "no-crap" way described in
    Note [No crap in eta-expanded code], becuase it would mean pushing
    the "apply to y" into the join RHS, and changing its type. And the
    join might be recursive, and it might have an unfolding.
    
    Moreover in elaborate cases like this I don't think we need the
    no-crap thing.  So for now I'm simplifying the code by generating
       \z. (let j x = e in \y. b) z
    
    Let's see if that gives rise to any problems.
    See Note [Eta expansion for join points]
    simonpj committed Apr 26, 2017
  13. Comments only

    simonpj committed Apr 26, 2017
  14. Comments only

    simonpj committed Apr 25, 2017
  15. A bit more tcTrace

    simonpj committed Apr 25, 2017
  16. Comments and tiny refactoring

    simonpj committed Apr 21, 2017
Commits on Apr 27, 2017
  1. Bump process to 1.6

    Also bumps Cabal submodule due to version bound bump.
    bgamari committed Apr 21, 2017
Commits on Apr 26, 2017
  1. Update Cabal submodule, with necessary wibbles.

    Test Plan: validate
    
    Reviewers: bgamari, austin
    
    Reviewed By: bgamari
    
    Subscribers: rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3501
    ezyang committed with bgamari Apr 26, 2017
Commits on Apr 25, 2017
  1. Add instances for Data.Ord.Down

    Namely `Num`, `Functor`, `Applicative`, `Monad`, `Semigroup` and
    `Monoid` for `Data.Ord.Down` (#13097).
    
    Reviewers: austin, hvr, bgamari, RyanGlScott
    
    Reviewed By: bgamari, RyanGlScott
    
    Subscribers: RyanGlScott, rwbarton, thomie
    
    GHC Trac Issues: #13097
    
    Differential Revision: https://phabricator.haskell.org/D3500
    adamse committed with bgamari Apr 25, 2017
  2. Document mkWeak#

    Reviewers: simonmar, austin
    
    Reviewed By: simonmar
    
    Subscribers: RyanGlScott, rwbarton, thomie
    
    GHC Trac Issues: #10640, #13611
    
    Differential Revision: https://phabricator.haskell.org/D3498
    bgamari committed with bgamari Apr 25, 2017
  3. Only pretty-print binders in closed type families with -fprint-explic…

    …it-foralls
    
    Previously, we were unconditionally pretty-printing all type variable
    binders when pretty-printing closed type families (e.g., in the output
    of `:info` in GHCi). This threw me for a loop, so let's guard this behind
    the `-fprint-explicit-foralls` flag.
    
    Test Plan: make test TEST=T13420
    
    Reviewers: goldfire, austin, bgamari
    
    Reviewed By: bgamari
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #13420
    
    Differential Revision: https://phabricator.haskell.org/D3497
    RyanGlScott committed with bgamari Apr 25, 2017
  4. Add backup url and sync support for Win32 tarball script

    This imports @bgamari's sync script into the mirror script
    and adds a backup url for packages.
    
    The idea is that the URLs won't need updating when updating
    the tarballs from now on.
    
    It will first try haskell.org,
    failing that it'll try repo.msys2.org
    
    Test Plan: try new command `mk/get-win32-tarballs.sh sync`
    
    Reviewers: austin, bgamari
    
    Reviewed By: bgamari
    
    Subscribers: rwbarton, thomie, bgamari
    
    Differential Revision: https://phabricator.haskell.org/D3488
    Mistuke committed with bgamari Apr 25, 2017
  5. PPC NCG: Implement callish prim ops

    Provide PowerPC optimised implementations of callish prim ops.
    
    MO_?_QuotRem
    The generic implementation of quotient remainder prim ops uses
    a division and a remainder operation. There is no remainder on
    PowerPC and so we need to implement remainder "by hand" which
    results in a duplication of the divide operation when using the
    generic code.
    
    Avoid this duplication by implementing the prim op in the native
    code generator.
    
    MO_U_Mul2
    Use PowerPC's instructions for long multiplication.
    
    Addition and subtraction
    Use PowerPC add/subtract with carry/overflow instructions
    
    MO_Clz and MO_Ctz
    Use PowerPC's CNTLZ instruction and implement count trailing
    zeros using count leading zeros
    
    MO_QuotRem2
    Implement an algorithm given by Henry Warren in "Hacker's Delight"
    using PowerPC divide instruction. TODO: Use long division instructions
    when available (POWER7 and later).
    
    Test Plan: validate on AIX and 32-bit Linux
    
    Reviewers: simonmar, erikd, hvr, austin, bgamari
    
    Reviewed By: erikd, hvr, bgamari
    
    Subscribers: trofi, kgardas, thomie
    
    Differential Revision: https://phabricator.haskell.org/D2973
    trommler committed with bgamari Apr 25, 2017
  6. configure: Kill off FP_ARG_WITH_*

    This replaces the --with-* configure flags with the usual autoconf
    environment variables, as suggested by #13583.
    
    Test Plan: Configure on various platforms
    
    Reviewers: hvr, trofi, thomie, austin
    
    Reviewed By: trofi
    
    Subscribers: rwbarton, erikd
    
    GHC Trac Issues: #13583
    
    Differential Revision: https://phabricator.haskell.org/D3499
    bgamari committed with bgamari Apr 25, 2017
  7. Revert "Remove special casing of Windows in generic files"

    This commit didn't consider the fact that binary distributions on Windows must
    have relative toolchain paths. This caused #13560.
    
    This reverts commit 48385cb (except for a
    helpful comment).
    bgamari committed Apr 25, 2017
  8. Don't describe tuple sections as "Python-style"

    (cherry picked from commit 960589e)
    chris-martin committed with bgamari Apr 22, 2017
  9. Don't setProgramDynFlags on every :load

    Summary:
    setProgramDynFlags invalidates the whole module graph, forcing
    everything to be re-summarised (including preprocessing) on every
    :reload.
    
    Looks like this was a bad regression in 8.0, but we didn't notice
    because there was no test for it.  Now there is!
    
    Test Plan:
    * validate
    * new unit test
    
    Reviewers: bgamari, triple, austin, niteria, erikd, jme
    
    Subscribers: rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3398
    simonmar committed Mar 30, 2017
Commits on Apr 24, 2017
  1. core-spec: Simplify the handling of LetRec

    We do not need to keep an enrivonment around to implement letrec, as
    long as we only do call-by-name. Instead, evaluate letrec by
    substituting for all the variables with their RHS wrapped in the letrec
    binding.
    
    Since nothing adds to the enrivonment any more, there is no need for a
    S_Var rule.
    
    Differential Revision: https://phabricator.haskell.org/D3466
    nomeata committed Apr 18, 2017
  2. Guard yet another /bin/sh `for in` loop against empty vars

    This is a follow-up to df67940
    which missed `INSTALL_BINS`
    hvr committed Apr 24, 2017
  3. Add failing test case for T13611

    this program should be rejected, but is not (and segfaults).
    nomeata committed Apr 24, 2017
  4. testsuite/driver: Fix deletion retry logic on Windows

    Previously rmtree's error callback would throw an exception, breaking
    out of the retry loop.
    
    Test Plan: Validate on Windows
    
    Reviewers: Phyx, austin
    
    Reviewed By: Phyx
    
    Subscribers: rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3492
    bgamari committed with bgamari Apr 24, 2017
  5. compiler/cmm/PprC.hs: constify labels in .rodata

    Consider one-line module
        module B (v) where v = "hello"
    in -fvia-C mode it generates code like
        static char gibberish_str[] = "hello";
    
    It resides in data section (precious resource on ia64!).
    The patch switches genrator to emit:
        static const char gibberish_str[] = "hello";
    
    Other types if symbols that gained 'const' qualifier are:
    
    - info tables (from haskell and CMM)
    - static reference tables (from haskell and CMM)
    
    Cleanups along the way:
    
    - fixed info tables defined in .cmm to reside in .rodata
    - split out closure declaration into 'IC_' / 'EC_'
    - added label declaration (based on label type) right before
      each label definition (based on section type) so that C
      compiler could check if declaration and definition matches
      at definition site.
    
    Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
    
    Test Plan: ran testsuite on unregisterised x86_64 compiler
    
    Reviewers: simonmar, ezyang, austin, bgamari, erikd
    
    Reviewed By: bgamari, erikd
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #8996
    
    Differential Revision: https://phabricator.haskell.org/D3481
    trofi committed with bgamari Apr 24, 2017