1. 14 Jul, 2019 4 commits
    • John Ericson's avatar
      Remove LLVM_TARGET platform macros · e7ed53c9
      John Ericson authored
      Instead following @angerman's suggestion put them in the config file.
      Maybe we could re-key llvm-targets someday, but this is good for now.
    • Ben Gamari's avatar
      Don't package settings in bindist · f508b7ce
      Ben Gamari authored
      Since !712 the `settings` file is produced by the build system instead
      of autoconf. However, this introduced a subtle bug where we would fail
      to rebuild the `settings` file with what we have learned from the
      install-time `configure` invocation. Fix this by not packaging
      `settings` in the bindist tarball. The build system will take care of
      the rest.
      Also fix a bug where the value of `UseLibdw` was not being persisted to
      the install time `configure`.
    • Matthew Pickering's avatar
    • John Ericson's avatar
      Remove purely external primops · ff04eb59
      John Ericson authored
      The compiler doesn't create uses nor compiles the uses that exist
      specially. These are just plain C-- FFI.
      These `await*` ones are especially important to so convert because "true"
      primops are hard to make platform-specific currently.
      The other exports are part of this commit so this module always exports
      something, which avoids silly CPP elsewhere. More will be added later
      once `foreign import prim` is extended.
  2. 13 Jul, 2019 5 commits
    • Ömer Sinan Ağacan's avatar
      Minor refactoring in CmmBuildInfoTables · a7176fa1
      Ömer Sinan Ağacan authored
      - Replace `catMaybes (map ...)` with `mapMaybe ...`
      - Remove a list->set->list conversion
    • James Foster's avatar
    • Andreas Klebinger's avatar
      Add two CmmSwitch optimizations. · 348cc8eb
      Andreas Klebinger authored
      Move switch expressions into a local variable when generating switches.
      This avoids duplicating the expression if we translate the switch
      to a tree search. This fixes #16933.
      Further we now check if all branches of a switch have the same
      destination, replacing the switch with a direct branch if that
      is the case.
      Both of these patterns appear in the ENTER macro used by the RTS
      but are unlikely to occur in intermediate Cmm generated by GHC.
      Nofib result summary:
              Program           Size    Allocs   Runtime   Elapsed  TotalMem
                  Min          -0.0%     -0.0%    -15.7%    -15.6%      0.0%
                  Max          -0.0%      0.0%     +5.4%     +5.5%      0.0%
       Geometric Mean          -0.0%     -0.0%     -1.0%     -1.0%     -0.0%
      Compiler allocations go up slightly: +0.2%
      Example output before and after the change taken from RTS code below.
      All but one of the memory loads `I32[_c3::I64 - 8]` are eliminated.
      Instead the data is loaded once from memory in block c6.
      Also the switch in block `ud` in the original code has been
      eliminated completely.
      Cmm without this commit:
      stg_ap_0_fast() { //  [R1]
              { []
            ca: _c1::P64 = R1;   // CmmAssign
                goto c2;   // CmmBranch
            c2: if (_c1::P64 & 7 != 0) goto c4; else goto c6;
            c6: _c3::I64 = I64[_c1::P64];
                if (I32[_c3::I64 - 8] < 26 :: W32) goto ub; else goto ug;
            ub: if (I32[_c3::I64 - 8] < 15 :: W32) goto uc; else goto ue;
            uc: if (I32[_c3::I64 - 8] < 8 :: W32) goto c7; else goto ud;
            ud: switch [8 .. 14] (%MO_SS_Conv_W32_W64(I32[_c3::I64 - 8])) {
                    case 8, 9, 10, 11, 12, 13, 14 : goto c4;
            ue: if (I32[_c3::I64 - 8] >= 25 :: W32) goto c4; else goto uf;
            uf: if (%MO_SS_Conv_W32_W64(I32[_c3::I64 - 8]) != 23) goto c7; else goto c4;
            c4: R1 = _c1::P64;
                call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
            ug: if (I32[_c3::I64 - 8] < 28 :: W32) goto uh; else goto ui;
            uh: if (I32[_c3::I64 - 8] < 27 :: W32) goto c7; else goto c8;
            ui: if (I32[_c3::I64 - 8] < 29 :: W32) goto c8; else goto c7;
            c8: _c1::P64 = P64[_c1::P64 + 8];
                goto c2;
            c7: R1 = _c1::P64;
                call (_c3::I64)(R1) args: 8, res: 0, upd: 8;
      Cmm with this commit:
      stg_ap_0_fast() { //  [R1]
              { []
            ca: _c1::P64 = R1;
                goto c2;
            c2: if (_c1::P64 & 7 != 0) goto c4; else goto c6;
            c6: _c3::I64 = I64[_c1::P64];
                _ub::I64 = %MO_SS_Conv_W32_W64(I32[_c3::I64 - 8]);
                if (_ub::I64 < 26) goto uc; else goto uh;
            uc: if (_ub::I64 < 15) goto ud; else goto uf;
            ud: if (_ub::I64 < 8) goto c7; else goto c4;
            uf: if (_ub::I64 >= 25) goto c4; else goto ug;
            ug: if (_ub::I64 != 23) goto c7; else goto c4;
            c4: R1 = _c1::P64;
                call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
            uh: if (_ub::I64 < 28) goto ui; else goto uj;
            ui: if (_ub::I64 < 27) goto c7; else goto c8;
            uj: if (_ub::I64 < 29) goto c8; else goto c7;
            c8: _c1::P64 = P64[_c1::P64 + 8];
                goto c2;
            c7: R1 = _c1::P64;
                call (_c3::I64)(R1) args: 8, res: 0, upd: 8;
    • Alp Mestanogullari's avatar
      compiler: trace SysTools commands to emit start/stop eventlog markers · 688a1b89
      Alp Mestanogullari authored
      This patch was motivated by some performance characterization work done
      for #16822, where we suspected that GHC was spending a lot of time waiting
      on the linker to be done. (That turned out to be true.)
      The tracing is taken care of by ErrUtils.withTiming, so this patch just defines
      and uses a little wrapper around that function in all the helpers for
      calling the various systools (C compiler, linker, unlit, ...).
      With this patch, assuming a GHC executable linked against an eventlog-capable
      RTS (RTS ways that contain the debug, profiling or eventlog way units), we can
      measure how much time is spent in each of the SysTools when building hello.hs
      by simply doing:
        ghc hello.hs -ddump-timings +RTS -l
      The event names are "systool:{cc, linker, as, unlit, ...}".
    • Ashley Yakeley's avatar
  3. 12 Jul, 2019 2 commits
    • Shayne Fletcher's avatar
      Add shake 0.18.3 to extra deps · de3935a6
      Shayne Fletcher authored
    • Simon Peyton Jones's avatar
      Fix kind-checking for data/newtypes · e4c73514
      Simon Peyton Jones authored
      In one spot in kcConDecl we were passing in the return
      kind signature rether than the return kind. e.g. #16828
         newtype instance Foo :: Type -> Type where
           MkFoo :: a -> Foo a
      We were giving kcConDecl the kind (Type -> Type), whereas it
      was expecting the ultimate return kind, namely Type.
      This "looking past arrows" was being done, independently,
      in several places, but we'd missed one.  This patch moves it all
      to one place -- the new function kcConDecls (note the plural).
      I also took the opportunity to rename
        tcDataFamHeader  to   tcDataFamInstHeader
      (The previous name was consistently a source of confusion.)
  4. 11 Jul, 2019 6 commits
  5. 10 Jul, 2019 13 commits
    • Simon Peyton Jones's avatar
      Fix erroneous float in CoreOpt · d2e290d3
      Simon Peyton Jones authored
      The simple optimiser was making an invalid transformation
      to join points -- yikes.  The fix is easy.
      I also added some documentation about the fact that GHC uses
      a slightly more restrictive version of join points than does
      the paper.
      Fix #16918
    • Ben Gamari's avatar
      hadrian/doc: Add some discussion of compilation stages · a35e0916
      Ben Gamari authored
      This documents some of the lore surrounding the nature and naming of
      GHC's stage numbers.
    • Eric Wolf's avatar
      T16804: adjust src spans · 8fcc931c
      Eric Wolf authored
    • Eric Wolf's avatar
      Add testcase T16804 for #16804 · 85da17e5
      Eric Wolf authored
      slightly larger testcase for :type-at and :uses
      so we can see changes, if #16804 is done.
    • Ömer Sinan Ağacan's avatar
      Minor refactoring in CoreSimpl · 897a59a5
      Ömer Sinan Ağacan authored
      When `join_ids` is empty `extendVarSetList existing_joins join_ids` is
      already no-op, so no need to check whether `join_ids` is empty or not
      before extending the joins set.
    • Ömer Sinan Ağacan's avatar
      Testsuite tweaks and refactoring · d7423f10
      Ömer Sinan Ağacan authored
      - Rename requires_th to req_th for consistency with other req functions
        (e.g. req_interp, req_profiling etc.)
      - req_th (previously requires_th) now checks for interpreter (via
        req_interp). With this running TH tests are skipped when running the
        test suite with stage=1.
      - Test tweaks:
          - T9360a, T9360b: Use req_interp
          - recomp009, T13938, RAE_T32a: Use req_th
      - Fix check-makefiles linter: it now looks for Makefiles instead of .T
        files (which are actually Python files)
    • Alp Mestanogullari's avatar
      Hadrian: fix source-dist rule · 7f8bf98e
      Alp Mestanogullari authored
      The first problem was that the list of files/dirs to embed or ignore was not
      up-to-date. The second problem was that the 'Cwd' option used when running the
      Tar builder in the source-dist rule didn't actually change the current directory
      and was therefore failing. Finally, the source-dist rule did not pre-generate
      Haskell modules derived from .x (alex) and .y (happy) files, like the Make
      build system does -- this is now fixed.
      We might be doing too much work for that last step (we seem to be building
      many things until we get to generating the source distribution), but extracting
      the distribution and running
          ./configure && hadrian/build.sh --flavour=quickest -j
      from there does work for me now.
    • Alp Mestanogullari's avatar
      Hadrian: implement key-value settings for builder options · 18ac9ad4
      Alp Mestanogullari authored
      They take the general form `foo.bar.baz [+]= some values`, where
      `=` completely overrides the arguments for a builder and `+=` extends
      them. We currenly only support settings for updating the GHC and C
      compiler options, of the form:
        {stage0, ..., stage3 or *}.{package name or *}
                                  .ghc.{c, hs, link, deps, toolargs or *}.opts
        {stage0, ..., stage3 or *}.{package name or *}
                                  .cc.{c, deps or *}.opts
      The supported settings and their use is covered in the new section
      of `hadrian/doc/user-settings.md`, while the implementation is explained
      in a new Note [Hadrian settings].
      Most of the logic is implemented in a new module, `Settings.Parser`, which
      contains key-value assignment/extension parsers as well as utilities for
      specifying allowed settings at a high-level, generating a `Predicate` from
      such a description or generating the list of possible completions for a given
      The additions to the `Settings` module make use of this to describe the
      settings that Hadrian currently supports, and apply all such
      key-value settings (from the command line and `<root>/hadrian.settings`)
      to the flavour that Hadrian is going to proceed with.
      This new setting system comes with support for generating Bash completions,
      implemented in `hadrian/completion.sh` and Hadrian's `autocomplete` target:
      > source hadrian/completion.sh
      > hadrian/build.sh stage1.base.ghc.<TAB>
      stage1.base.ghc.c.opts     stage1.base.ghc.hs.opts
      stage1.base.ghc.*.opts     stage1.base.ghc.deps.opts
      stage1.base.ghc.link.opts  stage1.base.ghc.toolargs.opts
    • Ben Gamari's avatar
      testsuite: Fix #16818 · 42ff8653
      Ben Gamari authored
      Renames performance metrics to include whether they are compile-time or
      runtime metrics.
    • John Ericson's avatar
      Deduplicate "unique subdir" code between GHC and Cabal · 24782b89
      John Ericson authored
      The code, including the generated module with the version, is now in
      ghc-boot. Config.hs reexports stuff as needed, ghc-pkg doesn't need any
      tricks at all.
    • John Ericson's avatar
      Remove most uses of TARGET platform macros · 0472f0f6
      John Ericson authored
      These prevent multi-target builds. They were gotten rid of in 3 ways:
      1. In the compiler itself, replacing `#if` with runtime `if`. In these
      cases, we care about the target platform still, but the target platform
      is dynamic so we must delay the elimination to run time.
      2. In the compiler itself, replacing `TARGET` with `HOST`. There was
      just one bit of this, in some code splitting strings representing lists
      of paths. These paths are used by GHC itself, and not by the compiled
      binary. (They are compiler lookup paths, rather than RPATHS or something
      that does matter to the compiled binary, and thus would legitamentally
      be target-sensative.) As such, the path-splitting method only depends on
      where GHC runs and not where code it produces runs. This should have
      been `HOST` all along.
      3. Changing the RTS. The RTS doesn't care about the target platform,
      full stop.
      4. `includes/stg/HaskellMachRegs.h` This file is also included in the
      genapply executable. This is tricky because the RTS's host platform
      really is that utility's target platform. so that utility really really
      isn't multi-target either. But at least it isn't an installed part of
      GHC, but just a one-off tool when building the RTS. Lying with the
      `HOST` to a one-off program (genapply) that isn't installed doesn't seem so bad.
      It's certainly better than the other way around of lying to the RTS
      though not to genapply. The RTS is more important, and it is installed,
      *and* this header is installed as part of the RTS.
    • John Ericson's avatar
      Fix two more `#ifndef` for the linter · fb43bddc
      John Ericson authored
    • Phuong Trinh's avatar
      Fix #16511: changes in interface dependencies should trigger recompilation · b05c8423
      Phuong Trinh authored
      If the union of dependencies of imported modules change, the `mi_deps`
      field of the interface files should change as well. Because of that, we
      need to check for changes in this in recompilation checker which we are
      not doing right now. This adds a checks for that.
  6. 09 Jul, 2019 1 commit
    • Ryan Scott's avatar
      Use an empty data type in TTG extension constructors (#15247) · 6a03d77b
      Ryan Scott authored
      To avoid having to `panic` any time a TTG extension constructor is
      consumed, this MR introduces an uninhabited 'NoExtCon' type and uses
      that in every extension constructor's type family instance where it
      is appropriate. This also introduces a 'noExtCon' function which
      eliminates a 'NoExtCon', much like 'Data.Void.absurd' eliminates
      a 'Void'.
      I also renamed the existing `NoExt` type to `NoExtField` to better
      distinguish it from `NoExtCon`. Unsurprisingly, there is a lot of
      code churn resulting from this.
      Bumps the Haddock submodule. Fixes #15247.
  7. 08 Jul, 2019 2 commits
  8. 05 Jul, 2019 7 commits
    • Alex D's avatar
    • Ryan Scott's avatar
      More sensible SrcSpans for recursive pattern synonym errors (#16900) · 62b82135
      Ryan Scott authored
      Attach the `SrcSpan` of the first pattern synonym binding involved in
      the recursive group when throwing the corresponding error message,
      similarly to how it is done for type synonyms.
      Fixes #16900.
    • Artem Pelenitsyn's avatar
      Make all submodules have absolute URLs · a76b233d
      Artem Pelenitsyn authored
      The relative URLs were a workaround to let most contributors fork from
      Github due to a weakness in the haskell.org server.
      This workaround is no longer needed. And relative submodule URLs are
      an impediment to forking which makes contributions harder than they
      should be.
      The URLs are chosen to clone from https, because this makes sure that
      anybody, even not a registered Gitlab user, can clone a fork
    • Andreas Klebinger's avatar
      Dont gather ticks when only striping them in STG. · f002250a
      Andreas Klebinger authored
      Adds stripStgTicksTopE which only returns the stripped expression.
      So far we also allocated a list for the stripped ticks which was
      never used.
      Allocation difference is as expected very small but present.
      About 0.02% difference when compiling with -O.
    • Simon Peyton Jones's avatar
      Fix over-eager implication constraint discard · 80afdf6b
      Simon Peyton Jones authored
      Ticket #16247 showed that we were discarding an implication
      constraint that had empty ic_wanted, when we still needed to
      keep it so we could check whether it had a bad telescope.
      Happily it's a one line fix.  All the rest is comments!
    • Daniel Gröber (dxld)'s avatar
      rts: Fix -hT option with profiling rts · ed662901
      Daniel Gröber (dxld) authored
      In dumpCensus we switch/case on doHeapProfile twice. The second switch
      tries to barf on unknown doHeapProfile modes but HEAP_BY_CLOSURE_TYPE is
      checked by the first switch and not included in the second.
      So when trying to pass -hT to the profiling rts it barfs.
      This commit simply merges the two switches into one which fixes this
    • Simon Peyton Jones's avatar
      Add a missing zonk (fixes #16902) · 53aa59f3
      Simon Peyton Jones authored
      In the eager unifier, when unifying (tv1 ~ tv2),
      when we decide to swap them over, to unify (tv2 ~ tv1),
      I'd forgotten to ensure that tv1's kind was fully zonked,
      which is an invariant of uUnfilledTyVar2.
      That could lead us to build an infinite kind, or (in the
      case of #16902) update the same unification variable twice.
      Now we get an error message rather than non-termination,
      which is much better.  The error message is not great,
      but it's a very strange program, and I can't see an easy way
      to improve it, so for now I'm just committing this fix.
      Here's the decl
       data F (a :: k) :: (a ~~ k) => Type where
          MkF :: F a
      and the rather error message of which I am not proud
        T16902.hs:11:10: error:
          • Expected a type, but found something with kind ‘a1’
          • In the type ‘F a’