diff options
author | simonpj@microsoft.com <unknown> | 2010-05-25 11:28:07 +0000 |
---|---|---|
committer | simonpj@microsoft.com <unknown> | 2010-05-25 11:28:07 +0000 |
commit | f03b9562a92c6ef94c603a334d5d5e1cd2165c92 (patch) | |
tree | 9e70887c99d3f64790f6106f043b921260a36e21 /compiler/specialise/SpecConstr.lhs | |
parent | 757d3c5aa87ff18c0cd8a27870ffc5d7836338ed (diff) | |
download | haskell-f03b9562a92c6ef94c603a334d5d5e1cd2165c92.tar.gz |
Don't do SpecConstr on NOINLINE things (Trac #4064)
Since the RULE from specialising gets the same Activation as
the inlining for the Id itself there's no point in specialising
a NOINLINE thing, because the rule will be permanently switched
off.
See Note [Transfer activation] in SpecConstr
and Note [Auto-specialisation and RULES] in Specialise.
Diffstat (limited to 'compiler/specialise/SpecConstr.lhs')
-rw-r--r-- | compiler/specialise/SpecConstr.lhs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/compiler/specialise/SpecConstr.lhs b/compiler/specialise/SpecConstr.lhs index 4c0d92756a..84f8698188 100644 --- a/compiler/specialise/SpecConstr.lhs +++ b/compiler/specialise/SpecConstr.lhs @@ -36,6 +36,7 @@ import Var import VarEnv import VarSet import Name +import BasicTypes import DynFlags ( DynFlags(..) ) import StaticFlags ( opt_PprStyle_Debug ) import Maybes ( orElse, catMaybes, isJust, isNothing ) @@ -1172,6 +1173,7 @@ specialise specialise env force_spec bind_calls (RI fn _ arg_bndrs body arg_occs) spec_info@(SI specs spec_count mb_unspec) | not (isBottomingId fn) -- Note [Do not specialise diverging functions] + , not (isNeverActive (idInlineActivation fn)) -- See Note [Transfer activation] , notNull arg_bndrs -- Only specialise functions , Just all_calls <- lookupVarEnv bind_calls fn = do { (boring_call, pats) <- callsToPats env specs arg_occs all_calls @@ -1278,6 +1280,7 @@ spec_one env fn arg_bndrs body (call_pat@(qvars, pats), rule_number) rule_rhs = mkVarApps (Var spec_id) spec_call_args inline_act = idInlineActivation fn rule = mkLocalRule rule_name inline_act fn_name qvars pats rule_rhs + -- See Note [Transfer activation] ; return (spec_usg, OS call_pat rule spec_id spec_rhs) } calcSpecStrictness :: Id -- The original function @@ -1313,6 +1316,10 @@ specialised RHS, and that can lead directly to exponential behaviour. Note [Transfer activation] ~~~~~~~~~~~~~~~~~~~~~~~~~~ + This note is for SpecConstr, but exactly the same thing + happens in the overloading specialiser; see + Note [Auto-specialisation and RULES] in Specialise. + In which phase should the specialise-constructor rules be active? Originally I made them always-active, but Manuel found that this defeated some clever user-written rules. Then I made them active only @@ -1323,8 +1330,9 @@ simplCore/should_compile/spec-inline. So now I just use the inline-activation of the parent Id, as the activation for the specialiation RULE, just like the main specialiser; -see Note [Auto-specialisation and RULES] in Specialise. +This in turn means there is no point in specialising NOINLINE things, +so we test for that. Note [Transfer strictness] ~~~~~~~~~~~~~~~~~~~~~~~~~~ |