Alan Zimmerman pushed to branch wip/az/epa-tidy-locatedxxx-22 at Glasgow Haskell Compiler / GHC
Commits:
-
4bfbf5c8
by ARATA Mizuki at 2026-09-01T18:55:08-04:00
-
3f9db6d4
by ARATA Mizuki at 2026-09-01T18:55:08-04:00
-
44d7788f
by Simon Peyton Jones at 2026-09-01T18:55:53-04:00
-
df058f1d
by Simon Jakobi at 2026-09-02T07:18:06-04:00
-
72dd2432
by Simon Jakobi at 2026-09-02T07:18:06-04:00
-
2228cb30
by Simon Jakobi at 2026-09-02T07:18:06-04:00
-
56291fc5
by Cheng Shao at 2026-09-02T07:18:45-04:00
-
20eb3f41
by Cheng Shao at 2026-09-02T07:18:45-04:00
-
6af3089f
by Alan Zimmerman at 2026-09-02T18:17:56+01:00
22 changed files:
- + changelog.d/T27744
- + changelog.d/llvm-23
- compiler/GHC/Hs/Doc.hs
- compiler/GHC/Hs/Extension/Pass.hs
- compiler/GHC/Tc/TyCl/PatSyn.hs
- configure.ac
- libraries/base/tests/all.T
- rts/ProfHeap.c
- rts/eventlog/EventLog.c
- rts/prim/atomic.c
- testsuite/driver/README.md
- testsuite/driver/testlib.py
- testsuite/tests/ffi/should_run/T21305.hs
- + testsuite/tests/patsyn/should_compile/T27744.hs
- testsuite/tests/patsyn/should_compile/all.T
- testsuite/tests/perf/compiler/all.T
- testsuite/tests/perf/compiler/large-project/all.T
- testsuite/tests/perf/should_run/T3586.hs
- testsuite/tests/perf/should_run/T3586.stdout
- testsuite/tests/perf/space_leaks/all.T
- utils/check-exact/ExactPrint.hs
- utils/ghc-toolchain/src/GHC/Toolchain/Program.hs
Changes:
| 1 | +section: compiler
|
|
| 2 | +synopsis: Fixes a bug in arity computation for INLINE pattern synonyms, which led to a compiler crash
|
|
| 3 | +issues: #27744
|
|
| 4 | +mrs: !16602 |
| 1 | +section: llvm-backend
|
|
| 2 | +synopsis: Bump LlvmMaxVersion to support LLVM 23.x releases.
|
|
| 3 | +issues: #27764
|
|
| 4 | +mrs: !16617 |
| ... | ... | @@ -58,6 +58,7 @@ import Language.Haskell.Syntax.Doc |
| 58 | 58 | import Language.Haskell.Syntax.Extension
|
| 59 | 59 | import Language.Haskell.Syntax.Module.Name
|
| 60 | 60 | |
| 61 | +-- Exact print annotations ignore LHsDoc, so bare SrcSpan is fine
|
|
| 61 | 62 | type instance Anno (WithHsDocIdentifiers (HsDocString (GhcPass pass)) (GhcPass pass)) = SrcSpan
|
| 62 | 63 | |
| 63 | 64 | deriving instance (Data pass, Data (LIdP pass), Data a) => Data (WithHsDocIdentifiers a pass)
|
| ... | ... | @@ -46,6 +46,7 @@ type instance XRec (GhcPass p) a = XRecGhc a |
| 46 | 46 | -- but pass-independent, source location
|
| 47 | 47 | type XRecGhc a = GenLocated (Anno a) a
|
| 48 | 48 | |
| 49 | +-- Exact print annotations ignore LHsDoc, so bare SrcSpan is fine
|
|
| 49 | 50 | type instance Anno (HsDocString (GhcPass _)) = SrcSpan
|
| 50 | 51 | type instance Anno HsDocStringChunk = SrcSpan
|
| 51 | 52 |
| ... | ... | @@ -875,8 +875,9 @@ tcPatSynMatcher (L loc ps_name) lpat prag_fn |
| 875 | 875 | mg = MG{ mg_alts = L (l2l $ getLoc match) [match]
|
| 876 | 876 | , mg_ext = MatchGroupTc [] res_ty gen
|
| 877 | 877 | }
|
| 878 | - matcher_arity = length req_theta + 3
|
|
| 879 | - -- See Note [Pragmas for pattern synonyms]
|
|
| 878 | + |
|
| 879 | + matcher_arity :: VisArity -- VisArity excludes dictionary arguments!
|
|
| 880 | + matcher_arity = 3 -- See Note [Pragmas for pattern synonyms]
|
|
| 880 | 881 | |
| 881 | 882 | -- Add INLINE pragmas; see Note [Pragmas for pattern synonyms]
|
| 882 | 883 | -- NB: prag_fn is keyed by the PatSyn Name, not the (internal) matcher name
|
| ... | ... | @@ -967,9 +968,8 @@ tcPatSynBuilderBind prag_fn (PSB { psb_id = ps_lname@(L loc ps_name) |
| 967 | 968 | let builder_id = mkExportedVanillaId builder_name builder_ty
|
| 968 | 969 | -- See Note [Exported LocalIds] in GHC.Types.Id
|
| 969 | 970 | |
| 970 | - (_, req_theta, _, prov_theta, arg_tys, _) = patSynSigBndr patsyn
|
|
| 971 | - builder_arity = length req_theta + length prov_theta
|
|
| 972 | - + length arg_tys
|
|
| 971 | + builder_arity :: VisArity -- VisArity excludes dictionary arguments!
|
|
| 972 | + builder_arity = length (patSynArgs patsyn)
|
|
| 973 | 973 | + (if need_dummy_arg then 1 else 0)
|
| 974 | 974 | |
| 975 | 975 | -- Add INLINE pragmas; see Note [Pragmas for pattern synonyms]
|
| ... | ... | @@ -1348,13 +1348,20 @@ entire pattern synonym is supported. For example: |
| 1348 | 1348 | When no pragma is provided for a pattern, the inlining decision might change
|
| 1349 | 1349 | between different versions of GHC.
|
| 1350 | 1350 | |
| 1351 | -Implementation notes. The prag_fn passed in to tcPatSynDecl will have a binding
|
|
| 1352 | -for the /pattern synonym/ Name, thus
|
|
| 1353 | - InlinedPattern :-> INLINE
|
|
| 1354 | -From this we cook up an INLINE pragma for the matcher (in tcPatSynMatcher)
|
|
| 1355 | -and builder (in tcPatSynBuilderBind), by looking up the /pattern synonym/
|
|
| 1356 | -Name in the prag_fn, and then using addInlinePragArity to add the right
|
|
| 1357 | -inl_sat field to that INLINE pragma for the matcher or builder respectively.
|
|
| 1351 | +Implementation notes.
|
|
| 1352 | + |
|
| 1353 | +* The prag_fn passed in to tcPatSynDecl will have a binding
|
|
| 1354 | + for the /pattern synonym/ Name, thus
|
|
| 1355 | + InlinedPattern :-> INLINE
|
|
| 1356 | + From this we cook up an INLINE pragma for the matcher (in tcPatSynMatcher)
|
|
| 1357 | + and builder (in tcPatSynBuilderBind), by looking up the /pattern synonym/
|
|
| 1358 | + Name in the prag_fn, and then using `addInlinePragArity` to add the right
|
|
| 1359 | + inl_sat field to that INLINE pragma for the matcher or builder respectively.
|
|
| 1360 | + |
|
| 1361 | +* Note that the arity passed to `addInlinePragArity` is the `VisArity`, the /visible/
|
|
| 1362 | + arity. That specifically /excludes/ dictionary arguments, which are dealt with
|
|
| 1363 | + later by `GHC.HsToCore.Binds.makeCorePair`. The builder and matcher have no Required
|
|
| 1364 | + type args, so we don't need to worry about them in the `VisArity`.
|
|
| 1358 | 1365 | -}
|
| 1359 | 1366 | |
| 1360 | 1367 |
| ... | ... | @@ -557,7 +557,7 @@ AC_SUBST(InstallNameToolCmd) |
| 557 | 557 | # versions of LLVM simultaneously, but that stopped working around
|
| 558 | 558 | # 3.5/3.6 release of LLVM.
|
| 559 | 559 | LlvmMinVersion=13 # inclusive
|
| 560 | -LlvmMaxVersion=23 # not inclusive
|
|
| 560 | +LlvmMaxVersion=24 # not inclusive
|
|
| 561 | 561 | AC_SUBST([LlvmMinVersion])
|
| 562 | 562 | AC_SUBST([LlvmMaxVersion])
|
| 563 | 563 |
| ... | ... | @@ -243,7 +243,7 @@ test('T8684', expect_broken(8684), compile_and_run, ['']) |
| 243 | 243 | test('hWaitForInput-accurate-stdin', [js_broken(22349), expect_broken_for(16535, threaded_ways), req_process], compile_and_run, [''])
|
| 244 | 244 | test('T9826',normal, compile_and_run,[''])
|
| 245 | 245 | test('T9848',
|
| 246 | - [ collect_stats('bytes allocated')
|
|
| 246 | + [ collect_stats('bytes allocated', 2)
|
|
| 247 | 247 | , only_ways(['normal'])
|
| 248 | 248 | , js_broken(22261)
|
| 249 | 249 | ],
|
| ... | ... | @@ -141,7 +141,10 @@ restore_locale( void ) |
| 141 | 141 | * store only up to (max_era - 1) as its creation or last use time.
|
| 142 | 142 | * -------------------------------------------------------------------------- */
|
| 143 | 143 | unsigned int era;
|
| 144 | + |
|
| 145 | +#if defined(PROFILING)
|
|
| 144 | 146 | static uint32_t max_era;
|
| 147 | +#endif
|
|
| 145 | 148 | |
| 146 | 149 | StgWord user_era;
|
| 147 | 150 | |
| ... | ... | @@ -518,8 +521,10 @@ initHeapProfiling(void) |
| 518 | 521 | n_censuses = 1;
|
| 519 | 522 | }
|
| 520 | 523 | |
| 524 | +#if defined(PROFILING)
|
|
| 521 | 525 | // max_era = 2^LDV_SHIFT
|
| 522 | 526 | max_era = 1 << LDV_SHIFT;
|
| 527 | +#endif
|
|
| 523 | 528 | |
| 524 | 529 | censuses = stgMallocBytes(sizeof(Census) * n_censuses, "initHeapProfiling");
|
| 525 | 530 |
| ... | ... | @@ -113,8 +113,6 @@ static eventlog_init_func_t *eventlog_header_funcs = NULL; |
| 113 | 113 | // See Note [Maximum event length]
|
| 114 | 114 | #define EVENT_LOG_SIZE 2 * (1024 * 1024) // 2MB
|
| 115 | 115 | |
| 116 | -static int flushCount = 0;
|
|
| 117 | - |
|
| 118 | 116 | // Struct for record keeping of buffer to store event types and events.
|
| 119 | 117 | //
|
| 120 | 118 | // Invariant: The event buffer will always begin with a block-start marker.
|
| ... | ... | @@ -1514,7 +1512,6 @@ void printAndClearEventBuf (EventsBuf *ebuf) |
| 1514 | 1512 | }
|
| 1515 | 1513 | |
| 1516 | 1514 | resetEventsBuf(ebuf);
|
| 1517 | - flushCount++;
|
|
| 1518 | 1515 | |
| 1519 | 1516 | postBlockMarker(ebuf);
|
| 1520 | 1517 | }
|
| ... | ... | @@ -96,8 +96,6 @@ StgWord64 hs_atomic_nand64(StgWord x, StgWord64 val) |
| 96 | 96 | return __atomic_fetch_nand((volatile StgWord64 *) x, val, __ATOMIC_SEQ_CST);
|
| 97 | 97 | }
|
| 98 | 98 | |
| 99 | -#pragma GCC diagnostic pop
|
|
| 100 | - |
|
| 101 | 99 | // FetchOrByteArrayOp_Int
|
| 102 | 100 | |
| 103 | 101 | StgWord hs_atomic_or8(StgWord x, StgWord val)
|
| ... | ... | @@ -35,11 +35,13 @@ differences, and things such as that are not necessary to be considered by the |
| 35 | 35 | test writer anymore. This is due to the fact that the test comparison relies
|
| 36 | 36 | entirely on locally collected metrics on the testing machine.
|
| 37 | 37 | |
| 38 | -As such, it is perfectly sufficient to write `collect_stats('all',20)` in the
|
|
| 39 | -".T" files to measure the 3 potential stats that can be collected for that test
|
|
| 40 | -and automatically test them for regressions, failing if there is more than a 20%
|
|
| 41 | -change in any direction. In fact, even that is not necessary as
|
|
| 42 | -`collect_stats()` defaults to 'all', and 20% deviation allowed.
|
|
| 38 | +A test states which metric to measure and how much deviation to allow, e.g.
|
|
| 39 | +`collect_stats('bytes allocated', 2)` in the ".T" files. Such a test fails if
|
|
| 40 | +the metric changes by more than 2% in either direction. To gate several metrics,
|
|
| 41 | +use one `collect_stats` call per metric, so that each gets a tolerance matched
|
|
| 42 | +to its noise profile: allocations are nearly deterministic and support tight
|
|
| 43 | +windows, while the residency metrics need considerably slacker ones (see
|
|
| 44 | +Note [Measuring residency] in testlib.py).
|
|
| 43 | 45 | |
| 44 | 46 | The function `collect_compiler_stats()` is completely equivalent in every way to
|
| 45 | 47 | `collect_stats` except that it measures the performance of the compiler itself
|
| ... | ... | @@ -24,7 +24,7 @@ import subprocess |
| 24 | 24 | from testglobals import config, ghc_env, default_testopts, brokens, t, \
|
| 25 | 25 | TestRun, TestResult, TestOptions, PerfMetric
|
| 26 | 26 | from testutil import strip_quotes, lndir, link_or_copy_file, passed, \
|
| 27 | - failBecause, testing_metrics, residency_testing_metrics, \
|
|
| 27 | + failBecause, residency_testing_metrics, \
|
|
| 28 | 28 | stable_perf_counters, \
|
| 29 | 29 | PassFail, badResult, str_warn, str_removeprefix
|
| 30 | 30 | from term_color import Color, colored_if
|
| ... | ... | @@ -816,28 +816,20 @@ def _collect_generic_stat(name : TestName, opts, metric_infos): |
| 816 | 816 | |
| 817 | 817 | # -----
|
| 818 | 818 | |
| 819 | -# Defaults to "test everything, and only break on extreme cases"
|
|
| 820 | -#
|
|
| 821 | -# The inputs to this function are slightly interesting:
|
|
| 822 | -# metric can be either:
|
|
| 823 | -# - 'all', in which case all 3 possible metrics are collected and compared.
|
|
| 824 | -# - The specific metric one wants to use in the test.
|
|
| 825 | -# - A set of the metrics one wants to use in the test.
|
|
| 826 | -#
|
|
| 827 | -# Deviation defaults to 20% because the goal is correctness over performance.
|
|
| 828 | -# The testsuite should avoid breaking when there is not an actual error.
|
|
| 829 | -# Instead, the testsuite should notify of regressions in a non-breaking manner.
|
|
| 819 | +# metric is either a single metric name or a set of metric names. Use one
|
|
| 820 | +# call per metric so each gets a tolerance matched to its noise profile.
|
|
| 821 | +# See Note [Measuring residency] for the residency metrics.
|
|
| 830 | 822 | #
|
| 831 | 823 | # collect_compiler_stats is used when the metrics collected are about the compiler.
|
| 832 | 824 | # collect_stats is used in the majority case when the metrics to be collected
|
| 833 | 825 | # are about the performance of the runtime code generated by the compiler.
|
| 834 | -def collect_compiler_stats(metric='all',deviation=20):
|
|
| 826 | +def collect_compiler_stats(metric, deviation):
|
|
| 835 | 827 | def f(name, opts, m=metric, d=deviation):
|
| 836 | 828 | no_lint(name, opts)
|
| 837 | 829 | return _collect_stats(name, opts, m, d, None, True)
|
| 838 | 830 | return f
|
| 839 | 831 | |
| 840 | -def collect_stats(metric='all', deviation=20, static_stats_file=None):
|
|
| 832 | +def collect_stats(metric, deviation, static_stats_file=None):
|
|
| 841 | 833 | return lambda name, opts, m=metric, d=deviation, s=static_stats_file: _collect_stats(name, opts, m, d, s)
|
| 842 | 834 | |
| 843 | 835 | def statsFile(comp_test: bool, name: str) -> str:
|
| ... | ... | @@ -864,12 +856,9 @@ def _collect_stats(name: TestName, opts, metrics, deviation: Optional[int], |
| 864 | 856 | # This is a bit weird, though.
|
| 865 | 857 | return
|
| 866 | 858 | |
| 867 | - # Normalize metrics to a list of strings.
|
|
| 859 | + # Normalize metrics to a set of strings.
|
|
| 868 | 860 | if isinstance(metrics, str):
|
| 869 | - if metrics == 'all':
|
|
| 870 | - metrics = testing_metrics()
|
|
| 871 | - else:
|
|
| 872 | - metrics = { metrics }
|
|
| 861 | + metrics = { metrics }
|
|
| 873 | 862 | |
| 874 | 863 | opts.is_stats_test = True
|
| 875 | 864 | if is_compiler_stats_test:
|
| ... | ... | @@ -45,4 +45,4 @@ writeByteArray# :: MutableByteArray# RealWorld |
| 45 | 45 | writeByteArray# _ _ [] s = s
|
| 46 | 46 | writeByteArray# mba off (I64# i:is) s =
|
| 47 | 47 | case writeInt64Array# mba off i s of
|
| 48 | - s' -> writeByteArray# mba (off +# 8#) is s' |
|
| 48 | + s' -> writeByteArray# mba (off +# 1#) is s' |
| 1 | +{-# LANGUAGE CPP #-}
|
|
| 2 | + |
|
| 3 | +{-# LANGUAGE BangPatterns #-}
|
|
| 4 | +{-# LANGUAGE GADTs #-}
|
|
| 5 | +{-# LANGUAGE PolyKinds #-}
|
|
| 6 | +{-# LANGUAGE ScopedTypeVariables #-}
|
|
| 7 | +{-# LANGUAGE TypeOperators #-}
|
|
| 8 | +{-# LANGUAGE PatternSynonyms #-}
|
|
| 9 | +{-# LANGUAGE RoleAnnotations #-}
|
|
| 10 | +{-# LANGUAGE StandaloneKindSignatures #-}
|
|
| 11 | +{-# LANGUAGE ViewPatterns #-}
|
|
| 12 | + |
|
| 13 | +-- | A facility for faking GADTs that work sufficiently similarly
|
|
| 14 | +-- to unary natural numbers.
|
|
| 15 | +module T27744
|
|
| 16 | + ( Nattish (Zeroy, Succy)
|
|
| 17 | + )
|
|
| 18 | + where
|
|
| 19 | +import Unsafe.Coerce (unsafeCoerce)
|
|
| 20 | +import Data.Kind (Type)
|
|
| 21 | + |
|
| 22 | +type Nattish :: forall k. k -> (k -> k) -> k -> Type
|
|
| 23 | +newtype Nattish zero succ n = Nattish Word
|
|
| 24 | +type role Nattish nominal nominal nominal
|
|
| 25 | + |
|
| 26 | +data Res zero succ n where
|
|
| 27 | + ResZero :: Res zero succ zero
|
|
| 28 | + ResSucc :: !(Nattish zero succ n) -> Res zero succ (succ n)
|
|
| 29 | + |
|
| 30 | +check :: Nattish zero succ n -> Res zero succ n
|
|
| 31 | +check (Nattish 0) = unsafeCoerce ResZero
|
|
| 32 | +check (Nattish n) = unsafeCoerce $ ResSucc (Nattish (n - 1))
|
|
| 33 | + |
|
| 34 | +pattern Zeroy :: forall {k} zero succ (n :: k). () => n ~ zero => Nattish zero succ n
|
|
| 35 | +pattern Zeroy <- (check -> ResZero)
|
|
| 36 | + where
|
|
| 37 | + Zeroy = Nattish 0
|
|
| 38 | +{-# INLINE Zeroy #-}
|
|
| 39 | + |
|
| 40 | +pattern Succy :: forall {k} zero succ (n :: k). () => forall (n' :: k). n ~ succ n' => Nattish zero succ n' -> Nattish zero succ n
|
|
| 41 | +pattern Succy n <- (check -> ResSucc n)
|
|
| 42 | + where
|
|
| 43 | + Succy (Nattish n) = Nattish (n + 1)
|
|
| 44 | +{-# INLINE Succy #-}
|
|
| 45 | + |
|
| 46 | +{-# COMPLETE Zeroy, Succy #-} |
| ... | ... | @@ -94,3 +94,4 @@ test('T26331a', normal, compile, ['']) |
| 94 | 94 | test('T27440a', normal, compile, [''])
|
| 95 | 95 | test('T27440b', normal, compile, [''])
|
| 96 | 96 | test('T27440c', normal, compile, [''])
|
| 97 | +test('T27744', normal, compile, ['']) |
| ... | ... | @@ -638,13 +638,15 @@ test ('T15164', |
| 638 | 638 | ],
|
| 639 | 639 | compile,
|
| 640 | 640 | ['-v0 -O'])
|
| 641 | +# T15630/T15630a guard against exponential simplifier blowup when inlining
|
|
| 642 | +# join points (#15630).
|
|
| 641 | 643 | test('T15630',
|
| 642 | - [collect_compiler_stats()
|
|
| 644 | + [collect_compiler_stats('bytes allocated', 2)
|
|
| 643 | 645 | ],
|
| 644 | 646 | compile,
|
| 645 | 647 | ['-O2'])
|
| 646 | 648 | test('T15630a',
|
| 647 | - [collect_compiler_stats()
|
|
| 649 | + [collect_compiler_stats('bytes allocated', 2)
|
|
| 648 | 650 | ],
|
| 649 | 651 | compile,
|
| 650 | 652 | ['-O2'])
|
| ... | ... | @@ -768,12 +770,17 @@ test ('T9198', |
| 768 | 770 | compile,
|
| 769 | 771 | [''])
|
| 770 | 772 | |
| 773 | +# Guards against quadratic demand-analysis cost on wide recursive data
|
|
| 774 | +# types, which manifested as a compile-time memory blowup (#11545).
|
|
| 771 | 775 | test('T11545',
|
| 772 | - [ collect_compiler_stats('all', 15) ],
|
|
| 776 | + [ collect_compiler_stats('bytes allocated', 2)
|
|
| 777 | + , collect_compiler_residency(15) ],
|
|
| 773 | 778 | compile, ['-O'])
|
| 774 | 779 | |
| 780 | +# Guards against the compile-time memory blowup of #15304
|
|
| 775 | 781 | test('T15304',
|
| 776 | - [ collect_compiler_stats('all', 10) ],
|
|
| 782 | + [ collect_compiler_stats('bytes allocated', 2)
|
|
| 783 | + , collect_compiler_residency(10) ],
|
|
| 777 | 784 | compile, ['-O'])
|
| 778 | 785 | test ('T20049',
|
| 779 | 786 | [ collect_compiler_stats('bytes allocated',2) ],
|
| ... | ... | @@ -795,8 +802,10 @@ test('T16875', # Testing one hole-fit with a lot in scope for #16875 |
| 795 | 802 | collect_compiler_runtime(4),
|
| 796 | 803 | compile, ['-fdefer-type-errors -fno-max-valid-hole-fits -package ghc'])
|
| 797 | 804 | |
| 805 | +# Guards against renamer/typechecker allocation regressions on very large
|
|
| 806 | +# generated modules (#20261, a Happy-generated parser).
|
|
| 798 | 807 | test ('T20261',
|
| 799 | - [collect_compiler_stats('all')],
|
|
| 808 | + [collect_compiler_stats('bytes allocated', 2)],
|
|
| 800 | 809 | compile,
|
| 801 | 810 | [''])
|
| 802 | 811 | |
| ... | ... | @@ -805,8 +814,7 @@ test ('T20261', |
| 805 | 814 | # does not sensibly handle one test acting as both
|
| 806 | 815 | # a compile-time and a run-time performance test
|
| 807 | 816 | test('T21839c',
|
| 808 | - [ collect_compiler_stats('all', 10),
|
|
| 809 | - collect_compiler_runtime(1),
|
|
| 817 | + [ collect_compiler_runtime(1),
|
|
| 810 | 818 | only_ways(['normal'])],
|
| 811 | 819 | compile,
|
| 812 | 820 | ['-O'])
|
| ... | ... | @@ -872,8 +880,10 @@ test('interpreter_steplocal', |
| 872 | 880 | ghci_script,
|
| 873 | 881 | ['interpreter_steplocal.script'])
|
| 874 | 882 | |
| 883 | +# Guards against the compile-time memory blowup of #26425
|
|
| 875 | 884 | test ('T26425',
|
| 876 | - [ collect_compiler_stats('all',20) ],
|
|
| 885 | + [ collect_compiler_stats('bytes allocated', 2)
|
|
| 886 | + , collect_compiler_residency(20) ],
|
|
| 877 | 887 | compile,
|
| 878 | 888 | ['-O'])
|
| 879 | 889 |
| ... | ... | @@ -7,7 +7,7 @@ def large_project_makedepend(num): |
| 7 | 7 | return test(
|
| 8 | 8 | f'large-project-makedepend-{num}',
|
| 9 | 9 | [
|
| 10 | - collect_compiler_stats('bytes allocated'),
|
|
| 10 | + collect_compiler_stats('bytes allocated', 10),
|
|
| 11 | 11 | pre_cmd(f'./large-project.sh {num}'),
|
| 12 | 12 | extra_files(['large-project.sh']),
|
| 13 | 13 | ignore_stderr,
|
| ... | ... | @@ -14,7 +14,8 @@ go :: STUArray s Int Double -> Int -> Double -> ST s Double |
| 14 | 14 | go !a i !acc
|
| 15 | 15 | | i < 1 = return acc
|
| 16 | 16 | | otherwise = do
|
| 17 | - b <- unsafeRead a i
|
|
| 18 | - unsafeWrite a i (b+3.0)
|
|
| 19 | - c <- unsafeRead a i
|
|
| 17 | + -- unsafeRead/unsafeWrite use 0-based index
|
|
| 18 | + b <- unsafeRead a (i-1)
|
|
| 19 | + unsafeWrite a (i-1) (b+3.0)
|
|
| 20 | + c <- unsafeRead a (i-1)
|
|
| 20 | 21 | go a (i-1) (c+acc) |
| 1 | -2.79999863e8 |
|
| 1 | +2.8e8 |
| 1 | 1 | setTestOpts(js_skip)
|
| 2 | 2 | |
| 3 | 3 | test('space_leak_001',
|
| 4 | - # This could potentially be replaced with
|
|
| 5 | - # collect_stats('all',5) to test all 3 with
|
|
| 6 | - # 5% possible deviation.
|
|
| 7 | 4 | [ collect_stats('bytes allocated',5),
|
| 8 | 5 | collect_runtime_residency(15),
|
| 9 | 6 | omit_ways(['profasm','profthreaded','threaded1','threaded2',
|
| ... | ... | @@ -3397,13 +3397,13 @@ instance ExactPrint (HsCmd GhcPs) where |
| 3397 | 3397 | e' <- markAnnotated e
|
| 3398 | 3398 | return (HsCmdLet (tkLet', tkIn') binds' e')
|
| 3399 | 3399 | |
| 3400 | - exact (HsCmdDo (an0,loc) (L l es)) = do
|
|
| 3400 | + exact (HsCmdDo (an0,loc) es) = do
|
|
| 3401 | 3401 | debugM $ "HsCmdDo"
|
| 3402 | 3402 | loc' <- printStringAtAA loc "do"
|
| 3403 | 3403 | (an1,es') <- markAnnList' an0 $ do
|
| 3404 | - ee <- mapM markAnnotated es
|
|
| 3404 | + ee <- markAnnotated es
|
|
| 3405 | 3405 | return ee
|
| 3406 | - return (HsCmdDo (an1,loc') (L l es'))
|
|
| 3406 | + return (HsCmdDo (an1,loc') es')
|
|
| 3407 | 3407 | |
| 3408 | 3408 | -- ---------------------------------------------------------------------
|
| 3409 | 3409 | |
| ... | ... | @@ -4462,10 +4462,10 @@ instance ExactPrint [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsCmd GhcPs)))] whe |
| 4462 | 4462 | Just (initStmts, ls@(L _ (LastStmt _ _body _ _))) -> do
|
| 4463 | 4463 | debugM $ "LocatedL [ExprLStmt: snocView"
|
| 4464 | 4464 | ls' <- markAnnotated ls
|
| 4465 | - initStmts' <- markAnnotated initStmts
|
|
| 4465 | + initStmts' <- mapM markAnnotated initStmts
|
|
| 4466 | 4466 | return (initStmts' ++ [ls'])
|
| 4467 | 4467 | _ -> do
|
| 4468 | - stmts' <- markAnnotated stmts
|
|
| 4468 | + stmts' <- mapM markAnnotated stmts
|
|
| 4469 | 4469 | return stmts'
|
| 4470 | 4470 | |
| 4471 | 4471 | instance ExactPrint [Located HsDocStringChunk] where
|
| ... | ... | @@ -167,7 +167,7 @@ minLlvmVersion = 13 |
| 167 | 167 | |
| 168 | 168 | -- Max llvm version (exclusive)
|
| 169 | 169 | maxLlvmVersionExcl :: Int
|
| 170 | -maxLlvmVersionExcl = 23
|
|
| 170 | +maxLlvmVersionExcl = 24
|
|
| 171 | 171 | |
| 172 | 172 | -- Max llvm version (inclusive)
|
| 173 | 173 | maxLlvmVersion :: Int
|