Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : ghc-7.2

http://hackage.haskell.org/trac/ghc/changeset/c669fe8e9ba45c8cc715b46bfb5dade003d20bb9

>---------------------------------------------------------------

commit c669fe8e9ba45c8cc715b46bfb5dade003d20bb9
Author: Simon Peyton Jones <[email protected]>
Date:   Thu Jul 21 12:45:51 2011 +0100

    When specialising recursive functions, mark the specialised function 
NOINLINE
    
    This fixes Trac #4903.  See Note [Specialising imported functions] in 
OccurAnal.

>---------------------------------------------------------------

 compiler/deSugar/DsBinds.lhs       |    7 +++++--
 compiler/specialise/Specialise.lhs |    3 +++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/compiler/deSugar/DsBinds.lhs b/compiler/deSugar/DsBinds.lhs
index 39e7e29..a878e74 100644
--- a/compiler/deSugar/DsBinds.lhs
+++ b/compiler/deSugar/DsBinds.lhs
@@ -517,8 +517,11 @@ dsSpec mb_poly_rhs (L loc (SpecPrag poly_id spec_co 
spec_inl))
        ; let spec_id  = mkLocalId spec_name spec_ty 
                            `setInlinePragma` inl_prag
                            `setIdUnfolding`  spec_unf
-             inl_prag | isDefaultInlinePragma spec_inl = idInlinePragma poly_id
-                     | otherwise                      = spec_inl
+             inl_prag | not (isDefaultInlinePragma spec_inl)    = spec_inl
+                     | not is_local_id  -- See Note [Specialising imported 
functions]
+                                        -- in OccurAnal
+                      , isStrongLoopBreaker (idOccInfo poly_id) = 
neverInlinePragma
+                     | otherwise                               = 
idInlinePragma poly_id
                      -- Get the INLINE pragma from SPECIALISE declaration, or,
               -- failing that, from the original Id
 
diff --git a/compiler/specialise/Specialise.lhs 
b/compiler/specialise/Specialise.lhs
index c192b3f..7cd4934 100644
--- a/compiler/specialise/Specialise.lhs
+++ b/compiler/specialise/Specialise.lhs
@@ -1138,6 +1138,9 @@ specCalls subst rules_for_me calls_for_me fn rhs
                -- Add a suitable unfolding if the spec_inl_prag says so
                -- See Note [Inline specialisations]
                spec_inl_prag 
+                 | not is_local && isStrongLoopBreaker (idOccInfo fn)
+                  = neverInlinePragma  -- See Note [Specialising imported 
functions] in OccurAnal
+                  | otherwise  
                  = case inl_prag of
                        InlinePragma { inl_inline = Inlinable } 
                           -> inl_prag { inl_inline = EmptyInlineSpec }



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to