Andreas Klebinger pushed to branch wip/andreask/occ_anal_tuning at Glasgow Haskell Compiler / GHC
Commits:
-
cb1ea0c9
by Andreas Klebinger at 2025-10-27T18:43:40+01:00
-
1434feb8
by Andreas Klebinger at 2025-10-27T18:47:18+01:00
6 changed files:
- compiler/GHC/Core/Opt/OccurAnal.hs
- compiler/GHC/Data/Graph/UnVar.hs
- compiler/GHC/Types/Unique/FM.hs
- compiler/GHC/Types/Var/Env.hs
- + testsuite/tests/perf/compiler/T26425.hs
- testsuite/tests/perf/compiler/all.T
Changes:
| ... | ... | @@ -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
|
| ... | ... | @@ -17,8 +17,8 @@ equal to g, but twice as expensive and large. |
| 17 | 17 | module GHC.Data.Graph.UnVar
|
| 18 | 18 | ( UnVarSet
|
| 19 | 19 | , emptyUnVarSet, mkUnVarSet, unionUnVarSet, unionUnVarSets
|
| 20 | - , extendUnVarSet, extendUnVarSetList, delUnVarSet, delUnVarSetList
|
|
| 21 | - , elemUnVarSet, isEmptyUnVarSet
|
|
| 20 | + , extendUnVarSet, extendUnVarSet_Directly, extendUnVarSetList, delUnVarSet, delUnVarSetList
|
|
| 21 | + , elemUnVarSet, elemUnVarSet_Directly, isEmptyUnVarSet
|
|
| 22 | 22 | , UnVarGraph
|
| 23 | 23 | , emptyUnVarGraph
|
| 24 | 24 | , unionUnVarGraph, unionUnVarGraphs
|
| ... | ... | @@ -60,6 +60,9 @@ emptyUnVarSet = UnVarSet S.empty |
| 60 | 60 | elemUnVarSet :: Var -> UnVarSet -> Bool
|
| 61 | 61 | elemUnVarSet v (UnVarSet s) = k v `S.member` s
|
| 62 | 62 | |
| 63 | +{-# INLINE elemUnVarSet_Directly #-}
|
|
| 64 | +elemUnVarSet_Directly :: Uniquable key => key -> UnVarSet -> Bool
|
|
| 65 | +elemUnVarSet_Directly v (UnVarSet s) = (getKey $ getUnique v) `S.member` s
|
|
| 63 | 66 | |
| 64 | 67 | isEmptyUnVarSet :: UnVarSet -> Bool
|
| 65 | 68 | isEmptyUnVarSet (UnVarSet s) = S.null s
|
| ... | ... | @@ -82,6 +85,10 @@ mkUnVarSet vs = UnVarSet $ S.fromList $ map k vs |
| 82 | 85 | extendUnVarSet :: Var -> UnVarSet -> UnVarSet
|
| 83 | 86 | extendUnVarSet v (UnVarSet s) = UnVarSet $ S.insert (k v) s
|
| 84 | 87 | |
| 88 | +{-# INLINE extendUnVarSet_Directly #-}
|
|
| 89 | +extendUnVarSet_Directly :: Uniquable key => key -> UnVarSet -> UnVarSet
|
|
| 90 | +extendUnVarSet_Directly u (UnVarSet s) = UnVarSet $ S.insert (getKey $ getUnique u) s
|
|
| 91 | + |
|
| 85 | 92 | extendUnVarSetList :: [Var] -> UnVarSet -> UnVarSet
|
| 86 | 93 | extendUnVarSetList vs s = s `unionUnVarSet` mkUnVarSet vs
|
| 87 | 94 |
| ... | ... | @@ -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
|
| ... | ... | @@ -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
|
| 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 |
| ... | ... | @@ -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']) |