X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FsimplCore%2FOccurAnal.lhs;h=2e07e089ed001833d69b0f901c4cadab0539c3ba;hb=f07f25fdbac2b885aea6aa62c0326840c85f7b59;hp=91e34f879e48e75a2025fc78ebed6187555a536a;hpb=72462499b891d5779c19f3bda03f96e24f9554ae;p=ghc-hetmet.git diff --git a/compiler/simplCore/OccurAnal.lhs b/compiler/simplCore/OccurAnal.lhs index 91e34f8..2e07e08 100644 --- a/compiler/simplCore/OccurAnal.lhs +++ b/compiler/simplCore/OccurAnal.lhs @@ -177,7 +177,7 @@ However things are made quite a bit more complicated by RULES. Remember "loop"? In particular, a RULE is like an equation for 'f' that is *always* inlined if it is applicable. We do *not* disable rules for loop-breakers. It's up to whoever makes the rules to - make sure that the rules themselves alwasys terminate. See Note + make sure that the rules themselves always terminate. See Note [Rules for recursive functions] in Simplify.lhs Hence, if @@ -533,15 +533,15 @@ reOrderCycle depth (bind : binds) pairs -- where df is the exported dictionary. Then df makes a really -- bad choice for loop breaker - | Just inl_rule_info <- isInlineRule_maybe (idUnfolding bndr) + | Just (inl_rule_info, _) <- isInlineRule_maybe (idUnfolding bndr) = case inl_rule_info of InlWrapper {} -> 10 -- Note [INLINE pragmas] _other -> 3 -- Data structures are more important than this -- so that dictionary/method recursion unravels - | is_con_app rhs = 5 -- Data types help with cases - -- Includes dict funs - -- Note [Constructor applictions] + | is_con_app rhs = 5 -- Data types help with cases: Note [Constructor applications] + -- Includes dict funs: Note [DFuns should not be loop breakers] + -- If an Id is marked "never inline" then it makes a great loop breaker -- The only reason for not checking that here is that it is rare @@ -555,8 +555,6 @@ reOrderCycle depth (bind : binds) pairs -- the Id has some kind of unfolding | otherwise = 0 - where - -- Checking for a constructor application -- Cheap and cheerful; the simplifer moves casts out of the way @@ -615,13 +613,14 @@ linear in the number of instance declarations. Note [INLINE pragmas] ~~~~~~~~~~~~~~~~~~~~~ -Never choose a function with an INLINE pramga as the loop breaker! +Avoid choosing a function with an INLINE pramga as the loop breaker! If such a function is mutually-recursive with a non-INLINE thing, then the latter should be the loop-breaker. -A particular case is wrappers generated by the demand analyser. -If you make then into a loop breaker you may get an infinite -inlining loop. For example: +Usually this is just a question of optimisation. But a particularly +bad case is wrappers generated by the demand analyser: if you make +then into a loop breaker you may get an infinite inlining loop. For +example: rec { $wfoo x = ....foo x.... @@ -645,6 +644,11 @@ happened when we gave is_con_app a lower score than inline candidates: Here we do *not* want to choose 'repTree' as the loop breaker. +Note [DFuns should not be loop breakers] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +It's particularly bad to make a DFun into a loop breaker. See +Note [How instance declarations are translated] in TcInstDcls + Note [Constructor applications] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It's really really important to inline dictionaries. Real