on master help sign in
Hook up decision tree in optimize phase
commit9b18f28e45e09c49f9e668e3a1570b9e287f0cc5 authorEvan Czaplicki <evancz@users.noreply.github.com> dateThu 30 Nov 2017, 23:23 (9 years ago) parent2da8c0d
3 files changed+44−22
src/Optimize.hs+30−10 src/Optimize/Case.hs+12−11 src/Optimize/DecisionTree.hs+2−1
src/Optimize.hs+30−10
@@ -13,13 +13,9 @@ import qualified AST.Optimized as Opt
1313import qualified AST.Module.Name as ModuleName
1414import qualified Data.Index as Index
1515import qualified Elm.Name as N
16−--import qualified Optimize.Case as Case
17−import qualified Optimize.DecisionTree as DT
16+import qualified Optimize.Case as Case
1817import qualified Optimize.Names as Names
19−--import qualified Optimize.Inline as Inline
20−--import qualified Optimize.Port as Port
2118import qualified Reporting.Annotation as A
22−import qualified Reporting.Region as R
2319
2420
2521
@@ -80,8 +76,7 @@ optimizeExpr (A.At region expression) =
8076 Can.Lambda args body ->
8177 do (argNames, defss) <- destructArgs args
8278 obody <- optimizeExpr body
83− pure $
84− Opt.Function argNames (foldr Opt.Let obody (concat defss))
79+ pure $ Opt.Function argNames (foldr Opt.Let obody (concat defss))
8580
8681 Can.Call func args ->
8782 Opt.Call
@@ -121,7 +116,20 @@ optimizeExpr (A.At region expression) =
121116 Opt.Let (Opt.Def name oexpr) (foldr Opt.Let obody defs)
122117
123118 Can.Case expr branches ->
124− error "TODO"
119+ let
120+ optimizeBranch root (Can.CaseBranch pattern branch) =
121+ do defs <- destructHelp (Opt.VarLocal root) pattern []
122+ obranch <- optimizeExpr branch
123+ pure (pattern, foldr Opt.Let obranch defs)
124+ in
125+ do oexpr <- optimizeExpr expr
126+ case oexpr of
127+ Opt.VarLocal root ->
128+ Case.optimize root <$> traverse (optimizeBranch root) branches
129+
130+ _ ->
131+ do root <- Names.generate
132+ Case.optimize root <$> traverse (optimizeBranch root) branches
125133
126134 Can.Accessor field ->
127135 pure (Opt.Accessor field)
@@ -340,7 +348,20 @@ optimizeTailExpr name argNames locExpr@(A.At _ expression) =
340348 Opt.Let (Opt.Def dname oexpr) (foldr Opt.Let obody defs)
341349
342350 Can.Case expr branches ->
343− error "TODO"
351+ let
352+ optimizeBranch root (Can.CaseBranch pattern branch) =
353+ do defs <- destructHelp (Opt.VarLocal root) pattern []
354+ obranch <- optimizeTailExpr name argNames branch
355+ pure (pattern, foldr Opt.Let obranch defs)
356+ in
357+ do oexpr <- optimizeExpr expr
358+ case oexpr of
359+ Opt.VarLocal root ->
360+ Case.optimize root <$> traverse (optimizeBranch root) branches
361+
362+ _ ->
363+ do root <- Names.generate
364+ Case.optimize root <$> traverse (optimizeBranch root) branches
344365
345366 _ ->
346367 optimizeExpr locExpr
@@ -375,4 +396,3 @@ hasTailCall expression =
375396
376397 _ ->
377398 False
378−
src/Optimize/Case.hs+12−11
@@ -1,14 +1,18 @@
11{-# OPTIONS_GHC -Wall #-}
2−module Optimize.Case (optimize) where
2+module Optimize.Case
3+ ( optimize
4+ )
5+ where
6+
37
48import Control.Arrow (second)
59import qualified Data.Map as Map
610import Data.Map ((!))
711import qualified Data.Maybe as Maybe
8−import Data.Text (Text)
912
10−import qualified AST.Expression.Optimized as Opt
11−import qualified AST.Pattern as P
13+import qualified AST.Canonical as Can
14+import qualified AST.Optimized as Opt
15+import qualified Elm.Name as N
1216import qualified Optimize.DecisionTree as DT
1317
1418
@@ -16,16 +20,13 @@ import qualified Optimize.DecisionTree as DT
1620-- OPTIMIZE A CASE EXPRESSION
1721
1822
19−optimize :: DT.VariantDict -> Text -> [(P.Canonical, Opt.Expr)] -> Opt.Expr
20−optimize variantDict exprName optBranches =
23+optimize :: N.Name -> [(Can.Pattern, Opt.Expr)] -> Opt.Expr
24+optimize exprName optBranches =
2125 let
2226 (patterns, indexedBranches) =
2327 unzip (zipWith indexify [0..] optBranches)
24−
25− decisionTree =
26− DT.compile variantDict patterns
2728 in
28− treeToExpr exprName decisionTree indexedBranches
29+ treeToExpr exprName (DT.compile patterns) indexedBranches
2930
3031
3132indexify :: Int -> (a,b) -> ((a,Int), (Int,b))
@@ -39,7 +40,7 @@ indexify index (pattern, branch) =
3940-- CONVERT A TREE TO AN EXPRESSION
4041
4142
42−treeToExpr :: Text -> DT.DecisionTree -> [(Int, Opt.Expr)] -> Opt.Expr
43+treeToExpr :: N.Name -> DT.DecisionTree -> [(Int, Opt.Expr)] -> Opt.Expr
4344treeToExpr name decisionTree allJumps =
4445 let
4546 decider =
src/Optimize/DecisionTree.hs+2−1
@@ -1,7 +1,8 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module Optimize.DecisionTree
4− ( compile
4+ ( DecisionTree(..)
5+ , compile
56 , Path(..)
67 , Test(..)
78 )