Skip to content
Snippets Groups Projects
  1. Dec 06, 2023
  2. Jul 15, 2023
    • Matthew Craven's avatar
      Equality of forall-types is visibility aware · cf86f3ec
      Matthew Craven authored and Vladislav Zavialov's avatar Vladislav Zavialov committed
      This patch finally (I hope) nails the question of whether
         (forall a. ty) and (forall a -> ty)
      are `eqType`: they aren't!
      
      There is a long discussion in #22762, plus useful Notes:
      
      * Note [ForAllTy and type equality] in GHC.Core.TyCo.Compare
      * Note [Comparing visiblities] in GHC.Core.TyCo.Compare
      * Note [ForAllCo] in GHC.Core.TyCo.Rep
      
      It also establishes a helpful new invariant for ForAllCo,
      and ForAllTy, when the bound variable is a CoVar:in that
      case the visibility must be coreTyLamForAllTyFlag.
      
      All this is well documented in revised Notes.
      cf86f3ec
  3. Sep 15, 2022
  4. Mar 16, 2022
    • Sebastian Graf's avatar
      Demand: Let `Boxed` win in `lubBoxity` (#21119) · 1575c4a5
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      Previously, we let `Unboxed` win in `lubBoxity`, which is unsoundly optimistic
      in terms ob Boxity analysis. "Unsoundly" in the sense that we sometimes unbox
      parameters that we better shouldn't unbox. Examples are #18907 and T19871.absent.
      
      Until now, we thought that this hack pulled its weight becuase it worked around
      some shortcomings of the phase separation between Boxity analysis and CPR
      analysis. But it is a gross hack which caused regressions itself that needed all
      kinds of fixes and workarounds. See for example #20767. It became impossible to
      work with in !7599, so I want to remove it.
      
      For example, at the moment, `lubDmd B dmd` will not unbox `dmd`,
      but `lubDmd A dmd` will. Given that `B` is supposed to be the bottom element of
      the lattice, it's hardly justifiable to get a better demand when `lub`bing with
      `A`.
      
      The consequence of letting `Boxed` win in `lubBoxity` is that we *would* regress
       #2387, #16040 and parts of #5075 and T19871.sumIO, until Boxity and CPR
      are able to communicate better. Fortunately, that is not the case since I could
      tweak the other source of optimism in Boxity analysis that is described in
      `Note [Unboxed demand on function bodies returning small products]` so that
      we *recursively* assume unboxed demands on function bodies returning small
      products. See the updated Note.
      
      `Note [Boxity for bottoming functions]` describes why we need bottoming
      functions to have signatures that say that they deeply unbox their arguments.
      In so doing, I had to tweak `finaliseArgBoxities` so that it will never unbox
      recursive data constructors. This is in line with our handling of them in CPR.
      I updated `Note [Which types are unboxed?]` to reflect that.
      
      In turn we fix #21119, #20767, #18907, T19871.absent and get a much simpler
      implementation (at least to think about). We can also drop the very ad-hoc
      definition of `deferAfterPreciseException` and its Note in favor of the
      simple, intuitive definition we used to have.
      
      Metric Decrease:
          T16875
          T18223
          T18698a
          T18698b
          hard_hole_fits
      Metric Increase:
          LargeRecord
          MultiComponentModulesRecomp
          T15703
          T8095
          T9872d
      
      Out of all the regresions, only the one in T9872d doesn't vanish in a perf
      build, where the compiler is bootstrapped with -O2 and thus SpecConstr.
      Reason for regressions:
      
        * T9872d is due to `ty_co_subst` taking its `LiftingContext` boxed.
          That is because the context is passed to a function argument, for
          example in `liftCoSubstTyVarBndrUsing`.
        * In T15703, LargeRecord and T8095, we get a bit more allocations in
          `expand_syn` and `piResultTys`, because a `TCvSubst` isn't unboxed.
          In both cases that guards against reboxing in some code paths.
        * The same is true for MultiComponentModulesRecomp, where we get less unboxing
          in `GHC.Unit.Finder.$wfindInstalledHomeModule`. In a perf build, allocations
          actually *improve* by over 4%!
      
      Results on NoFib:
      
      --------------------------------------------------------------------------------
              Program         Allocs    Instrs
      --------------------------------------------------------------------------------
               awards          -0.4%     +0.3%
            cacheprof          -0.3%     +2.4%
                  fft          -1.5%     -5.1%
             fibheaps          +1.2%     +0.8%
                fluid          -0.3%     -0.1%
                  ida          +0.4%     +0.9%
         k-nucleotide          +0.4%     -0.1%
           last-piece         +10.5%    +13.9%
                 lift          -4.4%     +3.5%
              mandel2         -99.7%    -99.8%
                 mate          -0.4%     +3.6%
               parser          -1.0%     +0.1%
               puzzle         -11.6%     +6.5%
      reverse-complem          -3.0%     +2.0%
                  scs          -0.5%     +0.1%
               sphere          -0.4%     -0.2%
            wave4main          -8.2%     -0.3%
      --------------------------------------------------------------------------------
      Summary excludes mandel2 because of excessive bias
                  Min         -11.6%     -5.1%
                  Max         +10.5%    +13.9%
       Geometric Mean          -0.2%     +0.3%
      --------------------------------------------------------------------------------
      
      Not bad for a bug fix.
      
      The regression in `last-piece` could become a win if SpecConstr would work on
      non-recursive functions. The regression in `fibheaps` is due to
      `Note [Reboxed crud for bottoming calls]`, e.g., #21128.
      1575c4a5
  5. Mar 14, 2022
    • Sebastian Graf's avatar
      DmdAnal: Don't unbox recursive data types (#11545) · 8ff32124
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      As `Note [Demand analysis for recursive data constructors]` describes, we now
      refrain from unboxing recursive data type arguments, for two reasons:
      
       1. Relating to run/alloc perf: Similar to
          `Note [CPR for recursive data constructors]`, it seldomly improves run/alloc
          performance if we just unbox a finite number of layers of a potentially huge
          data structure.
       2. Relating to ghc/alloc perf: Inductive definitions on single-product
          recursive data types like the one in T11545 will (diverge, and) have very
          deep demand signatures before any other abortion mechanism in Demand
          analysis is triggered. That leads to great and unnecessary churn on Demand
          analysis when ultimately we will never make use of any nested strictness
          information anyway.
      
      Conclusion: Discard nested demand and boxity information on such recursive types
      with the help of `Note [Detecting recursive data constructors]`.
      
      I also implemented `GHC.Types.Unique.MemoFun.memoiseUniqueFun` in order to avoid
      the overhead of repeated calls to `GHC.Core.Opt.WorkWrap.Utils.isRecDataCon`.
      It's nice and simple and guards against some smaller regressions in T9233 and
      T16577.
      
      ghc/alloc performance-wise, this patch is a very clear win:
      
                                     Test    Metric          value      New value Change
      ---------------------------------------------------------------------------------------
                      LargeRecord(normal) ghc/alloc  6,141,071,720  6,099,871,216  -0.7%
      MultiLayerModulesTH_OneShot(normal) ghc/alloc  2,740,973,040  2,705,146,640  -1.3%
                           T11545(normal) ghc/alloc    945,475,492     85,768,928 -90.9% GOOD
                           T13056(optasm) ghc/alloc    370,245,880    326,980,632 -11.7% GOOD
                           T18304(normal) ghc/alloc     90,933,944     76,998,064 -15.3% GOOD
                           T9872a(normal) ghc/alloc  1,800,576,840  1,792,348,760  -0.5%
                           T9872b(normal) ghc/alloc  2,086,492,432  2,073,991,848  -0.6%
                           T9872c(normal) ghc/alloc  1,750,491,240  1,737,797,832  -0.7%
             TcPlugin_RewritePerf(normal) ghc/alloc  2,286,813,400  2,270,957,896  -0.7%
      
                                geo. mean                                          -2.9%
      
      No noteworthy change in run/alloc either.
      
      NoFib results show slight wins, too:
      
      --------------------------------------------------------------------------------
              Program         Allocs    Instrs
      --------------------------------------------------------------------------------
          constraints          -1.9%     -1.4%
                fasta          -3.6%     -2.7%
      reverse-complem          -0.3%     -0.9%
             treejoin          -0.0%     -0.3%
      --------------------------------------------------------------------------------
                  Min          -3.6%     -2.7%
                  Max          +0.1%     +0.1%
       Geometric Mean          -0.1%     -0.1%
      
      Metric Decrease:
          T11545
          T13056
          T18304
      8ff32124
  6. Nov 11, 2021
  7. Oct 24, 2021
    • Sebastian Graf's avatar
      DmdAnal: Implement Boxity Analysis (#19871) · 3bab222c
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      This patch fixes some abundant reboxing of `DynFlags` in
      `GHC.HsToCore.Match.Literal.warnAboutOverflowedLit` (which was the topic
      of #19407) by introducing a Boxity analysis to GHC, done as part of demand
      analysis. This allows to accurately capture ad-hoc unboxing decisions previously
      made in worker/wrapper in demand analysis now, where the boxity info can
      propagate through demand signatures.
      
      See the new `Note [Boxity analysis]`. The actual fix for #19407 is described in
      `Note [No lazy, Unboxed demand in demand signature]`, but
      `Note [Finalising boxity for demand signature]` is probably a better entry-point.
      
      To support the fix for #19407, I had to change (what was)
      `Note [Add demands for strict constructors]` a bit
      (now `Note [Unboxing evaluated arguments]`). In particular, we now take care of
      it in `finaliseBoxity` (which is only called from demand analaysis) instead of
      `wantToUnboxArg`.
      
      I also had to resurrect `Note [Product demands for function body]` and rename
      it to `Note [Unboxed demand on function bodies returning small products]` to
      avoid huge regressions in `join004` and `join007`, thereby fixing #4267 again.
      See the updated Note for details.
      
      A nice side-effect is that the worker/wrapper transformation no longer needs to
      look at strictness info and other bits such as `InsideInlineableFun` flags
      (needed for `Note [Do not unbox class dictionaries]`) at all. It simply collects
      boxity info from argument demands and interprets them with a severely simplified
      `wantToUnboxArg`. All the smartness is in `finaliseBoxity`, which could be moved
      to DmdAnal completely, if it wasn't for the call to `dubiousDataConInstArgTys`
      which would be awkward to export.
      
      I spent some time figuring out the reason for why `T16197` failed prior to my
      amendments to `Note [Unboxing evaluated arguments]`. After having it figured
      out, I minimised it a bit and added `T16197b`, which simply compares computed
      strictness signatures and thus should be far simpler to eyeball.
      
      The 12% ghc/alloc regression in T11545 is because of the additional `Boxity`
      field in `Poly` and `Prod` that results in more allocation during `lubSubDmd`
      and `plusSubDmd`. I made sure in the ticky profiles that the number of calls
      to those functions stayed the same. We can bear such an increase here, as we
      recently improved it by -68% (in b760c1f7).
      T18698* regress slightly because there is more unboxing of dictionaries
      happening and that causes Lint (mostly) to allocate more.
      
      Fixes #19871, #19407, #4267, #16859, #18907 and #13331.
      
      Metric Increase:
          T11545
          T18698a
          T18698b
      
      Metric Decrease:
          T12425
          T16577
          T18223
          T18282
          T4267
          T9961
      3bab222c
  8. Oct 22, 2021
    • Sebastian Graf's avatar
      WorkWrap: `isRecDataCon` should not eta-reduce NewTyCon field tys (#20539) · dd2dba80
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      In #20539 we had a type
      ```hs
      newtype Measured a = Measured { unmeasure :: () -> a }
      ```
      and `isRecDataCon Measured` recursed into `go_arg_ty` for `(->) ()`, because
      `unwrapNewTyConEtad_maybe` eta-reduced it. That triggered an assertion error a
      bit later. Eta reducing the field type is completely wrong to do here! Just call
      `unwrapNewTyCon_maybe` instead.
      
      Fixes #20539 and adds a regression test T20539.
      dd2dba80
  9. Oct 06, 2021
  10. Oct 05, 2021
    • Sebastian Graf's avatar
      WorkWrap: Nuke CPR signatures of join points (#18824) · 643b6f01
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      In #18824 we saw that the Simplifier didn't nuke a CPR signature of a join point
      when it pushed a continuation into it when it better should have.
      
      But join points are local, mostly non-exported bindings. We don't use their
      CPR signature anyway and would discard it at the end of the Core pipeline.
      Their main purpose is to propagate CPR info during CPR analysis and by the time
      worker/wrapper runs the signature will have served its purpose. So we zap it!
      
      Fixes #18824.
      643b6f01
  11. Sep 30, 2021
    • Sebastian Graf's avatar
      Nested CPR light unleashed (#18174) · c261f220
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      This patch enables worker/wrapper for nested constructed products, as described
      in `Note [Nested CPR]`. The machinery for expressing Nested CPR was already
      there, since !5054. Worker/wrapper is equipped to exploit Nested CPR annotations
      since !5338. CPR analysis already handles applications in batches since !5753.
      This patch just needs to flip a few more switches:
      
      1. In `cprTransformDataConWork`, we need to look at the field expressions
         and their `CprType`s to see whether the evaluation of the expressions
         terminates quickly (= is in HNF) or if they are put in strict fields.
         If that is the case, then we retain their CPR info and may unbox nestedly
         later on. More details in `Note [Nested CPR]`.
      2. Enable nested `ConCPR` signatures in `GHC.Types.Cpr`.
      3. In the `asConCpr` call in `GHC.Core.Opt.WorkWrap.Utils`, pass CPR info of
         fields to the `Unbox`.
      4. Instead of giving CPR signatures to DataCon workers and wrappers, we now have
         `cprTransformDataConWork` for workers and treat wrappers by analysing their
         unfolding. As a result, the code from GHC.Types.Id.Make went away completely.
      5. I deactivated worker/wrappering for recursive DataCons and wrote a function
         `isRecDataCon` to detect them. We really don't want to give `repeat` or
         `replicate` the Nested CPR property.
         See Note [CPR for recursive data structures] for which kind of recursive
         DataCons we target.
      6. Fix a couple of tests and their outputs.
      
      I also documented that CPR can destroy sharing and lead to asymptotic increase
      in allocations (which is tracked by #13331/#19326) in
      `Note [CPR for data structures can destroy sharing]`.
      
      Nofib results:
      ```
      --------------------------------------------------------------------------------
              Program         Allocs    Instrs
      --------------------------------------------------------------------------------
         ben-raytrace          -3.1%     -0.4%
         binary-trees          +0.8%     -2.9%
         digits-of-e2          +5.8%     +1.2%
                event          +0.8%     -2.1%
       fannkuch-redux          +0.0%     -1.4%
                 fish           0.0%     -1.5%
               gamteb          -1.4%     -0.3%
              mkhprog          +1.4%     +0.8%
           multiplier          +0.0%     -1.9%
                  pic          -0.6%     -0.1%
              reptile         -20.9%    -17.8%
            wave4main          +4.8%     +0.4%
                 x2n1        -100.0%     -7.6%
      --------------------------------------------------------------------------------
                  Min         -95.0%    -17.8%
                  Max          +5.8%     +1.2%
       Geometric Mean          -2.9%     -0.4%
      ```
      The huge wins in x2n1 (loopy list) and reptile (see #19970) are due to
      refraining from unboxing (:). Other benchmarks like digits-of-e2 or wave4main
      regress because of that. Ultimately there are no great improvements due to
      Nested CPR alone, but at least it's a win.
      Binary sizes decrease by 0.6%.
      
      There are a significant number of metric decreases. The most notable ones (>1%):
      ```
             ManyAlternatives(normal) ghc/alloc   771656002.7   762187472.0  -1.2%
             ManyConstructors(normal) ghc/alloc  4191073418.7  4114369216.0  -1.8%
            MultiLayerModules(normal) ghc/alloc  3095678333.3  3128720704.0  +1.1%
                    PmSeriesG(normal) ghc/alloc    50096429.3    51495664.0  +2.8%
                    PmSeriesS(normal) ghc/alloc    63512989.3    64681600.0  +1.8%
                    PmSeriesV(normal) ghc/alloc    62575424.0    63767208.0  +1.9%
                       T10547(normal) ghc/alloc    29347469.3    29944240.0  +2.0%
                      T11303b(normal) ghc/alloc    46018752.0    47367576.0  +2.9%
                       T12150(optasm) ghc/alloc    81660890.7    82547696.0  +1.1%
                       T12234(optasm) ghc/alloc    59451253.3    60357952.0  +1.5%
                       T12545(normal) ghc/alloc  1705216250.7  1751278952.0  +2.7%
                       T12707(normal) ghc/alloc   981000472.0   968489800.0  -1.3% GOOD
                       T13056(optasm) ghc/alloc   389322664.0   372495160.0  -4.3% GOOD
                       T13253(normal) ghc/alloc   337174229.3   341954576.0  +1.4%
                       T13701(normal) ghc/alloc  2381455173.3  2439790328.0  +2.4%  BAD
                         T14052(ghci) ghc/alloc  2162530642.7  2139108784.0  -1.1%
                       T14683(normal) ghc/alloc  3049744728.0  2977535064.0  -2.4% GOOD
                       T14697(normal) ghc/alloc   362980213.3   369304512.0  +1.7%
                       T15164(normal) ghc/alloc  1323102752.0  1307480600.0  -1.2%
                       T15304(normal) ghc/alloc  1304607429.3  1291024568.0  -1.0%
                       T16190(normal) ghc/alloc   281450410.7   284878048.0  +1.2%
                       T16577(normal) ghc/alloc  7984960789.3  7811668768.0  -2.2% GOOD
                       T17516(normal) ghc/alloc  1171051192.0  1153649664.0  -1.5%
                       T17836(normal) ghc/alloc  1115569746.7  1098197592.0  -1.6%
                      T17836b(normal) ghc/alloc    54322597.3    55518216.0  +2.2%
                       T17977(normal) ghc/alloc    47071754.7    48403408.0  +2.8%
                      T17977b(normal) ghc/alloc    42579133.3    43977392.0  +3.3%
                       T18923(normal) ghc/alloc    71764237.3    72566240.0  +1.1%
                        T1969(normal) ghc/alloc   784821002.7   773971776.0  -1.4% GOOD
                        T3294(normal) ghc/alloc  1634913973.3  1614323584.0  -1.3% GOOD
                        T4801(normal) ghc/alloc   295619648.0   292776440.0  -1.0%
                      T5321FD(normal) ghc/alloc   278827858.7   276067280.0  -1.0%
                        T5631(normal) ghc/alloc   586618202.7   577579960.0  -1.5%
                        T5642(normal) ghc/alloc   494923048.0   487927208.0  -1.4%
                        T5837(normal) ghc/alloc    37758061.3    39261608.0  +4.0%
                        T9020(optasm) ghc/alloc   257362077.3   254672416.0  -1.0%
                        T9198(normal) ghc/alloc    49313365.3    50603936.0  +2.6%  BAD
                        T9233(normal) ghc/alloc   704944258.7   685692712.0  -2.7% GOOD
                        T9630(normal) ghc/alloc  1476621560.0  1455192784.0  -1.5%
                        T9675(optasm) ghc/alloc   443183173.3   433859696.0  -2.1% GOOD
                       T9872a(normal) ghc/alloc  1720926653.3  1693190072.0  -1.6% GOOD
                       T9872b(normal) ghc/alloc  2185618061.3  2162277568.0  -1.1% GOOD
                       T9872c(normal) ghc/alloc  1765842405.3  1733618088.0  -1.8% GOOD
         TcPlugin_RewritePerf(normal) ghc/alloc  2388882730.7  2365504696.0  -1.0%
                        WWRec(normal) ghc/alloc   607073186.7   597512216.0  -1.6%
      
                        T9203(normal) run/alloc   107284064.0   102881832.0  -4.1%
                haddock.Cabal(normal) run/alloc 24025329589.3 23768382560.0  -1.1%
                 haddock.base(normal) run/alloc 25660521653.3 25370321824.0  -1.1%
             haddock.compiler(normal) run/alloc 74064171706.7 73358712280.0  -1.0%
      ```
      The biggest exception to the rule is T13701 which seems to fluctuate as usual
      (not unlike T12545). T14697 has a similar quality, being a generated
      multi-module test. T5837 is small enough that it similarly doesn't measure
      anything significant besides module loading overhead.
      T13253 simply does one additional round of Simplification due to Nested CPR.
      
      There are also some apparent regressions in T9198, T12234 and PmSeriesG that we
      (@mpickering and I) were simply unable to reproduce locally. @mpickering tried
      to run the CI script in a local Docker container and actually found that T9198
      and PmSeriesG *improved*. In MRs that were rebased on top this one, like !4229,
      I did not experience such increases. Let's not get hung up on these regression
      tests, they were meant to test for asymptotic regressions.
      
      The build-cabal test improves by 1.2% in -O0.
      
      Metric Increase:
          T10421
          T12234
          T12545
          T13035
          T13056
          T13701
          T14697
          T18923
          T5837
          T9198
      Metric Decrease:
          ManyConstructors
          T12545
          T12707
          T13056
          T14683
          T16577
          T18223
          T1969
          T3294
          T9203
          T9233
          T9675
          T9872a
          T9872b
          T9872c
          T9961
          TcPlugin_RewritePerf
      c261f220
  12. May 20, 2021
    • Sebastian Graf's avatar
      CPR: Detect constructed products in `runRW#` apps (#19822) · e87b8e10
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      In #19822, we realised that the Simplifier's new habit of floating cases into
      `runRW#` continuations inhibits CPR analysis from giving key functions of `text`
      the CPR property, such as `singleton`.
      
      This patch fixes that by anticipating part of !5667 (Nested CPR) to give
      `runRW#` the proper CPR transformer it now deserves: Namely, `runRW# (\s -> e)`
      should have the CPR property iff `e` has it.
      
      The details are in `Note [Simplification of runRW#]` in GHC.CoreToStg.Prep.
      
      The output of T18086 changed a bit: `panic` (which calls `runRW#`) now has
      `botCpr`. As outlined in Note [Bottom CPR iff Dead-Ending Divergence], that's
      OK.
      
      Fixes #19822.
      
      Metric Decrease:
          T9872d
      e87b8e10
  13. Apr 20, 2021
    • Sebastian Graf's avatar
      Worker/wrapper: Refactor CPR WW to work for nested CPR (#18174) · fdbead70
      Sebastian Graf authored
      In another small step towards bringing a manageable variant of Nested
      CPR into GHC, this patch refactors worker/wrapper to be able to exploit
      Nested CPR signatures. See the new Note [Worker/wrapper for CPR].
      
      The nested code path is currently not triggered, though, because all
      signatures that we annotate are still flat. So purely a refactoring.
      I am very confident that it works, because I ripped it off !1866 95%
      unchanged.
      
      A few test case outputs changed, but only it's auxiliary names only.
      I also added test cases for #18109 and #18401.
      
      There's a 2.6% metric increase in T13056 after a rebase, caused by an
      additional Simplifier run. It appears b1d0b9c saw a similar additional
      iteration. I think it's just a fluke.
      
      Metric Increase:
          T13056
      fdbead70
  14. Mar 20, 2021
    • Sebastian Graf's avatar
      Nested CPR light (#19398) · 044e5be3
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      While fixing #19232, it became increasingly clear that the vestigial
      hack described in `Note [Optimistic field binder CPR]` is complicated
      and causes reboxing. Rather than make the hack worse, this patch
      gets rid of it completely in favor of giving deeply unboxed parameters
      the Nested CPR property. Example:
      ```hs
      f :: (Int, Int) -> Int
      f p = case p of
       (x, y) | x == y    = x
              | otherwise = y
      ```
      Based on `p`'s `idDemandInfo` `1P(1P(L),1P(L))`, we can see that both
      fields of `p` will be available unboxed. As a result, we give `p` the
      nested CPR property `1(1,1)`. When analysing the `case`, the field
      CPRs are transferred to the binders `x` and `y`, respectively, so that
      we ultimately give `f` the CPR property.
      
      I took the liberty to do a bit of refactoring:
      
      - I renamed `CprResult` ("Constructed product result result") to plain
        `Cpr`.
      - I Introduced `FlatConCpr` in addition to (now nested) `ConCpr` and
        and according pattern synonym that rewrites flat `ConCpr` to
        `FlatConCpr`s, purely for compiler perf reasons.
      - Similarly for performance reasons, we now store binders with a
        Top signature in a separate `IntSet`,
        see `Note [Efficient Top sigs in SigEnv]`.
      - I moved a bit of stuff around in `GHC.Core.Opt.WorkWrap.Utils` and
        introduced `UnboxingDecision` to replace the `Maybe DataConPatContext`
        type we used to return from `wantToUnbox`.
      - Since the `Outputable Cpr` instance changed anyway, I removed the
        leading `m` which we used to emit for `ConCpr`. It's just noise,
        especially now that we may output nested CPRs.
      
      Fixes #19398.
      044e5be3
  15. Feb 28, 2021
    • Sebastian Graf's avatar
      CPR analysis: Use CPR of scrutinee for Case Binder CPR (#19232) · df2eca94
      Sebastian Graf authored and Marge Bot's avatar Marge Bot committed
      For years we have lived in a supposedly sweet spot that gave case
      binders the CPR property, unconditionally. Which is an optimistic hack
      that is now described in `Historical Note [Optimistic case binder CPR]`.
      
      In #19232 the concern was raised that this might do more harm than good
      and that might be better off simply by taking the CPR property of the
      scrutinee for the CPR type of the case binder. And indeed that's what we
      do now.
      
      Since `Note [CPR in a DataAlt case alternative]` is now only about field
      binders, I renamed and garbage collected it into
      `Note [Optimistic field binder CPR]`.
      
      NoFib approves:
      ```
      NoFib Results
      
      --------------------------------------------------------------------------------
              Program         Allocs    Instrs
      --------------------------------------------------------------------------------
                 anna          +0.1%     +0.1%
             nucleic2          -1.2%     -0.6%
                sched           0.0%     +0.9%
            transform          -0.0%     -0.1%
      --------------------------------------------------------------------------------
                  Min          -1.2%     -0.6%
                  Max          +0.1%     +0.9%
       Geometric Mean          -0.0%     +0.0%
      ```
      
      Fixes #19232.
      df2eca94
  16. Oct 14, 2020
  17. Jan 22, 2017
  18. Jun 20, 2016
  19. Jun 28, 2014
    • Herbert Valerio Riedel's avatar
      Simplify .gitignore files · 767b9ddf
      Herbert Valerio Riedel authored
      
      It's a bit confusing to have .gitignore files spread all over the
      filesystem. This commit tries to consolidate those into one .gitignore
      file per component. Moreover, we try to describe files to be ignored which
      happen to have a common identifying pattern by glob patterns.
      
      Signed-off-by: Herbert Valerio Riedel's avatarHerbert Valerio Riedel <hvr@gnu.org>
      767b9ddf
  20. May 30, 2014
  21. Nov 28, 2013
  22. Sep 08, 2013
  23. Feb 07, 2013
    • Ian Lynagh's avatar
      Pass the test name to the test options · effc8af9
      Ian Lynagh authored
      This allows them to give framework failures.
      
      I also had to change how setTestOpts works. Now, rather than applying
      the options to the directory's "default options", it just stores the
      options to be applied for each test (i.e. once we know the test name).
      effc8af9
  24. Jul 20, 2011
Loading