--- | Substitutes for the 'Id's within the 'WorkerInfo'
-substWorker :: Subst -> WorkerInfo -> WorkerInfo
- -- Seq'ing on the returned WorkerInfo is enough to cause all the
- -- substitutions to happen completely
-
-substWorker _ NoWorker
- = NoWorker
-substWorker subst (HasWorker w a)
- = case lookupIdSubst subst w of
- Var w1 -> HasWorker w1 a
- other -> WARN( not (exprIsTrivial other), text "CoreSubst.substWorker:" <+> ppr w )
- NoWorker -- Worker has got substituted away altogether
- -- (This can happen if it's trivial,
- -- via postInlineUnconditionally, hence warning)
+-- | Substitutes for the 'Id's within an unfolding
+substUnfolding :: Subst -> Unfolding -> Unfolding
+ -- Seq'ing on the returned Unfolding is enough to cause
+ -- all the substitutions to happen completely
+substUnfolding subst unf@(InlineRule { uf_tmpl = tmpl, uf_worker = mb_wkr })
+ -- Retain an InlineRule!
+ = seqExpr new_tmpl `seq`
+ new_mb_wkr `seq`
+ unf { uf_tmpl = new_tmpl, uf_worker = new_mb_wkr }
+ where
+ new_tmpl = substExpr subst tmpl
+ new_mb_wkr = case mb_wkr of
+ Nothing -> Nothing
+ Just w -> subst_wkr w
+
+ subst_wkr w = case lookupIdSubst subst w of
+ Var w1 -> Just w1
+ other -> WARN( not (exprIsTrivial other), text "CoreSubst.substWorker:" <+> ppr w )
+ Nothing -- Worker has got substituted away altogether
+ -- (This can happen if it's trivial,
+ -- via postInlineUnconditionally, hence warning)
+
+substUnfolding _ (CoreUnfolding {}) = NoUnfolding -- Discard
+ -- Always zap a CoreUnfolding, to save substitution work
+
+substUnfolding _ unf = unf -- Otherwise no substitution to do