git.iko.soy/rowtype-yoga/purescript-native
on 98eaa39 help sign in
76 lines 2.1 kB history raw
1-----------------------------------------------------------------------------
2--
3-- Module : Language.PureScript.Optimizer
4-- Copyright : (c) Phil Freeman 2013
5-- License : MIT
6--
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
9-- Portability :
10--
11-- |
12-- This module optimizes code in the simplified-Javascript intermediate representation.
13--
14-- The following optimizations are supported:
15--
16-- * Collapsing nested blocks
17--
18-- * Tail call elimination
19--
20-- * Inlining of (>>=) and ret for the Eff monad
21--
22-- * Removal of unnecessary thunks
23--
24-- * Eta conversion
25--
26-- * Inlining variables
27--
28-- * Inline Prelude.($), Prelude.(#), Prelude.(++), Prelude.(!!)
29--
30-- * Inlining primitive Javascript operators
31--
32-----------------------------------------------------------------------------
34module Language.PureScript.Optimizer (
35 optimize
36) where
38import Language.PureScript.CodeGen.JS.AST
39import Language.PureScript.Options
40import qualified Language.PureScript.Constants as C
42import Language.PureScript.Optimizer.Common
43import Language.PureScript.Optimizer.TCO
44import Language.PureScript.Optimizer.MagicDo
45import Language.PureScript.Optimizer.Inliner
46import Language.PureScript.Optimizer.Unused
47import Language.PureScript.Optimizer.Blocks
49-- |
50-- Apply a series of optimizer passes to simplified Javascript code
51--
52optimize :: Options -> JS -> JS
53optimize opts | optionsNoOptimizations opts = id
54 | otherwise = untilFixedPoint (applyAll
55 [ collapseNestedBlocks
56 , collapseNestedIfs
57 , tco opts
58 , magicDo opts
59 , removeCodeAfterReturnStatements
60 , removeUnusedArg
61 , removeUndefinedApp
62 , unThunk
63 , etaConvert
64 , evaluateIifes
65 , inlineVariables
66 , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
67 , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
68 , inlineOperator (C.preludeUnsafe, C.unsafeIndex) $ flip JSIndexer
69 , inlineCommonOperators ])
71untilFixedPoint :: (Eq a) => (a -> a) -> a -> a
72untilFixedPoint f = go
73 where
74 go a = let a' = f a in
75 if a' == a then a' else go a'