X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=Normalize.hs;h=a299fd3673acc2d6f50788098aa6ae8896296b01;hb=7eb34cb0e082185b256b7231ee84cb04e006f51c;hp=8cb21ea2ab8a0130b851cdcf05150e1208e383dc;hpb=e091fb6b78ed5ea074e4c41879a712a806771ba4;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/Normalize.hs b/Normalize.hs index 8cb21ea..a299fd3 100644 --- a/Normalize.hs +++ b/Normalize.hs @@ -21,9 +21,11 @@ import CoreSyn import qualified UniqSupply import qualified CoreUtils import qualified Type +import qualified TcType import qualified Id import qualified Var import qualified VarSet +import qualified NameSet import qualified CoreFVs import qualified CoreUtils import qualified MkCore @@ -140,7 +142,7 @@ letflattop = everywhere ("letflat", letflat) -------------------------------- -- Remove a = b bindings from let expressions everywhere letremovetop :: Transform -letremovetop = everywhere ("letremove", inlinebind (\(b, e) -> case e of (Var v) | not $ Id.isDataConWorkId v -> True; otherwise -> False)) +letremovetop = everywhere ("letremove", inlinebind (\(b, e) -> case e of (Var v) | not $ Id.isDataConWorkId v -> return True; otherwise -> return False)) -------------------------------- -- Function inlining @@ -157,8 +159,8 @@ letremovetop = everywhere ("letremove", inlinebind (\(b, e) -> case e of (Var v) -- will just not work on those function-typed values at first, but the other -- transformations (in particular β-reduction) should make sure that the type -- of those values eventually becomes primitive. -inlinefuntop :: Transform -inlinefuntop = everywhere ("inlinefun", inlinebind (is_applicable . snd)) +inlinenonreptop :: Transform +inlinenonreptop = everywhere ("inlinenonrep", inlinebind ((Monad.liftM not) . isRepr . snd)) -------------------------------- -- Scrutinee simplification @@ -448,7 +450,7 @@ funextracttop = everywhere ("funextract", funextract) -- What transforms to run? -transforms = [argproptop, funextracttop, etatop, betatop, castproptop, letremovetop, letrectop, letsimpltop, letflattop, casewildtop, scrutsimpltop, casevalsimpltop, caseremovetop, inlinefuntop, appsimpltop] +transforms = [argproptop, funextracttop, etatop, betatop, castproptop, letremovetop, letrectop, letsimpltop, letflattop, casewildtop, scrutsimpltop, casevalsimpltop, caseremovetop, inlinenonreptop, appsimpltop] -- Turns the given bind into VHDL normalizeModule :: @@ -512,6 +514,25 @@ normalizeBind bndr = let used_funcs = VarSet.varSetElems used_funcs_set -- Process each of the used functions recursively mapM normalizeBind used_funcs + -- FIXME: Can't we inline these 'implicit' function calls or something? + -- TODO: Add an extra let expression to the current finding, so the VHDL + -- Will make a signa assignment for this 'implicit' function call + -- + -- Find all the other free variables used that are used. This applies to + -- variables that are actually a reference to a Class function. Example: + -- + -- functiontest :: SizedInt D8 -> SizedInt D8 + -- functiontest = \a -> let r = a + 1 in r + -- + -- The literal(Lit) '1' will be turned into a variable (Var) + -- As it will call the 'fromInteger' class function that belongs + -- to the Num class. So we need to translate the refenced function + -- let used_vars_set = CoreFVs.exprSomeFreeVars (\v -> (Type.isAlgType . snd . Type.splitForAllTys . Id.idType) v) expr' + -- let used_vars = VarSet.varSetElems used_vars_set + -- -- Filter for dictionary args, they should not be translated + -- -- FIXME: check for other non-translatable stuff as well + -- let trans_vars = filter (\v -> (not . TcType.isDictTy . Id.idType) v) used_vars + -- mapM normalizeBind trans_vars return () -- We don't have a value for this binder. This really shouldn't -- happen for local id's...