Skip to content
Snippets Groups Projects
  1. May 17, 2024
    • Ben Gamari's avatar
      Remove haddock submodule · 7eb9f184
      Ben Gamari authored
      In preparation for merge into the GHC, as proposed in #23178.
      7eb9f184
    • Andreas Klebinger's avatar
      TagAnalysis: Treat all bottom ids as tagged during analysis. · 0962b50d
      Andreas Klebinger authored and Marge Bot's avatar Marge Bot committed
      Ticket #24806 showed that we also need to treat dead end thunks as
      tagged during the analysis.
      0962b50d
    • jeffrey young's avatar
      testsuite: make find_so regex less general · 04179044
      jeffrey young authored and Marge Bot's avatar Marge Bot committed
      Closes #24759
      
      Background. In MR !12372 we began tracking shared object files and
      directories sizes for dependencies. However, this broke  release builds
      because release builds alter the filenames swapping "in-place" for a
      hash. This was not considered in the MR and thus broke release
      pipelines. Furthermore, the rts_so test was found to be wildly varying
      and was therefore disabled in !12561.
      
      This commit fixes both of these issues:
      
      - fix the rts_so test by making the regex less general, now the rts_so
      test and all other foo.so tests must match
      "libHS<some-lib>-<version>-<hash|'in-place>-<ghc>". This prevents the
      rts_so test from accidentally matching different rts variants such as
      rts_threaded, which was the cause of the wild swings after !12372.
      
      - add logic to match either a hash or the string in-place. This should
      make the find_so function build agnostic.
      04179044
    • Andreas Klebinger's avatar
      Ensure `tcHasFixedRuntimeRep (# #)` returns True. · 8927e0c3
      Andreas Klebinger authored and Marge Bot's avatar Marge Bot committed
      8927e0c3
    • Rodrigo Mesquita's avatar
      configure: Check C99-compat for Cmm preprocessor · 28b9cee0
      Rodrigo Mesquita authored and Marge Bot's avatar Marge Bot committed
      Fixes #24815
      28b9cee0
    • Cheng Shao's avatar
      rts: fix I/O manager compilation errors for win32 target · 710665bd
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      This patch fixes I/O manager compilation errors for win32 target
      discovered when cross-compiling to win32 using recent clang:
      
      ```
      rts/win32/ThrIOManager.c:117:7: error:
           error: call to undeclared function 'is_io_mng_native_p'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            117 |   if (is_io_mng_native_p ()) {
                |       ^
          |
      117 |   if (is_io_mng_native_p ()) {
          |       ^
      
      1 error generated.
      `x86_64-w64-mingw32-clang' failed in phase `C Compiler'. (Exit code: 1)
      
      rts/fs.c:143:28: error:
           error: a function declaration without a prototype is deprecated in all versions of C [-Werror,-Wstrict-prototypes]
            143 | int setErrNoFromWin32Error () {
                |                            ^
                |                             void
          |
      143 | int setErrNoFromWin32Error () {
          |                            ^
      
      1 error generated.
      `x86_64-w64-mingw32-clang' failed in phase `C Compiler'. (Exit code: 1)
      
      rts/win32/ConsoleHandler.c:227:9: error:
           error: call to undeclared function 'interruptIOManagerEvent'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            227 |         interruptIOManagerEvent ();
                |         ^
          |
      227 |         interruptIOManagerEvent ();
          |         ^
      
      rts/win32/ConsoleHandler.c:227:9: error:
           note: did you mean 'getIOManagerEvent'?
          |
      227 |         interruptIOManagerEvent ();
          |         ^
      
      rts/include/rts/IOInterface.h:27:10: error:
           note: 'getIOManagerEvent' declared here
             27 | void *   getIOManagerEvent  (void);
                |          ^
         |
      27 | void *   getIOManagerEvent  (void);
         |          ^
      
      1 error generated.
      `x86_64-w64-mingw32-clang' failed in phase `C Compiler'. (Exit code: 1)
      
      rts/win32/ConsoleHandler.c:196:9: error:
           error: call to undeclared function 'setThreadLabel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            196 |         setThreadLabel(cap, t, "signal handler thread");
                |         ^
          |
      196 |         setThreadLabel(cap, t, "signal handler thread");
          |         ^
      
      rts/win32/ConsoleHandler.c:196:9: error:
           note: did you mean 'postThreadLabel'?
          |
      196 |         setThreadLabel(cap, t, "signal handler thread");
          |         ^
      
      rts/eventlog/EventLog.h:118:6: error:
           note: 'postThreadLabel' declared here
            118 | void postThreadLabel(Capability    *cap,
                |      ^
          |
      118 | void postThreadLabel(Capability    *cap,
          |      ^
      
      1 error generated.
      `x86_64-w64-mingw32-clang' failed in phase `C Compiler'. (Exit code: 1)
      ```
      710665bd
    • Teo Camarasu's avatar
      rts: Allocate non-moving segments with megablocks · b38dcf39
      Teo Camarasu authored and Marge Bot's avatar Marge Bot committed
      Non-moving segments are 8 blocks long and need to be aligned.
      Previously we serviced allocations by grabbing 15 blocks, finding
      an aligned 8 block group in it and returning the rest.
      This proved to lead to high levels of fragmentation as a de-allocating a segment
      caused an 8 block gap to form, and this could not be reused for allocation.
      
      This patch introduces a segment allocator based around using entire
      megablocks to service segment allocations in bulk.
      
      When there are no free segments, we grab an entire megablock and fill it
      with aligned segments. As the megablock is free, we can easily guarantee
      alignment. Any unused segments are placed on a free list.
      
      It only makes sense to free segments in bulk when all of the segments in
      a megablock are freeable. After sweeping, we grab the free list, sort it,
      and find all groups of segments where they cover the megablock and free
      them.
      This introduces a period of time when free segments are not available to
      the mutator, but the risk that this would lead to excessive allocation
      is low. Right after sweep, we should have an abundance of partially full
      segments, and this pruning step is relatively quick.
      
      In implementing this we drop the logic that kept NONMOVING_MAX_FREE
      segments on the free list.
      
      We also introduce an eventlog event to log the amount of pruned/retained
      free segments.
      
      See Note [Segment allocation strategy]
      
      Resolves #24150
      
      -------------------------
      Metric Decrease:
          T13253
          T19695
      -------------------------
      b38dcf39
    • Cheng Shao's avatar
      rts: do not prefetch mark_closure bdescr in non-moving gc when ASSERTS_ENABLED · 886ab43a
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      This commit fixes a small an oversight in !12148: the prefetch logic
      in non-moving GC may trap in debug RTS because it calls Bdescr() for
      mark_closure which may be a static one. It's fine in non-debug RTS
      because even invalid bdescr addresses are prefetched, they will not
      cause segfaults, so this commit implements the most straightforward
      fix: don't prefetch mark_closure bdescr when assertions are enabled.
      886ab43a
  2. May 16, 2024
  3. May 15, 2024
    • Matthew Farkas-Dyck's avatar
      TTG: ApplicativeStatement exist only in Rn and Tc · 639d742b
      Matthew Farkas-Dyck authored and Marge Bot's avatar Marge Bot committed
      
      Co-Authored-By: default avatarromes <rodrigo.m.mesquita@gmail.com>
      639d742b
    • Matthew Pickering's avatar
      Introduce regression tests for `.hi` file sizes · 1e63a6fb
      Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
      Add regression tests to track how `-fwrite-if-compression` levels affect
      the size of `.hi` files.
      1e63a6fb
    • Hannes Siebenhandl's avatar
      Add run-time configurability of `.hi` file compression · 36aa7cf1
      Hannes Siebenhandl authored and Marge Bot's avatar Marge Bot committed
      Introduce the flag `-fwrite-if-compression=<n>` which allows to
      configure the compression level of writing .hi files.
      
      The motivation is that some deduplication operations are too expensive
      for the average use case. Hence, we introduce multiple compression
      levels with variable impact on performance, but still reduce the
      memory residency and `.hi` file size on disk considerably.
      
      We introduce three compression levels:
      
      * `1`: `Normal` mode. This is the least amount of compression.
          It deduplicates only `Name` and `FastString`s, and is naturally the
          fastest compression mode.
      * `2`: `Safe` mode. It has a noticeable impact on .hi file size and is
        marginally slower than `Normal` mode. In general, it should be safe to
        always use `Safe` mode.
      * `3`: `Full` deduplication mode. Deduplicate as much as we can,
        resulting in minimal .hi files, but at the cost of additional
        compilation time.
      
      Reading .hi files doesn't need to know the initial compression level,
      and can always deserialise a `ModIface`, as we write out a byte that
      indicates the next value has been deduplicated.
      This allows users to experiment with different compression levels for
      packages, without recompilation of dependencies.
      
      Note, the deduplication also has an additional side effect of reduced
      memory consumption to implicit sharing of deduplicated elements.
      See ghc/ghc#24540 for example where
      that matters.
      
      -------------------------
      Metric Decrease:
          MultiLayerModulesDefsGhciWithCore
          T16875
          T21839c
          T24471
          hard_hole_fits
          libdir
      -------------------------
      36aa7cf1
    • Hannes Siebenhandl's avatar
      Add deduplication table for `IfaceType` · 2fcc09fd
      Hannes Siebenhandl authored and Marge Bot's avatar Marge Bot committed
      The type `IfaceType` is a highly redundant, tree-like data structure.
      While benchmarking, we realised that the high redundancy of `IfaceType`
      causes high memory consumption in GHCi sessions when byte code is
      embedded into the `.hi` file via `-fwrite-if-simplified-core` or
      `-fbyte-code-and-object-code`.
      Loading such `.hi` files from disk introduces many duplicates of
      memory expensive values in `IfaceType`, such as `IfaceTyCon`,
      `IfaceTyConApp`, `IA_Arg` and many more.
      
      We improve the memory behaviour of GHCi by adding an additional
      deduplication table for `IfaceType` to the serialisation of `ModIface`,
      similar to how we deduplicate `Name`s and `FastString`s.
      When reading the interface file back, the table allows us to automatically
      share identical values of `IfaceType`.
      
      To provide some numbers, we evaluated this patch on the agda code base.
      We loaded the full library from the `.hi` files, which contained the
      embedded core expressions (`-fwrite-if-simplified-core`).
      
      Before this patch:
      
      * Load time: 11.7 s, 2.5 GB maximum residency.
      
      After this patch:
      
      * Load time:  7.3 s, 1.7 GB maximum residency.
      
      This deduplication has the beneficial side effect to additionally reduce
      the size of the on-disk interface files tremendously.
      
      For example, on agda, we reduce the size of `.hi` files (with
      `-fwrite-if-simplified-core`):
      
      * Before: 101 MB on disk
      * Now:     24 MB on disk
      
      This has even a beneficial side effect on the cabal store. We reduce the
      size of the store on disk:
      
      * Before: 341 MB on disk
      * Now:    310 MB on disk
      
      Note, none of the dependencies have been compiled with
      `-fwrite-if-simplified-core`, but `IfaceType` occurs in multiple
      locations in a `ModIface`.
      
      We also add IfaceType deduplication table to .hie serialisation and
      refactor .hie file serialisation to use the same infrastrucutre as
      `putWithTables`.
      
      Bump haddock submodule to accomodate for changes to the deduplication
      table layout and binary interface.
      2fcc09fd
    • Hannes Siebenhandl's avatar
      Move out LiteralMap to avoid cyclic module dependencies · d368f9a6
      Hannes Siebenhandl authored and Marge Bot's avatar Marge Bot committed
      d368f9a6
    • Hannes Siebenhandl's avatar
      Add Eq and Ord instance to `IfaceType` · b2227487
      Hannes Siebenhandl authored and Marge Bot's avatar Marge Bot committed
      We add an `Ord` instance so that we can store `IfaceType` in a
      `Data.Map` container.
      This is required to deduplicate `IfaceType` while writing `.hi` files to
      disk. Deduplication has many beneficial consequences to both file size
      and memory usage, as the deduplication enables implicit sharing of
      values.
      See issue #24540 for more motivation.
      
      The `Ord` instance would be unnecessary if we used a `TrieMap` instead
      of `Data.Map` for the deduplication process. While in theory this is
      clerarly the better option, experiments on the agda code base showed
      that a `TrieMap` implementation has worse run-time performance
      characteristics.
      
      To the change itself, we mostly derive `Eq` and `Ord`. This requires us
      to change occurrences of `FastString` with `LexicalFastString`, since
      `FastString` has no `Ord` instance.
      We change the definition of `IfLclName` to a newtype of
      `LexicalFastString`, to make such changes in the future easier.
      
      Bump haddock submodule for IfLclName changes
      b2227487
    • Cheng Shao's avatar
      testsuite: bump PartialDownSweep timeout to 5x on wasm32 · b1e0c313
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      b1e0c313
    • Andreas Klebinger's avatar
      Expand the `inline` rule to look through casts/ticks. · a593f284
      Andreas Klebinger authored and Marge Bot's avatar Marge Bot committed
      Fixes #24808
      a593f284
  4. May 14, 2024
    • Cheng Shao's avatar
      linters: fix lint-whitespace compilation with ghc-9.10.1 · ad38e954
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      ad38e954
    • Cheng Shao's avatar
      hadrian: fix hadrian building with ghc-9.10.1 · be514bb4
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      be514bb4
    • Andrei Borzenkov's avatar
      Improve pattern to type pattern transformation (23739) · 2c0f8ddb
      Andrei Borzenkov authored and Marge Bot's avatar Marge Bot committed
      `pat_to_type_pat` function now can handle more patterns:
        - TuplePat
        - ListPat
        - LitPat
        - NPat
        - ConPat
      
      Allowing these new constructors in type patterns significantly
      increases possible shapes of type patterns without `type` keyword.
      
      This patch also changes how lookups in `lookupOccRnConstr` are
      performed, because we need to fall back into
      types when we didn't find a constructor on data level to perform
      `ConPat` to type transformation properly.
      2c0f8ddb
    • Hannes Siebenhandl's avatar
      Add perf regression test for `-fwrite-if-simplified-core` · d65bf4a2
      Hannes Siebenhandl authored and Marge Bot's avatar Marge Bot committed
      d65bf4a2
    • Zubin's avatar
      Don't store a GlobalRdrEnv in `mi_globals` for GHCi. · c5d89412
      Zubin authored and Marge Bot's avatar Marge Bot committed
      GHCi only needs the `mi_globals` field for modules imported with
      :module +*SomeModule.
      
      It uses this field to make the top level environment in `SomeModule` available
      to the repl.
      
      By default, only the first target in the command line parameters is
      "star" loaded into GHCi. Other modules have to be manually "star" loaded
      into the repl.
      
      Storing the top level GlobalRdrEnv for each module is very wasteful, especially
      given that we will most likely never need most of these environments.
      
      Instead we store only the information needed to reconstruct the top level environment
      in a module, which is the `IfaceTopEnv` data structure, consisting of all import statements
      as well as all top level symbols defined in the module (not taking export lists into account)
      
      When a particular module is "star-loaded" into GHCi (as the first commandline target, or via
      an explicit `:module +*SomeModule`, we reconstruct the top level environment on demand using
      the `IfaceTopEnv`.
      c5d89412
  5. May 12, 2024
  6. May 11, 2024
    • Matthew Pickering's avatar
      Revert "ghcup-metadata: Drop output_name field" · 1012e8aa
      Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
      This reverts commit ecbf22a6.
      
      This breaks the ghcup metadata generation on the nightly jobs.
      1012e8aa
    • Jade's avatar
      Improve performance of Data.List.sort(By) · fc2d6de1
      Jade authored and Marge Bot's avatar Marge Bot committed
      This patch improves the algorithm to sort lists in base.
      It does so using two strategies:
      
      1) Use a four-way-merge instead of the 'default' two-way-merge.
      This is able to save comparisons and allocations.
      
      2) Use `(>) a b` over `compare a b == GT` and allow inlining and specialization.
      This mainly benefits types with a fast (>).
      
      Note that this *may* break instances with a *malformed* Ord instance
      where `a > b` is *not* equal to `compare a b == GT`.
      
      CLC proposal: https://github.com/haskell/core-libraries-committee/issues/236
      
      Fixes #24280
      
      -------------------------
      Metric Decrease:
          MultiLayerModulesTH_Make
          T10421
          T13719
          T15164
          T18698a
          T18698b
          T1969
          T9872a
          T9961
          T18730
          WWRec
          T12425
          T15703
      -------------------------
      fc2d6de1
  7. May 10, 2024
    • Cheng Shao's avatar
      ghc-heap: fix typo in ghc-heap cbits · 2b1af08b
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      2b1af08b
    • Rodrigo Mesquita's avatar
      Rename pre-processor invocation args · c2b33fc9
      Rodrigo Mesquita authored and Marge Bot's avatar Marge Bot committed
      Small clean up. Uses proper names for the various groups of arguments
      that make up the pre-processor invocation.
      c2b33fc9
    • Cheng Shao's avatar
      testsuite: fix testwsdeque with recent clang · a9979f55
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      This patch fixes compilation of testwsdeque.c with recent versions of
      clang, which will fail with the error below:
      
      ```
      testwsdeque.c:95:33: error:
           warning: format specifies type 'long' but the argument has type 'void *' [-Wformat]
             95 |         barf("FAIL: %ld %d %d", p, n, val);
                |                     ~~~         ^
      
      testwsdeque.c:95:39: error:
           warning: format specifies type 'int' but the argument has type 'StgWord' (aka 'unsigned long') [-Wformat]
             95 |         barf("FAIL: %ld %d %d", p, n, val);
                |                            ~~         ^~~
                |                            %lu
      
      testwsdeque.c:133:42: error:
           error: incompatible function pointer types passing 'void (void *)' to parameter of type 'OSThreadProc *' (aka 'void *(*)(void *)') [-Wincompatible-function-pointer-types]
            133 |         createOSThread(&ids[n], "thief", thief, (void*)(StgWord)n);
                |                                          ^~~~~
      
      /workspace/ghc/_build/stage1/lib/../lib/x86_64-linux-ghc-9.11.20240502/rts-1.0.2/include/rts/OSThreads.h:193:51: error:
           note: passing argument to parameter 'startProc' here
            193 |                                     OSThreadProc *startProc, void *param);
                |                                                   ^
      
      2 warnings and 1 error generated.
      ```
      a9979f55
    • Ben Gamari's avatar
      IPE: Eliminate dependency on Read · ab840ce6
      Ben Gamari authored and Marge Bot's avatar Marge Bot committed
      Instead of encoding the closure type as decimal string we now simply
      represent it as an integer, eliminating the need for `Read` in
      `GHC.Internal.InfoProv.Types.peekInfoProv`.
      
      Closes #24504.
      
      -------------------------
      Metric Decrease:
          T24602_perf_size
          size_hello_artifact
      -------------------------
      ab840ce6
    • Zejun Wu's avatar
      Make renamer to be more flexible with parens in the LHS of the rules · 4d3acbcf
      Zejun Wu authored and Marge Bot's avatar Marge Bot committed
      We used to reject LHS like `(f a) b` in RULES and requires it to be written as
      `f a b`. It will be handy to allow both as the expression may be more
      readable with extra parens in some cases when infix operator is involved.
      Espceially when TemplateHaskell is used, extra parens may be added out of
      user's control and result in "valid" rules being rejected and there
      are not always ways to workaround it.
      
      Fixes #24621
      4d3acbcf
    • Rodrigo Mesquita's avatar
      Document NcgImpl methods · b2682534
      Rodrigo Mesquita authored and Marge Bot's avatar Marge Bot committed
      Fixes #19914
      b2682534
  8. May 08, 2024
Loading