-zapFragileInfo is used when cloning binders, mainly in the
-simplifier. We must forget about used-once information because that
-isn't necessarily correct in the transformed program.
-Also forget specialisations and unfoldings because they would need
-substitution to be correct. (They get pinned back on separately.)
-
-\begin{code}
-zapFragileInfo :: IdInfo -> Maybe IdInfo
-zapFragileInfo info@(IdInfo {occInfo = occ,
- workerInfo = wrkr,
- specInfo = rules,
- unfoldingInfo = unfolding})
- | not (isFragileOcc occ)
- -- We must forget about whether it was marked safe-to-inline,
- -- because that isn't necessarily true in the simplified expression.
- -- This is important because expressions may be re-simplified
- -- We don't zap deadness or loop-breaker-ness.
- -- The latter is important because it tells MkIface not to
- -- spit out an inlining for the thing. The former doesn't
- -- seem so important, but there's no harm.
-
- && isEmptyCoreRules rules
- -- Specialisations would need substituting. They get pinned
- -- back on separately.
-
- && not (workerExists wrkr)
-
- && not (hasUnfolding unfolding)
- -- This is very important; occasionally a let-bound binder is used
- -- as a binder in some lambda, in which case its unfolding is utterly
- -- bogus. Also the unfolding uses old binders so if we left it we'd
- -- have to substitute it. Much better simply to give the Id a new
- -- unfolding each time, which is what the simplifier does.
- = Nothing
-
- | otherwise
- = Just (info {occInfo = robust_occ_info,
- workerInfo = noWorkerInfo,
- specInfo = emptyCoreRules,
- unfoldingInfo = noUnfolding})
- where
- -- It's important to keep the loop-breaker info,
- -- because the substitution doesn't remember it.
- robust_occ_info = case occ of
- OneOcc _ _ -> NoOccInfo
- other -> occ
-\end{code}
-