summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Working around a bug to do with optCoercionwip/T18962Sebastian Graf2020-12-214-8/+9
|
* Very hackily set the stable unfolding if there are static args and keepSebastian Graf2020-12-214-46/+45
| | | | on re-setting it
* Make saTransform pure, by introducing more shadowing and using unboundKeySebastian Graf2020-12-212-26/+35
|
* Call site inline SAT'd unfoldings by giving them the sizes of the original ↵Sebastian Graf2020-12-213-30/+54
| | | | unfolding
* Remove uneffective hack attemtpsSebastian Graf2020-12-202-19/+4
|
* Try not to select functions with static args as loop-breakersSebastian Graf2020-12-207-35/+68
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | So that we can inline their specialisation at call sites. Consider ```hs -- This is the situation arising for concatMap in stream-fusion r3 :: Int -> Int r3 n = go1 0 1 where go1 z i | i > n = z | otherwise = go2 z (i+1) next True where next True = Just (i*i, False) next False = Nothing go2 z i next s = case next s of Nothing -> go1 z i Just (x, s') -> go2 (z+x) i next s' ``` `go2` has static args and we want to specialise it for its call site in `go1`. If we make `go2` the sole loop-breaker, that will never happen. But if we put `go2` before `go1` (by picking `go1` as a loop-breaker instead), we can inline it. Unfortunately, picking `go1` as loop-breaker above still means that we pick `go2` as loop-breaekr, so that it breaks its own loop. So both bindings are marked as loop-breakers, but `go2` comes first. I found that we still won't call site inline `go2`, because its discounts were not enough. So I thought about modifying its occ info until we give it `Once` occ. But that was very hacky and not working. I found that I could remove `go2` from its own `inl_fvs`, but that also was not working, because it merely turns `go2` from a strong into a weak loop-breaker (which on the bright side we may inline, but that check is in `idUnfolding` which we override for static args anyway). Just committing these attempts for future referecne. Will try to delete what I did in the next commit. Ultimately, the simplest way to call site inline is a huge hack for now: In `tryUnfolding` we aggressively inline when the function has a static argument. Fix that later.
* Zap some idStaticArgsSebastian Graf2020-12-201-3/+22
|
* tmpSebastian Graf2020-12-202-9/+12
|
* Implement as separate analysis instead; feed on that in SimplifierSebastian Graf2020-12-2011-142/+284
|
* A few changes to callSiteInline, acting as a bookmarkSebastian Graf2020-12-201-4/+10
|
* Implement Static Argument analysis in the Occurrence AnalyserSebastian Graf2020-12-204-52/+176
| | | | .. so that we can exploit it in the Simplifier.
* Bump haddock submoduleGHC GitLab CI2020-12-161-0/+0
| | | | To adapt haddock for the nullary tyconapp optimisation patch.
* Revert haddock submodule yet againBen Gamari2020-12-151-0/+0
|
* Roll-back broken haddock commitBen Gamari2020-12-151-0/+0
| | | | Updates haddock submodule to revert a commit that does not build.
* Revert "Implement BoxedRep proposal"Ben Gamari2020-12-1595-632/+263
| | | | | | This was inadvertently merged. This reverts commit 6c2eb2232b39ff4720fda0a4a009fb6afbc9dcea.
* testsuite: Mark divbyzero, derefnull as fragileBen Gamari2020-12-151-0/+2
| | | Due to #18548.
* Add regression test for #19053Sebastian Graf2020-12-152-0/+9
|
* Implement BoxedRep proposalAndrew Martin2020-12-1495-263/+632
| | | | | | | | | | | | | | | | | | This implements the BoxedRep proposal, refacoring the `RuntimeRep` hierarchy from: ```haskell data RuntimeRep = LiftedPtrRep | UnliftedPtrRep | ... ``` to ```haskell data RuntimeRep = BoxedRep Levity | ... data Levity = Lifted | Unlifted ``` Closes #17526.
* Optimise nullary type constructor usagewip/tyconapp-optsBen Gamari2020-12-1423-77/+213
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | During the compilation of programs GHC very frequently deals with the `Type` type, which is a synonym of `TYPE 'LiftedRep`. This patch teaches GHC to avoid expanding the `Type` synonym (and other nullary type synonyms) during type comparisons, saving a good amount of work. This optimisation is described in `Note [Comparing nullary type synonyms]`. To maximize the impact of this optimisation, we introduce a few special-cases to reduce `TYPE 'LiftedRep` to `Type`. See `Note [Prefer Type over TYPE 'LiftedPtrRep]`. Closes #17958. Metric Decrease: T18698b T1969 T12227 T12545 T12707 T14683 T3064 T5631 T5642 T9020 T9630 T9872a T13035 haddock.Cabal haddock.base
* Optimize dumping of consecutive whitespace.wip/andreask/opt_dumpsAndreas Klebinger2020-12-146-19/+65
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The naive way of putting out n characters of indent would be something like `hPutStr hdl (replicate n ' ')`. However this is quite inefficient as we allocate an absurd number of strings consisting of simply spaces as we don't cache them. To improve on this we now track if we can simply write ascii spaces via hPutBuf instead. This is the case when running with -ddump-to-file where we force the encoding to be UTF8. This avoids both the cost of going through encoding as well as avoiding allocation churn from all the white space. Instead we simply use hPutBuf on a preallocated unlifted string. When dumping stg like this: > nofib/spectral/simple/Main.hs -fforce-recomp -ddump-stg-final -ddump-to-file -c +RTS -s Allocations went from 1,778 MB to 1,702MB. About a 4% reduction of allocation! I did not measure the difference in runtime but expect it to be similar. Bumps the haddock submodule since the interface of GHC's Pretty slightly changed. ------------------------- Metric Decrease: T12227 -------------------------
* Move Unit related fields from DynFlags to HscEnvSylvain Henry2020-12-1458-1219/+1308
| | | | | | | | | | | | | The unit database cache, the home unit and the unit state were stored in DynFlags while they ought to be stored in the compiler session state (HscEnv). This patch fixes this. It introduces a new UnitEnv type that should be used in the future to handle separate unit environments (especially host vs target units). Related to #17957 Bump haddock submodule
* Revert "Optimise nullary type constructor usage"Ben Gamari2020-12-1423-213/+77
| | | | | | This was inadvertently merged. This reverts commit 7e9debd4ceb068effe8ac81892d2cabcb8f55850.
* Optimise nullary type constructor usageBen Gamari2020-12-1423-77/+213
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | During the compilation of programs GHC very frequently deals with the `Type` type, which is a synonym of `TYPE 'LiftedRep`. This patch teaches GHC to avoid expanding the `Type` synonym (and other nullary type synonyms) during type comparisons, saving a good amount of work. This optimisation is described in `Note [Comparing nullary type synonyms]`. To maximize the impact of this optimisation, we introduce a few special-cases to reduce `TYPE 'LiftedRep` to `Type`. See `Note [Prefer Type over TYPE 'LiftedPtrRep]`. Closes #17958. Metric Decrease: T18698b T1969 T12227 T12545 T12707 T14683 T3064 T5631 T5642 T9020 T9630 T9872a T13035 haddock.Cabal haddock.base
* Implement type applications in patternsCale Gibbard2020-12-1487-193/+959
| | | | | The haddock submodule is also updated so that it understands the changes to patterns.
* Remove old .travis.ymlJohn Ericson2020-12-131-61/+0
|
* mkDocs: support hadrian bindists #18973Adam Sandberg Ericsson2020-12-121-1/+3
|
* hadrian: correctly copy the docs dir into the bindist #18669Adam Sandberg Ericsson2020-12-121-1/+9
|
* Demand: Simplify `CU(U)` to `U` (#19005)Sebastian Graf2020-12-126-35/+47
| | | | | | Both sub-demands encode the same information. This is a trivial change and already affects a few regression tests (e.g. `T5075`), so no separate regression test is necessary.
* DmdAnal: Annotate top-level function bindings with demands (#18894)Sebastian Graf2020-12-1215-155/+937
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It's useful to annotate a non-exported top-level function like `g` in ```hs module Lib (h) where g :: Int -> Int -> (Int,Int) g m 1 = (m, 0) g m n = (2 * m, 2 `div` n) {-# NOINLINE g #-} h :: Int -> Int h 1 = 0 h m | odd m = snd (g m 2) | otherwise = uncurry (+) (g 2 m) ``` with its demand `UCU(CS(P(1P(U),SP(U))`, which tells us that whenever `g` was called, the second component of the returned pair was evaluated strictly. Since #18903 we do so for local functions, where we can see all calls. For top-level functions, we can assume that all *exported* functions are demanded according to `topDmd` and thus get sound demands for non-exported top-level functions. The demand on `g` is crucial information for Nested CPR, which may the go on and unbox `g` for the second pair component. That is true even if that pair component may diverge, as is the case for the call site `g 13 0`, which throws a div-by-zero exception. In `T18894b`, you can even see the new demand annotation enabling us to eta-expand a function that we wouldn't be able to eta-expand without Call Arity. We only track bindings of function type in order not to risk huge compile-time regressions, see `isInterestingTopLevelFn`. There was a CoreLint check that rejected strict demand annotations on recursive or top-level bindings, which seems completely unjustified. All the cases I investigated were fine, so I removed it. Fixes #18894.
* Use static array in zeroCountSylvain Henry2020-12-111-37/+6
|
* rts: don't use siginterrupt (#19019)Sylvain Henry2020-12-111-5/+1
|
* ghci: reuse Arch from ghc-bootSylvain Henry2020-12-112-63/+22
|
* ghci: don't compile unneeded modulesSylvain Henry2020-12-111-2/+2
|
* Move SizedSeq into ghc-bootSylvain Henry2020-12-118-9/+8
|
* Parser: move parser utils into their own moduleSylvain Henry2020-12-114-58/+72
| | | | Move code unrelated to runtime evaluation out of GHC.Runtime.Eval
* Hadrian: fix libffi tarball parsingSylvain Henry2020-12-111-1/+1
| | | | | | Fix parsing of "libffi-3.3.tar.gz". NB: switch to a newer libffi isn't done in this patch
* Validate script: fix configure command when using stackSylvain Henry2020-12-111-1/+4
|
* Arrows: correctly query arrow methods (#17423)Sylvain Henry2020-12-114-13/+17
| | | | | | | | | | | | | | | | | | | | | | | | | Consider the following code: proc (C x y) -> ... Before this patch, the evidence binding for the Arrow dictionary was attached to the C pattern: proc (C x y) { $dArrow = ... } -> ... But then when we desugar this, we use arrow operations ("arr", ">>>"...) specialised for this arrow: let arr_xy = arr $dArrow -- <-- Not in scope! ... in arr_xy (\(C x y) { $dArrow = ... } -> ...) This patch allows arrow operations to be type-checked before the proc itself, avoiding this issue. Fix #17423
* Delete outdated Note [Kind-checking tyvar binders for associated types]Ryan Scott2020-12-112-24/+0
| | | | | | | | | | | This Note has severely bitrotted, as it has no references anywhere in the codebase, and none of the functions that it mentions exist anymore. Let's just delete this. While I was in town, I deleted some outdated comments from `checkFamPatBinders` of a similar caliber. Fixes #19008. [ci skip]
* Add :doc test case for duplicate record fieldsAaron Allen2020-12-113-0/+17
| | | | | Tests that the output of the `:doc` command is correct for duplicate record fields defined using -XDuplicateRecordFields.
* Elide extraneous messages for :doc command (#15784)Aaron Allen2020-12-114-5/+26
| | | | | | | | Do not print `<has no documentation>` alongside a valid doc. Additionally, if two matching symbols lack documentation then the message will only be printed once. Hence, `<has no documentation>` will be printed at most once and only if all matching symbols are lacking docs.
* Display FFI labels (fix #18539)Sylvain Henry2020-12-112-8/+10
|
* gitlab-ci: Fix name of flavour in ThreadSanitizer jobBen Gamari2020-12-111-1/+1
| | | | | It looks like I neglected to update this after introduce flavour transformers.
* gitlab-ci: Fix incorrect Docker image for nightly cross jobBen Gamari2020-12-111-11/+8
| | | | Also refactor the job definition to eliminate the bug by construction.
* users guide: Describe GC lifecycle eventsBen Gamari2020-12-113-5/+101
| | | | | | Every time I am asked about how to interpret these events I need to figure it out from scratch. It's well past time that the users guide properly documents these.
* users guide: Fix syntax errorsBen Gamari2020-12-111-23/+21
| | | | Fixes errors introduced by 3a55b3a2574f913d046f3a6f82db48d7f6df32e3.
* rts/linker/Elf.c: add missing <dlfcn.h> include (musl support)Sergei Trofimovich2020-12-101-0/+3
| | | | | | | | | | | | | | The change fixes build failure on musl: ``` rts/linker/Elf.c:2031:3: error: warning: implicit declaration of function 'dlclose'; did you mean 'close'? [-Wimplicit-function-declaration] 2031 | dlclose(nc->dlopen_handle); | ^~~~~~~ | close ``` Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
* doc: Extra-clarify -fomit-yieldsKirill Elagin2020-12-101-1/+1
| | | | Be more clear on what this optimisation being on by default means in terms of yields.
* doc: Clarify the default for -fomit-yieldsKirill Elagin2020-12-101-1/+1
| | | | | | “Yield points enabled” is confusing (and probably wrong? I am not 100% sure what it means). Change it to a simple “on”. Undo this change from 2c23fff2e03e77187dc4d01f325f5f43a0e7cad2.
* Bump time submodule.Andreas Klebinger2020-12-081-0/+0
| | | | This should fix #19002.