From: simonmar Date: Thu, 6 Jan 2000 10:43:15 +0000 (+0000) Subject: [project @ 2000-01-06 10:43:15 by simonmar] X-Git-Tag: Approximately_9120_patches~5344 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=cd7a1887d1abe8a3f300d256ffcfe6af3718f531;p=ghc-hetmet.git [project @ 2000-01-06 10:43:15 by simonmar] Fix a bug in inlining that gave unresolved references whenever you compile without -O. Silly me. --- diff --git a/ghc/compiler/coreSyn/CoreUnfold.lhs b/ghc/compiler/coreSyn/CoreUnfold.lhs index b3495f3..18caca2 100644 --- a/ghc/compiler/coreSyn/CoreUnfold.lhs +++ b/ghc/compiler/coreSyn/CoreUnfold.lhs @@ -19,7 +19,7 @@ module CoreUnfold ( noUnfolding, mkTopUnfolding, mkUnfolding, mkCompulsoryUnfolding, seqUnfolding, mkOtherCon, otherCons, unfoldingTemplate, maybeUnfoldingTemplate, - isEvaldUnfolding, isCheapUnfolding, + isEvaldUnfolding, isCheapUnfolding, isCompulsoryUnfolding, hasUnfolding, hasSomeUnfolding, couldBeSmallEnoughToInline, @@ -146,6 +146,10 @@ isCheapUnfolding :: Unfolding -> Bool isCheapUnfolding (CoreUnfolding _ _ is_cheap _ _) = is_cheap isCheapUnfolding other = False +isCompulsoryUnfolding :: Unfolding -> Bool +isCompulsoryUnfolding (CompulsoryUnfolding _) = True +isCompulsoryUnfolding other = False + hasUnfolding :: Unfolding -> Bool hasUnfolding (CoreUnfolding _ _ _ _ _) = True hasUnfolding (CompulsoryUnfolding _) = True diff --git a/ghc/compiler/simplCore/SimplMonad.lhs b/ghc/compiler/simplCore/SimplMonad.lhs index fdc70a4..af977c5 100644 --- a/ghc/compiler/simplCore/SimplMonad.lhs +++ b/ghc/compiler/simplCore/SimplMonad.lhs @@ -51,10 +51,11 @@ module SimplMonad ( #include "HsVersions.h" import Const ( Con(DEFAULT) ) -import Id ( Id, mkSysLocal, isConstantId ) +import Id ( Id, mkSysLocal, getIdUnfolding ) import IdInfo ( InlinePragInfo(..) ) import Demand ( Demand ) import CoreSyn +import CoreUnfold ( isCompulsoryUnfolding ) import PprCore () -- Instances import Rules ( RuleBase ) import CostCentre ( CostCentreStack, subsumedCCS ) @@ -744,7 +745,8 @@ environment seems like wild overkill. \begin{code} switchOffInlining :: SimplM a -> SimplM a switchOffInlining m env us sc - = m (env { seBlackList = \v -> (v `isInScope` subst) || not (isLocallyDefined v) + = m (env { seBlackList = \v -> not (isCompulsoryUnfolding (getIdUnfolding v)) && + ((v `isInScope` subst) || not (isLocallyDefined v)) }) us sc -- Black list anything that is in scope or imported. -- The in-scope thing arranges *not* to black list inlinings that are @@ -758,6 +760,12 @@ switchOffInlining m env us sc -- to inline them -- But that failed because if we inline (say) [] in build's rhs, then -- the exported thing doesn't match rules + -- + -- But we must inline primops (which have compulsory unfoldings) in the + -- last phase of simplification, because they don't have bindings. + -- The simplifier now *never* inlines blacklisted things (even if they + -- have compulsory unfoldings) so we must not black-list compulsory + -- unfoldings inside INLINE prags. where subst = seSubst env old_black_list = seBlackList env diff --git a/ghc/driver/ghc.lprl b/ghc/driver/ghc.lprl index f07b251..dca6d70 100644 --- a/ghc/driver/ghc.lprl +++ b/ghc/driver/ghc.lprl @@ -690,7 +690,6 @@ sub setupOptimiseFlags { = ( '-fsimplify', '[', - '-finline-phase2', $Oopt_MaxSimplifierIterations, ']',