@@ -67,14 +67,26 @@ optimize nm cpp = do
6767optimize' :: (MonadReader Options m, MonadSupply m) => NamesMap -> Cpp -> m Cpp
6868optimize' nm cpp = do
6969 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
7185 [ collapseNestedBlocks
7286 , collapseCtorChecksToSwitch
7387 , collapseNestedIfs
7488 , collapseIfElses
7589 , removeCurrying nm
76− , tco opts
77− , magicDo opts
7890 , removeCodeAfterReturnStatements
7991 , removeCodeAfterContinueStatements
8092 , removeUnusedArg
@@ -82,14 +94,7 @@ optimize' nm cpp = do
8294 , etaConvert
8395 , evaluateIifes
8496 , inlineVariables
85− , inlineCommonValues
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
97+ ]
9398
9499untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
95100untilFixedPoint f = go