projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Don't inline a loop breaker, even if it has an INLINE pragma
[ghc-hetmet.git]
/
compiler
/
simplCore
/
OccurAnal.lhs
diff --git
a/compiler/simplCore/OccurAnal.lhs
b/compiler/simplCore/OccurAnal.lhs
index
91e34f8
..
2e07e08
100644
(file)
--- 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
"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
[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
-- 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
= 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
-- 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
-- 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
-- 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]
~~~~~~~~~~~~~~~~~~~~~
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.
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....
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.
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
Note [Constructor applications]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It's really really important to inline dictionaries. Real