ghc-8.10.1: The GHC API
Safe HaskellNone



Simple expression optimiser

Join points

joinPointBinding_maybe :: InBndr -> InExpr -> Maybe (InBndr, InExpr) Source #

Returns Just (bndr,rhs) if the binding is a join point: If it's a JoinId, just return it If it's not yet a JoinId but is always tail-called, make it into a JoinId and return it. In the latter case, eta-expand the RHS if necessary, to make the lambdas explicit, as is required for join points

Precondition: the InBndr has been occurrence-analysed, so its OccInfo is valid

Predicates on expressions

exprIsConApp_maybe :: InScopeEnv -> CoreExpr -> Maybe (InScopeSet, [FloatBind], DataCon, [Type], [CoreExpr]) Source #

Returns Just ([b1..bp], dc, [], [x1..xn]) if the argument expression is a *saturated* constructor application of the form let b1 in .. let bp in dc x1 .. xn, where are the *universally-quantified* type args of dc. Floats can also be (and most likely are) single-alternative case expressions. Why does exprIsConApp_maybe return floats? We may have to look through lets and cases to detect that we are in the presence of a data constructor wrapper. In this case, we need to return the lets and cases that we traversed. See Note [exprIsConApp_maybe on data constructors with wrappers]. Data constructor wrappers are unfolded late, but we really want to trigger case-of-known-constructor as early as possible. See also Note [Activation for data constructor wrappers] in MkId.

We also return the incoming InScopeSet, augmented with the binders from any [FloatBind] that we return

Coercions and casts