X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=Normalize.hs;h=12356e23c7b9af33a6a0c8989fa31efc27172ab6;hb=b8c1e8554ba8aee73bc9d9a54bb3cb32f7930957;hp=16d7969f64bfce9450a4c34d354f9a28dd335fa5;hpb=969bf6e8931f58606a1d8bfe288539ded8369553;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/Normalize.hs b/Normalize.hs index 16d7969..12356e2 100644 --- a/Normalize.hs +++ b/Normalize.hs @@ -205,7 +205,7 @@ casewild expr@(Case scrut b ty alts) = do if null bindings || length alts == 1 && length bindings == 1 then return expr else change newlet where -- Generate a single wild binder, since they are all the same - wild = Id.mkWildId + wild = MkCore.mkWildBinder -- Wilden the binders of one alt, producing a list of bindings as a -- sideeffect. doalt :: CoreAlt -> TransformMonad ([(CoreBndr, CoreExpr)], CoreAlt) @@ -219,15 +219,17 @@ casewild expr@(Case scrut b ty alts) = do return (bindings, newalt) where -- Make all binders wild - wildbndrs = map (\bndr -> Id.mkWildId (Id.idType bndr)) bndrs + wildbndrs = map (\bndr -> MkCore.mkWildBinder (Id.idType bndr)) bndrs + -- A set of all the binders that are used by the expression + free_vars = CoreFVs.exprSomeFreeVars (`elem` bndrs) expr -- Creates a case statement to retrieve the ith element from the scrutinee -- and binds that to b. mkextracts :: CoreBndr -> Int -> TransformMonad (Maybe (CoreBndr, CoreExpr)) mkextracts b i = - -- TODO: Use free variables instead of is_wild. is_wild is a hack. - if is_wild b || Type.isFunTy (Id.idType b) - -- Don't create extra bindings for binders that are already wild, or - -- for binders that bind function types (to prevent loops with + if not (VarSet.elemVarSet b free_vars) || Type.isFunTy (Id.idType b) + -- Don't create extra bindings for binders that are already wild + -- (e.g. not in the free variables of expr, so unused), or for + -- binders that bind function types (to prevent loops with -- inlinefun). then return Nothing else do @@ -486,7 +488,7 @@ normalizeBind :: CoreBndr -> TransformSession () normalizeBind bndr = -- Don't normalize global variables, these should be either builtin -- functions or data constructors. - Monad.when (Var.isLocalIdVar bndr) $ do + Monad.when (Var.isLocalId bndr) $ do -- Skip binders that have a polymorphic type, since it's impossible to -- create polymorphic hardware. if is_poly (Var bndr)