import CoreSyn
import Digraph ( stronglyConnCompR, SCC(..) )
import Id ( idWantsToBeINLINEd, addNoInlinePragma, nukeNoInlinePragma,
- omitIfaceSigForId, isSpecPragmaId,
+ omitIfaceSigForId, isSpecPragmaId, getIdSpecialisation,
idType, idUnique, Id,
emptyIdSet, unionIdSets, mkIdSet,
elementOfIdSet,
mapIdEnv, lookupIdEnv, elemIdEnv, addOneToIdEnv
)
import Specialise ( idSpecVars )
+import SpecEnv ( isEmptySpecEnv )
import Name ( isExported, isLocallyDefined )
import Type ( splitFunTy_maybe, splitForAllTys )
import Maybes ( maybeToBool )
|| inlineMe env bndr -- Dont pick INLINE thing
|| isOneFunOcc occ_info -- Dont pick single-occ thing
|| not_fun_ty (idType bndr) -- Dont pick data-ty thing
+ || not (isEmptySpecEnv (getIdSpecialisation bndr))
+ -- Avoid things with a SpecEnv; we'd like
+ -- to take advantage of the SpecEnv in the subsuequent bindings
-- isOneFunOcc looks for one textual occurrence, whether inside lambda or whatever.
-- We stick to just FunOccs because if we're not going to be able
Just (_,_,info) -> info
Nothing -> NoUnfolding
-modifyOutEnvItem :: (OutId, BinderInfo, Unfolding)
- -> (OutId, BinderInfo, Unfolding)
- -> (OutId, BinderInfo, Unfolding)
-modifyOutEnvItem (id, occ, info1) (_, _, info2)
- = case (info1, info2) of
- (OtherLit ls1, OtherLit ls2) -> (id,occ, OtherLit (ls1++ls2))
- (OtherCon cs1, OtherCon cs2) -> (id,occ, OtherCon (cs1++cs2))
- (_, NoUnfolding) -> (id,occ, info1)
- other -> (id,occ, info2)
+modifyOutEnvItem :: (OutId, BinderInfo, Unfolding) -- Existing
+ -> (OutId, BinderInfo, Unfolding) -- New
+ -> (OutId, BinderInfo, Unfolding)
+modifyOutEnvItem (_, _, info1) (id, occ, info2)
+ = (id, occ, case (info1, info2) of
+ (OtherLit ls1, OtherLit ls2) -> OtherLit (ls1++ls2)
+ (OtherCon cs1, OtherCon cs2) -> OtherCon (cs1++cs2)
+ (_, NoUnfolding) -> info1
+ other -> info2)
\end{code}