daml/stack-snapshot.yaml

35 lines
1.2 KiB
YAML
Raw Normal View History

# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
resolver: lts-14.1
packages:
Fix packaging performance (#6350) fixes #3150 This PR introduces a patch to GHC to fix the performance of the pattern match checker in the presence of multiple packages which is currently significantly (orders of magnitude) slower than having everything in a single package. I also added a test case that hits this. Here’s what you need to hit this issue: 1. A typeclass with a functional dependency. `HasField` is the obvious candidate for this. 2. A lot of instances of this typeclass in a separate package (this is the only part where the separate package matters). 3. A reasonably large ADT with a bunch of strict fields. 4. A pattern match in the context of some constraints of the typeclass. The constraints can be completely unused. In that case, you will get a significant slowdown in the number of instances, number of constructors and number of constraints (didn’t verify if it’s linear but it is significant which is all that matters). Here’s why this happens: 1. The pattern match checker checks for strict fields if the type is inhabited. 2. This calls `pmTopNormaliseType_maybe` to normalize a type (the details don’t matter) which in turn calls into the typechecker. This function is called very often (presumably linear in the number of constructors but didn’t verify.) 3. The typechecker has some logic in `improveFromInstEnv` for generating additional equations by unifying functional dependencies `a -> b` with constraints in scope and thereby deducing information about `b`. 4. In the pattern match checker the list of instances of the home package is empty since the pattern match checker (apparently) doesn’t actually care about those extra equations. However, the list of instances in the EPS is not empty. This is the issue here: By moving it to an external package we suddenly end up with thousands of instances that we try to unify with the functional dependencies every time we normalize which happens very often. Proposed fix: The solution is rather simple: Since the pattern match checker apparently does not care about the instances of the home package, it almost certainly doesn’t care about instances in general so we just empty the instances of external packages explicitly. Is the fix correct? 1. I verified that the GHC test suite passes with this patch which gives me a reasonable level of confidence. 2. I verified that our own test suite passes. 3. The most dodgy part is actually emptying the instance since the whole EPS stuff is a mutable mess. What could in theory happen is that the PM ends up loading an interface file that mutates this again. However, afaiu it is impossible for the PM to need an interface that the typechecker didnt already need. I did do a bunch of debugging and this is exactly what I observed in my experiments. Alternative ideas and upstreaming: The other option would be to not try and mess with the EPS but somehow have a conditional flag somewhere in the typechecker env to disable this logic in the pattern match checker. However, that sounds significantly more complex so I don’t think it’s worth the effort. GHC 8.10 has a new pattern match checker that has different performance characteristics and seems to do much better here so there is little reason to try and upstream this. I strongly want to avoid upgrading DAML to 8.10 at this point (too much risk, let’s wait until things calm down) changelog_begin - [DAML Compiler] Fix an issue where compilation slowed down significantly when code was split up into several packages. See https://github.com/digital-asset/daml/issues/3150 changelog_end
2020-06-16 16:12:34 +03:00
- archive: https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-942755169bad510701179c8c40cddd3e.tar.gz
sha256: "367f779d564e01a98fe7e9c7f1d7c1a7936759aae9c273eb2dfc6f1ed1c51d07"
- archive: https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-942755169bad510701179c8c40cddd3e.tar.gz
sha256: "bf17b50a11369b67237e6e0e22589f7ead7b482d05e0e3c68654c9be5b3d3fac"
- github: digital-asset/hlint
commit: "3e78bce69749b22a80fec1e8eb853cc0c100c18e"
sha256: "cf39f2b378485afc77ffdad4dbb057d5d9b4dfc5a38c76ddc44e920e537fb0fa"
- ghc-lib-parser-ex-8.8.5.8
- bytestring-nums-0.3.6
- extra-1.7.1
- grpc-haskell-0.0.1.0
- grpc-haskell-core-0.0.0.0
- fuzzy-0.1.0.0
- haskell-lsp-0.21.0.0
- haddock-library-1.8.0
- haskell-lsp-types-0.21.0.0
- hie-bios-0.4.0
- hpp-0.6.1
- lsp-test-0.10.2.0
- parser-combinators-1.2.1
- proto3-suite-0.4.0.0
- proto3-wire-1.1.0
- regex-base-0.94.0.0
- regex-tdfa-1.3.1.0
- shake-0.18.5
- simple-smt-0.9.4
# Core packages, need to be listed for integer-simple flags.
- integer-simple-0.1.1.1
- text-1.2.3.1