git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix TCO issues by re-baselining optimizers
838dc61Andy Arvanitis
src/Language/PureScript/CodeGen/Cpp/Optimizer.hs+16−11
@@ -67,14 +67,26 @@ optimize nm cpp = do
67optimize' :: (MonadReader Options m, MonadSupply m) => NamesMap -> Cpp -> m Cpp
67optimize' :: (MonadReader Options m, MonadSupply m) => NamesMap -> Cpp -> m Cpp
68optimize' nm cpp = do
68optimize' nm cpp = do
69 opts <- ask
69 opts <- ask
70− untilFixedPoint (liftM toAutoVars . inlineFnComposition . inlineUnsafePartial . applyAll
70+ cpp' <- untilFixedPoint (liftM toAutoVars .
71+ inlineFnComposition .
72+ inlineUnsafePartial .
73+ tidyUp .
74+ applyAll
75+ [ inlineCommonValues
76+ , inlineCommonOperators
77+ , inlineOperator (C.dataFunction, C.apply) $ \f x -> CppApp f [x]
78+ , inlineOperator (C.dataFunction, C.applyFlipped) $ \x f -> CppApp f [x]
79+ , inlineOperator (C.dataArray, C.unsafeIndex) $ flip CppIndexer
80+ ]) cpp
81+ untilFixedPoint (return . tidyUp) . tco opts . magicDo opts $ cpp'
82+ where
83+ tidyUp :: Cpp -> Cpp
84+ tidyUp = applyAll
71 [ collapseNestedBlocks
85 [ collapseNestedBlocks
72 , collapseCtorChecksToSwitch
86 , collapseCtorChecksToSwitch
73 , collapseNestedIfs
87 , collapseNestedIfs
74 , collapseIfElses
88 , collapseIfElses
75 , removeCurrying nm
89 , removeCurrying nm
76− , tco opts
77− , magicDo opts
78 , removeCodeAfterReturnStatements
90 , removeCodeAfterReturnStatements
79 , removeCodeAfterContinueStatements
91 , removeCodeAfterContinueStatements
80 , removeUnusedArg
92 , removeUnusedArg
@@ -82,14 +94,7 @@ optimize' nm cpp = do
82 , etaConvert
94 , etaConvert
83 , evaluateIifes
95 , evaluateIifes
84 , inlineVariables
96 , inlineVariables
85− , inlineCommonValues
97+ ]
86− , inlineOperator (C.prelude, (C.$)) $ \f x -> CppApp f [x]
87− , inlineOperator (C.dataFunction, C.apply) $ \f x -> CppApp f [x]
88− , inlineOperator (C.prelude, (C.#)) $ \x f -> CppApp f [x]
89− , inlineOperator (C.dataFunction, C.applyFlipped) $ \x f -> CppApp f [x]
90− , inlineOperator (C.dataArray, C.unsafeIndex) $ flip CppIndexer
91− , inlineCommonOperators
92− ]) cpp
93
98
94untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
99untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
95untilFixedPoint f = go
100untilFixedPoint f = go