Andreas Klebinger pushed to branch wip/andreask/occ_anal_tuning at Glasgow Haskell Compiler / GHC

Commits:

5 changed files:

Changes:

  • compiler/GHC/Core/Opt/OccurAnal.hs
    ... ... @@ -9,6 +9,8 @@
    9 9
     -- many /other/ arguments the function has.  Inconsistent unboxing is very
    
    10 10
     -- bad for performance, so I increased the limit to allow it to unbox
    
    11 11
     -- consistently.
    
    12
    +-- AK: Seems we no longer unbox OccEnv now anyway so it might be redundant.
    
    13
    +
    
    12 14
     
    
    13 15
     {-
    
    14 16
     (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
    
    ... ... @@ -967,6 +969,11 @@ occAnalBind
    967 969
       -> ([CoreBind] -> r -> r)          -- How to combine the scope with new binds
    
    968 970
       -> WithUsageDetails r              -- Of the whole let(rec)
    
    969 971
     
    
    972
    +-- While not allocating any less inlining occAnalBind turns calls to the passed functions
    
    973
    +-- into known calls. One might assume this doesn't matter, but for let heavy
    
    974
    +-- code I observed speed ups as big as 10-20%!
    
    975
    +{-# INLINE occAnalBind #-}
    
    976
    +
    
    970 977
     occAnalBind env lvl ire (Rec pairs) thing_inside combine
    
    971 978
       = addInScopeList env (map fst pairs) $ \env ->
    
    972 979
         let WUD body_uds body'  = thing_inside env
    
    ... ... @@ -984,7 +991,7 @@ occAnalBind !env lvl ire (NonRec bndr rhs) thing_inside combine
    984 991
       = -- Analyse the RHS and /then/ the body
    
    985 992
         let -- Analyse the rhs first, generating rhs_uds
    
    986 993
             !(rhs_uds_s, bndr', rhs') = occAnalNonRecRhs env lvl ire mb_join bndr rhs
    
    987
    -        rhs_uds = foldr1 orUDs rhs_uds_s   -- NB: orUDs.  See (W4) of
    
    994
    +        rhs_uds = foldl1' orUDs rhs_uds_s   -- NB: orUDs.  See (W4) of
    
    988 995
                                                -- Note [Occurrence analysis for join points]
    
    989 996
     
    
    990 997
             -- Now analyse the body, adding the join point
    
    ... ... @@ -1049,6 +1056,7 @@ occAnalNonRecRhs !env lvl imp_rule_edges mb_join bndr rhs
    1049 1056
         -- Match join arity O from mb_join_arity with manifest join arity M as
    
    1050 1057
         -- returned by of occAnalLamTail. It's totally OK for them to mismatch;
    
    1051 1058
         -- hence adjust the UDs from the RHS
    
    1059
    +
    
    1052 1060
         WUD adj_rhs_uds final_rhs = adjustNonRecRhs mb_join $
    
    1053 1061
                                     occAnalLamTail rhs_env rhs
    
    1054 1062
         final_bndr_with_rules
    
    ... ... @@ -2188,7 +2196,8 @@ occ_anal_lam_tail env expr@(Lam {})
    2188 2196
         go env rev_bndrs body
    
    2189 2197
           = addInScope env rev_bndrs $ \env ->
    
    2190 2198
             let !(WUD usage body') = occ_anal_lam_tail env body
    
    2191
    -            wrap_lam body bndr = Lam (tagLamBinder usage bndr) body
    
    2199
    +            wrap_lam !body !bndr = let !bndr' = tagLamBinder usage bndr
    
    2200
    +                                   in Lam bndr' body
    
    2192 2201
             in WUD (usage `addLamCoVarOccs` rev_bndrs)
    
    2193 2202
                    (foldl' wrap_lam body' rev_bndrs)
    
    2194 2203
     
    
    ... ... @@ -2541,7 +2550,7 @@ occAnal env (Case scrut bndr ty alts)
    2541 2550
                let alt_env = addBndrSwap scrut' bndr $
    
    2542 2551
                              setTailCtxt env  -- Kill off OccRhs
    
    2543 2552
                    WUD alts_usage alts' = do_alts alt_env alts
    
    2544
    -               tagged_bndr = tagLamBinder alts_usage bndr
    
    2553
    +               !tagged_bndr = tagLamBinder alts_usage bndr
    
    2545 2554
                in WUD alts_usage (tagged_bndr, alts')
    
    2546 2555
     
    
    2547 2556
           total_usage = markAllNonTail scrut_usage `andUDs` alts_usage
    
    ... ... @@ -2559,11 +2568,12 @@ occAnal env (Case scrut bndr ty alts)
    2559 2568
         do_alt !env (Alt con bndrs rhs)
    
    2560 2569
           = addInScopeList env bndrs $ \ env ->
    
    2561 2570
             let WUD rhs_usage rhs' = occAnal env rhs
    
    2562
    -            tagged_bndrs = tagLamBinders rhs_usage bndrs
    
    2571
    +            !tagged_bndrs = tagLamBinders rhs_usage bndrs
    
    2563 2572
             in                 -- See Note [Binders in case alternatives]
    
    2564 2573
             WUD rhs_usage (Alt con tagged_bndrs rhs')
    
    2565 2574
     
    
    2566 2575
     occAnal env (Let bind body)
    
    2576
    +  -- TODO: Would be nice to use a strict version of mkLets here
    
    2567 2577
       = occAnalBind env NotTopLevel noImpRuleEdges bind
    
    2568 2578
                     (\env -> occAnal env body) mkLets
    
    2569 2579
     
    
    ... ... @@ -2644,10 +2654,12 @@ occAnalApp !env (Var fun, args, ticks)
    2644 2654
       | fun `hasKey` runRWKey
    
    2645 2655
       , [t1, t2, arg]  <- args
    
    2646 2656
       , WUD usage arg' <- adjustNonRecRhs (JoinPoint 1) $ occAnalLamTail env arg
    
    2647
    -  = WUD usage (mkTicks ticks $ mkApps (Var fun) [t1, t2, arg'])
    
    2657
    +  = let app_out = (mkTicks ticks $ mkApps (Var fun) [t1, t2, arg'])
    
    2658
    +    in WUD usage app_out
    
    2648 2659
     
    
    2649 2660
     occAnalApp env (Var fun_id, args, ticks)
    
    2650
    -  = WUD all_uds (mkTicks ticks app')
    
    2661
    +  = let app_out = (mkTicks ticks app')
    
    2662
    +    in WUD all_uds app_out
    
    2651 2663
       where
    
    2652 2664
         -- Lots of banged bindings: this is a very heavily bit of code,
    
    2653 2665
         -- so it pays not to make lots of thunks here, all of which
    
    ... ... @@ -2692,8 +2704,9 @@ occAnalApp env (Var fun_id, args, ticks)
    2692 2704
             -- See Note [Sources of one-shot information], bullet point A']
    
    2693 2705
     
    
    2694 2706
     occAnalApp env (fun, args, ticks)
    
    2695
    -  = WUD (markAllNonTail (fun_uds `andUDs` args_uds))
    
    2696
    -                     (mkTicks ticks app')
    
    2707
    +  = let app_out = (mkTicks ticks app')
    
    2708
    +    in WUD (markAllNonTail (fun_uds `andUDs` args_uds)) app_out
    
    2709
    +
    
    2697 2710
       where
    
    2698 2711
         !(WUD args_uds app') = occAnalArgs env fun' args []
    
    2699 2712
         !(WUD fun_uds fun')  = occAnal (addAppCtxt env args) fun
    
    ... ... @@ -3650,8 +3663,8 @@ data WithTailUsageDetails a = WTUD !TailUsageDetails !a
    3650 3663
     -------------------
    
    3651 3664
     -- UsageDetails API
    
    3652 3665
     
    
    3653
    -andUDs, orUDs
    
    3654
    -        :: UsageDetails -> UsageDetails -> UsageDetails
    
    3666
    +andUDs:: UsageDetails -> UsageDetails -> UsageDetails
    
    3667
    +orUDs :: UsageDetails -> UsageDetails -> UsageDetails
    
    3655 3668
     andUDs = combineUsageDetailsWith andLocalOcc
    
    3656 3669
     orUDs  = combineUsageDetailsWith orLocalOcc
    
    3657 3670
     
    
    ... ... @@ -3766,10 +3779,12 @@ combineUsageDetailsWith plus_occ_info
    3766 3779
       | isEmptyVarEnv env1 = uds2
    
    3767 3780
       | isEmptyVarEnv env2 = uds1
    
    3768 3781
       | otherwise
    
    3769
    -  = UD { ud_env       = plusVarEnv_C plus_occ_info env1 env2
    
    3770
    -       , ud_z_many    = plusVarEnv z_many1   z_many2
    
    3782
    +  -- Using strictPlusVarEnv here speeds up the test T26425 by about 10% by avoiding
    
    3783
    +  -- intermediate thunks.
    
    3784
    +  = UD { ud_env       = strictPlusVarEnv_C plus_occ_info env1 env2
    
    3785
    +       , ud_z_many    = strictPlusVarEnv z_many1   z_many2
    
    3771 3786
            , ud_z_in_lam  = plusVarEnv z_in_lam1 z_in_lam2
    
    3772
    -       , ud_z_tail    = plusVarEnv z_tail1   z_tail2 }
    
    3787
    +       , ud_z_tail    = strictPlusVarEnv z_tail1   z_tail2 }
    
    3773 3788
     
    
    3774 3789
     lookupLetOccInfo :: UsageDetails -> Id -> OccInfo
    
    3775 3790
     -- Don't use locally-generated occ_info for exported (visible-elsewhere)
    
    ... ... @@ -3847,7 +3862,7 @@ tagLamBinders :: UsageDetails -- Of scope
    3847 3862
                   -> [Id]                -- Binders
    
    3848 3863
                   -> [IdWithOccInfo]     -- Tagged binders
    
    3849 3864
     tagLamBinders usage binders
    
    3850
    -  = map (tagLamBinder usage) binders
    
    3865
    +  = strictMap (tagLamBinder usage) binders
    
    3851 3866
     
    
    3852 3867
     tagLamBinder :: UsageDetails       -- Of scope
    
    3853 3868
                  -> Id                 -- Binder
    

  • compiler/GHC/Types/Unique/FM.hs
    ... ... @@ -51,7 +51,9 @@ module GHC.Types.Unique.FM (
    51 51
             delListFromUFM,
    
    52 52
             delListFromUFM_Directly,
    
    53 53
             plusUFM,
    
    54
    +        strictPlusUFM,
    
    54 55
             plusUFM_C,
    
    56
    +        strictPlusUFM_C,
    
    55 57
             plusUFM_CD,
    
    56 58
             plusUFM_CD2,
    
    57 59
             mergeUFM,
    
    ... ... @@ -261,16 +263,24 @@ delListFromUFM_Directly = foldl' delFromUFM_Directly
    261 263
     delFromUFM_Directly :: UniqFM key elt -> Unique -> UniqFM key elt
    
    262 264
     delFromUFM_Directly (UFM m) u = UFM (M.delete (getKey u) m)
    
    263 265
     
    
    264
    --- Bindings in right argument shadow those in the left
    
    266
    +-- | Bindings in right argument shadow those in the left.
    
    267
    +--
    
    268
    +-- Unlike containers this union is right-biased for historic reasons.
    
    265 269
     plusUFM :: UniqFM key elt -> UniqFM key elt -> UniqFM key elt
    
    266
    --- M.union is left-biased, plusUFM should be right-biased.
    
    267 270
     plusUFM (UFM x) (UFM y) = UFM (M.union y x)
    
    268 271
          -- Note (M.union y x), with arguments flipped
    
    269 272
          -- M.union is left-biased, plusUFM should be right-biased.
    
    270 273
     
    
    274
    +-- | Right biased
    
    275
    +strictPlusUFM :: UniqFM key elt -> UniqFM key elt -> UniqFM key elt
    
    276
    +strictPlusUFM (UFM x) (UFM y) = UFM (MS.union y x)
    
    277
    +
    
    271 278
     plusUFM_C :: (elt -> elt -> elt) -> UniqFM key elt -> UniqFM key elt -> UniqFM key elt
    
    272 279
     plusUFM_C f (UFM x) (UFM y) = UFM (M.unionWith f x y)
    
    273 280
     
    
    281
    +strictPlusUFM_C :: (elt -> elt -> elt) -> UniqFM key elt -> UniqFM key elt -> UniqFM key elt
    
    282
    +strictPlusUFM_C f (UFM x) (UFM y) = UFM (MS.unionWith f x y)
    
    283
    +
    
    274 284
     -- | `plusUFM_CD f m1 d1 m2 d2` merges the maps using `f` as the
    
    275 285
     -- combinding function and `d1` resp. `d2` as the default value if
    
    276 286
     -- there is no entry in `m1` reps. `m2`. The domain is the union of
    

  • compiler/GHC/Types/Var/Env.hs
    ... ... @@ -12,7 +12,8 @@ module GHC.Types.Var.Env (
    12 12
             elemVarEnv, disjointVarEnv, anyVarEnv,
    
    13 13
             extendVarEnv, extendVarEnv_C, extendVarEnv_Acc,
    
    14 14
             extendVarEnvList,
    
    15
    -        plusVarEnv, plusVarEnv_C, plusVarEnv_CD, plusMaybeVarEnv_C,
    
    15
    +        strictPlusVarEnv, plusVarEnv, plusVarEnv_C, strictPlusVarEnv_C,
    
    16
    +        plusVarEnv_CD, plusMaybeVarEnv_C,
    
    16 17
             plusVarEnvList, alterVarEnv,
    
    17 18
             delVarEnvList, delVarEnv,
    
    18 19
             minusVarEnv,
    
    ... ... @@ -511,6 +512,7 @@ extendVarEnv :: VarEnv a -> Var -> a -> VarEnv a
    511 512
     extendVarEnv_C    :: (a->a->a) -> VarEnv a -> Var -> a -> VarEnv a
    
    512 513
     extendVarEnv_Acc  :: (a->b->b) -> (a->b) -> VarEnv b -> Var -> a -> VarEnv b
    
    513 514
     plusVarEnv        :: VarEnv a -> VarEnv a -> VarEnv a
    
    515
    +strictPlusVarEnv  :: VarEnv a -> VarEnv a -> VarEnv a
    
    514 516
     plusVarEnvList    :: [VarEnv a] -> VarEnv a
    
    515 517
     extendVarEnvList  :: VarEnv a -> [(Var, a)] -> VarEnv a
    
    516 518
     varEnvDomain      :: VarEnv elt -> UnVarSet
    
    ... ... @@ -522,6 +524,7 @@ delVarEnvList :: Foldable f => VarEnv a -> f Var -> VarEnv a
    522 524
     delVarEnv         :: VarEnv a -> Var -> VarEnv a
    
    523 525
     minusVarEnv       :: VarEnv a -> VarEnv b -> VarEnv a
    
    524 526
     plusVarEnv_C      :: (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
    
    527
    +strictPlusVarEnv_C :: (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
    
    525 528
     plusVarEnv_CD     :: (a -> a -> a) -> VarEnv a -> a -> VarEnv a -> a -> VarEnv a
    
    526 529
     plusMaybeVarEnv_C :: (a -> a -> Maybe a) -> VarEnv a -> VarEnv a -> VarEnv a
    
    527 530
     mapVarEnv         :: (a -> b) -> VarEnv a -> VarEnv b
    
    ... ... @@ -548,6 +551,7 @@ extendVarEnv_C = addToUFM_C
    548 551
     extendVarEnv_Acc = addToUFM_Acc
    
    549 552
     extendVarEnvList = addListToUFM
    
    550 553
     plusVarEnv_C     = plusUFM_C
    
    554
    +strictPlusVarEnv_C = strictPlusUFM_C
    
    551 555
     plusVarEnv_CD    = plusUFM_CD
    
    552 556
     plusMaybeVarEnv_C = plusMaybeUFM_C
    
    553 557
     delVarEnvList    = delListFromUFM
    
    ... ... @@ -556,6 +560,7 @@ delVarEnvList = delListFromUFM
    556 560
     delVarEnv        = delFromUFM
    
    557 561
     minusVarEnv      = minusUFM
    
    558 562
     plusVarEnv       = plusUFM
    
    563
    +strictPlusVarEnv = strictPlusUFM
    
    559 564
     plusVarEnvList   = plusUFMList
    
    560 565
     -- lookupVarEnv is very hot (in part due to being called by substTyVar),
    
    561 566
     -- if it's not inlined than the mere allocation of the Just constructor causes
    

  • testsuite/tests/perf/compiler/T26425.hs
    1
    +{-# LANGUAGE OverloadedStrings #-}
    
    2
    +
    
    3
    +module Reproducer (strToInt) where
    
    4
    +
    
    5
    +import qualified Data.Text as T
    
    6
    +
    
    7
    +{- This program results in a nested chain of join points and cases which tests
    
    8
    +   primarily OccAnal and Unfolding performance.
    
    9
    +-}
    
    10
    +
    
    11
    +strToInt :: T.Text -> Maybe Int
    
    12
    +strToInt txt = case txt of
    
    13
    +    "0" -> Just 0
    
    14
    +    "1" -> Just 1
    
    15
    +    "2" -> Just 2
    
    16
    +    "3" -> Just 3
    
    17
    +    "4" -> Just 4
    
    18
    +    "5" -> Just 5
    
    19
    +    "6" -> Just 6
    
    20
    +    "7" -> Just 7
    
    21
    +    "8" -> Just 8
    
    22
    +    "9" -> Just 9
    
    23
    +    "10" -> Just 10
    
    24
    +    "11" -> Just 11
    
    25
    +    "12" -> Just 12
    
    26
    +    "13" -> Just 13
    
    27
    +    "14" -> Just 14
    
    28
    +    "15" -> Just 15
    
    29
    +    "16" -> Just 16
    
    30
    +    "17" -> Just 17
    
    31
    +    "18" -> Just 18
    
    32
    +    "19" -> Just 19
    
    33
    +    "20" -> Just 20
    
    34
    +    "21" -> Just 21
    
    35
    +    "22" -> Just 22
    
    36
    +    "23" -> Just 23
    
    37
    +    "24" -> Just 24
    
    38
    +    "25" -> Just 25
    
    39
    +    "26" -> Just 26
    
    40
    +    "27" -> Just 27
    
    41
    +    "28" -> Just 28
    
    42
    +    "29" -> Just 29
    
    43
    +    "30" -> Just 30
    
    44
    +    "31" -> Just 31
    
    45
    +    "32" -> Just 32
    
    46
    +    "33" -> Just 33
    
    47
    +    "34" -> Just 34
    
    48
    +    "35" -> Just 35
    
    49
    +    "36" -> Just 36
    
    50
    +    "37" -> Just 37
    
    51
    +    "38" -> Just 38
    
    52
    +    "39" -> Just 39
    
    53
    +    "40" -> Just 40
    
    54
    +    "41" -> Just 41
    
    55
    +    "42" -> Just 42
    
    56
    +    "43" -> Just 43
    
    57
    +    "44" -> Just 44
    
    58
    +    "45" -> Just 45
    
    59
    +    "46" -> Just 46
    
    60
    +    "47" -> Just 47
    
    61
    +    "48" -> Just 48
    
    62
    +    "49" -> Just 49
    
    63
    +    "50" -> Just 50
    
    64
    +    "51" -> Just 51
    
    65
    +    "52" -> Just 52
    
    66
    +    "53" -> Just 53
    
    67
    +    "54" -> Just 54
    
    68
    +    "55" -> Just 55
    
    69
    +    "56" -> Just 56
    
    70
    +    "57" -> Just 57
    
    71
    +    "58" -> Just 58
    
    72
    +    "59" -> Just 59
    
    73
    +    "60" -> Just 60
    
    74
    +    "61" -> Just 61
    
    75
    +    "62" -> Just 62
    
    76
    +    "63" -> Just 63
    
    77
    +    "64" -> Just 64
    
    78
    +    "65" -> Just 65
    
    79
    +    "66" -> Just 66
    
    80
    +    "67" -> Just 67
    
    81
    +    "68" -> Just 68
    
    82
    +    "69" -> Just 69
    
    83
    +    "70" -> Just 70
    
    84
    +    "71" -> Just 71
    
    85
    +    "72" -> Just 72
    
    86
    +    "73" -> Just 73
    
    87
    +    "74" -> Just 74
    
    88
    +    "75" -> Just 75
    
    89
    +    "76" -> Just 76
    
    90
    +    "77" -> Just 77
    
    91
    +    "78" -> Just 78
    
    92
    +    "79" -> Just 79
    
    93
    +    "80" -> Just 80
    
    94
    +    "81" -> Just 81
    
    95
    +    "82" -> Just 82
    
    96
    +    "83" -> Just 83
    
    97
    +    "84" -> Just 84
    
    98
    +    "85" -> Just 85
    
    99
    +    "86" -> Just 86
    
    100
    +    "87" -> Just 87
    
    101
    +    "88" -> Just 88
    
    102
    +    "89" -> Just 89
    
    103
    +    "90" -> Just 90
    
    104
    +    "91" -> Just 91
    
    105
    +    "92" -> Just 92
    
    106
    +    "93" -> Just 93
    
    107
    +    "94" -> Just 94
    
    108
    +    "95" -> Just 95
    
    109
    +    "96" -> Just 96
    
    110
    +    "97" -> Just 97
    
    111
    +    "98" -> Just 98
    
    112
    +    "99" -> Just 99
    
    113
    +    "100" -> Just 100
    
    114
    +    "101" -> Just 101
    
    115
    +    "102" -> Just 102
    
    116
    +    "103" -> Just 103
    
    117
    +    "104" -> Just 104
    
    118
    +    "105" -> Just 105
    
    119
    +    "106" -> Just 106
    
    120
    +    "107" -> Just 107
    
    121
    +    "108" -> Just 108
    
    122
    +    "109" -> Just 109
    
    123
    +    "110" -> Just 110
    
    124
    +    "111" -> Just 111
    
    125
    +    "112" -> Just 112
    
    126
    +    "113" -> Just 113
    
    127
    +    "114" -> Just 114
    
    128
    +    "115" -> Just 115
    
    129
    +    "116" -> Just 116
    
    130
    +    "117" -> Just 117
    
    131
    +    "118" -> Just 118
    
    132
    +    "119" -> Just 119
    
    133
    +    "120" -> Just 120
    
    134
    +    "121" -> Just 121
    
    135
    +    "122" -> Just 122
    
    136
    +    "123" -> Just 123
    
    137
    +    "124" -> Just 124
    
    138
    +    "125" -> Just 125
    
    139
    +    "126" -> Just 126
    
    140
    +    "127" -> Just 127
    
    141
    +    "128" -> Just 128
    
    142
    +    "129" -> Just 129
    
    143
    +    "130" -> Just 130
    
    144
    +    "131" -> Just 131
    
    145
    +    "132" -> Just 132
    
    146
    +    "133" -> Just 133
    
    147
    +    "134" -> Just 134
    
    148
    +    "135" -> Just 135
    
    149
    +    "136" -> Just 136
    
    150
    +    "137" -> Just 137
    
    151
    +    "138" -> Just 138
    
    152
    +    "139" -> Just 139
    
    153
    +    "140" -> Just 140
    
    154
    +    "141" -> Just 141
    
    155
    +    "142" -> Just 142
    
    156
    +    "143" -> Just 143
    
    157
    +    "144" -> Just 144
    
    158
    +    "145" -> Just 145
    
    159
    +    "146" -> Just 146
    
    160
    +    "147" -> Just 147
    
    161
    +    "148" -> Just 148
    
    162
    +    "149" -> Just 149
    
    163
    +    "150" -> Just 150
    
    164
    +    "151" -> Just 151
    
    165
    +    "152" -> Just 152
    
    166
    +    "153" -> Just 153
    
    167
    +    "154" -> Just 154
    
    168
    +    "155" -> Just 155
    
    169
    +    "156" -> Just 156
    
    170
    +    "157" -> Just 157
    
    171
    +    "158" -> Just 158
    
    172
    +    "159" -> Just 159
    
    173
    +    "160" -> Just 160
    
    174
    +    "161" -> Just 161
    
    175
    +    "162" -> Just 162
    
    176
    +    "163" -> Just 163
    
    177
    +    "164" -> Just 164
    
    178
    +    "165" -> Just 165
    
    179
    +    "166" -> Just 166
    
    180
    +    "167" -> Just 167
    
    181
    +    "168" -> Just 168
    
    182
    +    "169" -> Just 169
    
    183
    +    "170" -> Just 170
    
    184
    +    "171" -> Just 171
    
    185
    +    "172" -> Just 172
    
    186
    +    "173" -> Just 173
    
    187
    +    "174" -> Just 174
    
    188
    +    "175" -> Just 175
    
    189
    +    "176" -> Just 176
    
    190
    +    "177" -> Just 177
    
    191
    +    "178" -> Just 178
    
    192
    +    "179" -> Just 179
    
    193
    +    "180" -> Just 180
    
    194
    +    "181" -> Just 181
    
    195
    +    "182" -> Just 182
    
    196
    +    "183" -> Just 183
    
    197
    +    "184" -> Just 184
    
    198
    +    "185" -> Just 185
    
    199
    +    "186" -> Just 186
    
    200
    +    "187" -> Just 187
    
    201
    +    "188" -> Just 188
    
    202
    +    "189" -> Just 189
    
    203
    +    "190" -> Just 190
    
    204
    +    "191" -> Just 191
    
    205
    +    "192" -> Just 192
    
    206
    +    "193" -> Just 193
    
    207
    +    "194" -> Just 194
    
    208
    +    "195" -> Just 195
    
    209
    +    "196" -> Just 196
    
    210
    +    "197" -> Just 197
    
    211
    +    "198" -> Just 198
    
    212
    +    "199" -> Just 199
    
    213
    +    "200" -> Just 200
    
    214
    +    "201" -> Just 201
    
    215
    +    "202" -> Just 202
    
    216
    +    "203" -> Just 203
    
    217
    +    "204" -> Just 204
    
    218
    +    "205" -> Just 205
    
    219
    +    "206" -> Just 206
    
    220
    +    "207" -> Just 207
    
    221
    +    "208" -> Just 208
    
    222
    +    "209" -> Just 209
    
    223
    +    "210" -> Just 210
    
    224
    +    "211" -> Just 211
    
    225
    +    "212" -> Just 212
    
    226
    +    "213" -> Just 213
    
    227
    +    "214" -> Just 214
    
    228
    +    "215" -> Just 215
    
    229
    +    "216" -> Just 216
    
    230
    +    "217" -> Just 217
    
    231
    +    "218" -> Just 218
    
    232
    +    "219" -> Just 219
    
    233
    +    "220" -> Just 220
    
    234
    +    "221" -> Just 221
    
    235
    +    "222" -> Just 222
    
    236
    +    "223" -> Just 223
    
    237
    +    "224" -> Just 224
    
    238
    +    "225" -> Just 225
    
    239
    +    "226" -> Just 226
    
    240
    +    "227" -> Just 227
    
    241
    +    "228" -> Just 228
    
    242
    +    "229" -> Just 229
    
    243
    +    "230" -> Just 230
    
    244
    +    "231" -> Just 231
    
    245
    +    "232" -> Just 232
    
    246
    +    "233" -> Just 233
    
    247
    +    "234" -> Just 234
    
    248
    +    "235" -> Just 235
    
    249
    +    "236" -> Just 236
    
    250
    +    "237" -> Just 237
    
    251
    +    "238" -> Just 238
    
    252
    +    "239" -> Just 239
    
    253
    +    "240" -> Just 240
    
    254
    +    "241" -> Just 241
    
    255
    +    "242" -> Just 242
    
    256
    +    "243" -> Just 243
    
    257
    +    "244" -> Just 244
    
    258
    +    "245" -> Just 245
    
    259
    +    "246" -> Just 246
    
    260
    +    "247" -> Just 247
    
    261
    +    "248" -> Just 248
    
    262
    +    "249" -> Just 249
    
    263
    +    "250" -> Just 250
    
    264
    +    "251" -> Just 251
    
    265
    +    "252" -> Just 252
    
    266
    +    "253" -> Just 253
    
    267
    +    "254" -> Just 254
    
    268
    +    "255" -> Just 255
    
    269
    +    "256" -> Just 256
    
    270
    +    "257" -> Just 257
    
    271
    +    "258" -> Just 258
    
    272
    +    "259" -> Just 259
    
    273
    +    "260" -> Just 260
    
    274
    +    "261" -> Just 261
    
    275
    +    "262" -> Just 262
    
    276
    +    "263" -> Just 263
    
    277
    +    "264" -> Just 264
    
    278
    +    "265" -> Just 265
    
    279
    +    "266" -> Just 266
    
    280
    +    "267" -> Just 267
    
    281
    +    "268" -> Just 268
    
    282
    +    "269" -> Just 269
    
    283
    +    "270" -> Just 270
    
    284
    +    "271" -> Just 271
    
    285
    +    "272" -> Just 272
    
    286
    +    "273" -> Just 273
    
    287
    +    "274" -> Just 274
    
    288
    +    "275" -> Just 275
    
    289
    +    "276" -> Just 276
    
    290
    +    "277" -> Just 277
    
    291
    +    "278" -> Just 278
    
    292
    +    "279" -> Just 279
    
    293
    +    "280" -> Just 280
    
    294
    +    "281" -> Just 281
    
    295
    +    "282" -> Just 282
    
    296
    +    "283" -> Just 283
    
    297
    +    "284" -> Just 284
    
    298
    +    "285" -> Just 285
    
    299
    +    "286" -> Just 286
    
    300
    +    "287" -> Just 287
    
    301
    +    "288" -> Just 288
    
    302
    +    "289" -> Just 289
    
    303
    +    "290" -> Just 290
    
    304
    +    "291" -> Just 291
    
    305
    +    "292" -> Just 292
    
    306
    +    "293" -> Just 293
    
    307
    +    "294" -> Just 294
    
    308
    +    "295" -> Just 295
    
    309
    +    "296" -> Just 296
    
    310
    +    "297" -> Just 297
    
    311
    +    "298" -> Just 298
    
    312
    +    "299" -> Just 299
    
    313
    +    "300" -> Just 300
    
    314
    +    "301" -> Just 301
    
    315
    +    "302" -> Just 302
    
    316
    +    "303" -> Just 303
    
    317
    +    "304" -> Just 304
    
    318
    +    "305" -> Just 305
    
    319
    +    "306" -> Just 306
    
    320
    +    "307" -> Just 307
    
    321
    +    "308" -> Just 308
    
    322
    +    "309" -> Just 309
    
    323
    +    "310" -> Just 310
    
    324
    +    "311" -> Just 311
    
    325
    +    "312" -> Just 312
    
    326
    +    "313" -> Just 313
    
    327
    +    "314" -> Just 314
    
    328
    +    "315" -> Just 315
    
    329
    +    "316" -> Just 316
    
    330
    +    "317" -> Just 317
    
    331
    +    "318" -> Just 318
    
    332
    +    "319" -> Just 319
    
    333
    +    "320" -> Just 320
    
    334
    +    "321" -> Just 321
    
    335
    +    "322" -> Just 322
    
    336
    +    "323" -> Just 323
    
    337
    +    "324" -> Just 324
    
    338
    +    "325" -> Just 325
    
    339
    +    "326" -> Just 326
    
    340
    +    "327" -> Just 327
    
    341
    +    "328" -> Just 328
    
    342
    +    "329" -> Just 329
    
    343
    +    "330" -> Just 330
    
    344
    +    "331" -> Just 331
    
    345
    +    "332" -> Just 332
    
    346
    +    "333" -> Just 333
    
    347
    +    "334" -> Just 334
    
    348
    +    "335" -> Just 335
    
    349
    +    "336" -> Just 336
    
    350
    +    "337" -> Just 337
    
    351
    +    "338" -> Just 338
    
    352
    +    "339" -> Just 339
    
    353
    +    "340" -> Just 340
    
    354
    +    "341" -> Just 341
    
    355
    +    "342" -> Just 342
    
    356
    +    "343" -> Just 343
    
    357
    +    "344" -> Just 344
    
    358
    +    "345" -> Just 345
    
    359
    +    "346" -> Just 346
    
    360
    +    "347" -> Just 347
    
    361
    +    "348" -> Just 348
    
    362
    +    "349" -> Just 349
    
    363
    +    "350" -> Just 350
    
    364
    +    "351" -> Just 351
    
    365
    +    "352" -> Just 352
    
    366
    +    "353" -> Just 353
    
    367
    +    "354" -> Just 354
    
    368
    +    "355" -> Just 355
    
    369
    +    "356" -> Just 356
    
    370
    +    "357" -> Just 357
    
    371
    +    "358" -> Just 358
    
    372
    +    "359" -> Just 359
    
    373
    +    "360" -> Just 360
    
    374
    +    "361" -> Just 361
    
    375
    +    "362" -> Just 362
    
    376
    +    "363" -> Just 363
    
    377
    +    "364" -> Just 364
    
    378
    +    "365" -> Just 365
    
    379
    +    "366" -> Just 366
    
    380
    +    "367" -> Just 367
    
    381
    +    "368" -> Just 368
    
    382
    +    "369" -> Just 369
    
    383
    +    "370" -> Just 370
    
    384
    +    "371" -> Just 371
    
    385
    +    "372" -> Just 372
    
    386
    +    "373" -> Just 373
    
    387
    +    "374" -> Just 374
    
    388
    +    "375" -> Just 375
    
    389
    +    "376" -> Just 376
    
    390
    +    "377" -> Just 377
    
    391
    +    "378" -> Just 378
    
    392
    +    "379" -> Just 379
    
    393
    +    "380" -> Just 380
    
    394
    +    "381" -> Just 381
    
    395
    +    "382" -> Just 382
    
    396
    +    "383" -> Just 383
    
    397
    +    "384" -> Just 384
    
    398
    +    "385" -> Just 385
    
    399
    +    "386" -> Just 386
    
    400
    +    "387" -> Just 387
    
    401
    +    "388" -> Just 388
    
    402
    +    "389" -> Just 389
    
    403
    +    "390" -> Just 390
    
    404
    +    "391" -> Just 391
    
    405
    +    "392" -> Just 392
    
    406
    +    "393" -> Just 393
    
    407
    +    "394" -> Just 394
    
    408
    +    "395" -> Just 395
    
    409
    +    "396" -> Just 396
    
    410
    +    "397" -> Just 397
    
    411
    +    "398" -> Just 398
    
    412
    +    "399" -> Just 399
    
    413
    +    "400" -> Just 400
    
    414
    +    "401" -> Just 401
    
    415
    +    "402" -> Just 402
    
    416
    +    "403" -> Just 403
    
    417
    +    "404" -> Just 404
    
    418
    +    "405" -> Just 405
    
    419
    +    "406" -> Just 406
    
    420
    +    "407" -> Just 407
    
    421
    +    "408" -> Just 408
    
    422
    +    "409" -> Just 409
    
    423
    +    "410" -> Just 410
    
    424
    +    "411" -> Just 411
    
    425
    +    "412" -> Just 412
    
    426
    +    "413" -> Just 413
    
    427
    +    "414" -> Just 414
    
    428
    +    "415" -> Just 415
    
    429
    +    "416" -> Just 416
    
    430
    +    "417" -> Just 417
    
    431
    +    "418" -> Just 418
    
    432
    +    "419" -> Just 419
    
    433
    +    "420" -> Just 420
    
    434
    +    "421" -> Just 421
    
    435
    +    "422" -> Just 422
    
    436
    +    "423" -> Just 423
    
    437
    +    "424" -> Just 424
    
    438
    +    "425" -> Just 425
    
    439
    +    "426" -> Just 426
    
    440
    +    "427" -> Just 427
    
    441
    +    "428" -> Just 428
    
    442
    +    "429" -> Just 429
    
    443
    +    "430" -> Just 430
    
    444
    +    "431" -> Just 431
    
    445
    +    "432" -> Just 432
    
    446
    +    "433" -> Just 433
    
    447
    +    "434" -> Just 434
    
    448
    +    "435" -> Just 435
    
    449
    +    "436" -> Just 436
    
    450
    +    "437" -> Just 437
    
    451
    +    "438" -> Just 438
    
    452
    +    "439" -> Just 439
    
    453
    +    "440" -> Just 440
    
    454
    +    "441" -> Just 441
    
    455
    +    "442" -> Just 442
    
    456
    +    "443" -> Just 443
    
    457
    +    "444" -> Just 444
    
    458
    +    "445" -> Just 445
    
    459
    +    "446" -> Just 446
    
    460
    +    "447" -> Just 447
    
    461
    +    "448" -> Just 448
    
    462
    +    "449" -> Just 449
    
    463
    +    "450" -> Just 450
    
    464
    +    "451" -> Just 451
    
    465
    +    "452" -> Just 452
    
    466
    +    "453" -> Just 453
    
    467
    +    "454" -> Just 454
    
    468
    +    "455" -> Just 455
    
    469
    +    "456" -> Just 456
    
    470
    +    "457" -> Just 457
    
    471
    +    "458" -> Just 458
    
    472
    +    "459" -> Just 459
    
    473
    +    "460" -> Just 460
    
    474
    +    "461" -> Just 461
    
    475
    +    "462" -> Just 462
    
    476
    +    "463" -> Just 463
    
    477
    +    "464" -> Just 464
    
    478
    +    "465" -> Just 465
    
    479
    +    "466" -> Just 466
    
    480
    +    "467" -> Just 467
    
    481
    +    "468" -> Just 468
    
    482
    +    "469" -> Just 469
    
    483
    +    "470" -> Just 470
    
    484
    +    "471" -> Just 471
    
    485
    +    "472" -> Just 472
    
    486
    +    "473" -> Just 473
    
    487
    +    "474" -> Just 474
    
    488
    +    "475" -> Just 475
    
    489
    +    "476" -> Just 476
    
    490
    +    "477" -> Just 477
    
    491
    +    "478" -> Just 478
    
    492
    +    "479" -> Just 479
    
    493
    +    "480" -> Just 480
    
    494
    +    "481" -> Just 481
    
    495
    +    "482" -> Just 482
    
    496
    +    "483" -> Just 483
    
    497
    +    "484" -> Just 484
    
    498
    +    "485" -> Just 485
    
    499
    +    "486" -> Just 486
    
    500
    +    "487" -> Just 487
    
    501
    +    "488" -> Just 488
    
    502
    +    "489" -> Just 489
    
    503
    +    "490" -> Just 490
    
    504
    +    "491" -> Just 491
    
    505
    +    "492" -> Just 492
    
    506
    +    "493" -> Just 493
    
    507
    +    "494" -> Just 494
    
    508
    +    "495" -> Just 495
    
    509
    +    "496" -> Just 496
    
    510
    +    "497" -> Just 497
    
    511
    +    "498" -> Just 498
    
    512
    +    "499" -> Just 499
    
    513
    +    "500" -> Just 500
    
    514
    +    _ -> Nothing

  • testsuite/tests/perf/compiler/all.T
    ... ... @@ -806,3 +806,8 @@ test('interpreter_steplocal',
    806 806
          ],
    
    807 807
          ghci_script,
    
    808 808
          ['interpreter_steplocal.script'])
    
    809
    +
    
    810
    +test ('T26425',
    
    811
    +      [ collect_compiler_stats('all',5) ],
    
    812
    +      compile,
    
    813
    +      ['-O'])