+ InlineRule { uf_tmpl = unf_template, uf_arity = arity, uf_is_top = is_top
+ , uf_is_value = is_value, uf_worker = mb_worker }
+ -> let yes_or_no | not active_inline = False
+ | n_val_args < arity = yes_unsat -- Not enough value args
+ | n_val_args == arity = yes_exact -- Exactly saturated
+ | otherwise = True -- Over-saturated
+ result | yes_or_no = Just unf_template
+ | otherwise = Nothing
+
+ -- See Note [Inlining an InlineRule]
+ is_wrapper = isJust mb_worker
+ yes_unsat | is_wrapper = or arg_infos
+ | otherwise = False
+
+ yes_exact = or arg_infos || interesting_saturated_call
+ interesting_saturated_call
+ = case cont_info of
+ BoringCtxt -> not is_top -- Note [Nested functions]
+ CaseCtxt -> not lone_variable || not is_value -- Note [Lone variables]
+ ArgCtxt {} -> arity > 0 -- Note [Inlining in ArgCtxt]
+ ValAppCtxt -> True -- Note [Cast then apply]
+ in
+ if dopt Opt_D_dump_inlinings dflags then
+ pprTrace ("Considering InlineRule for: " ++ showSDoc (ppr id))
+ (vcat [text "active:" <+> ppr active_inline,
+ text "arg infos" <+> ppr arg_infos,
+ text "interesting call" <+> ppr interesting_saturated_call,
+ text "is value:" <+> ppr is_value,
+ text "ANSWER =" <+> if yes_or_no then text "YES" else text "NO"])
+ result
+ else result ;
+
+ CoreUnfolding { uf_tmpl = unf_template, uf_is_top = is_top, uf_is_value = is_value,
+ uf_is_cheap = is_cheap, uf_guidance = guidance } ->