Comments only
authorsimonpj@microsoft.com <unknown>
Tue, 10 Nov 2009 17:18:46 +0000 (17:18 +0000)
committersimonpj@microsoft.com <unknown>
Tue, 10 Nov 2009 17:18:46 +0000 (17:18 +0000)
compiler/simplCore/OccurAnal.lhs

index f4eacd9..2e07e08 100644 (file)
@@ -539,9 +539,9 @@ reOrderCycle depth (bind : binds) pairs
             _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