git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: inliner updates
commit3b48ac707a49c5251f4831843f31acec670bd751 authorAndy Arvanitis <andyarvanitis@gmail.com> dateMon 23 Jan 2017, 23:26 (10 years ago) parent3c7761d
3 files changed+15−5
src/Language/PureScript/CodeGen/Cpp/Optimizer.hs+1−1 src/Language/PureScript/CodeGen/Cpp/Optimizer/Common.hs+1 src/Language/PureScript/CodeGen/Cpp/Optimizer/Inliner.hs+13−4
src/Language/PureScript/CodeGen/Cpp/Optimizer.hs+1−1
@@ -67,7 +67,7 @@ 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 . applyAll
70+ untilFixedPoint (liftM toAutoVars . inlineFnComposition . inlineUnsafePartial . applyAll
7171 [ collapseNestedBlocks
7272 , collapseCtorChecksToSwitch
7373 , collapseNestedIfs
src/Language/PureScript/CodeGen/Cpp/Optimizer/Common.hs+1
@@ -41,6 +41,7 @@ isReassigned :: Text -> Cpp -> Bool
4141isReassigned var1 = everythingOnCpp (||) check
4242 where
4343 check :: Cpp -> Bool
44+ check (CppLambda _ args _ _) | var1 `elem` (map fst args) = True
4445 check (CppFunction _ args _ _ _) | var1 `elem` (map fst args) = True
4546 check (CppVariableIntroduction arg _ _) | var1 == fst arg = True
4647 check (CppAssignment (CppVar arg) _) | var1 == arg = True
src/Language/PureScript/CodeGen/Cpp/Optimizer/Inliner.hs+13−4
@@ -21,6 +21,7 @@ module Language.PureScript.CodeGen.Cpp.Optimizer.Inliner
2121 , inlineOperator
2222 , inlineCommonOperators
2323 , inlineFnComposition
24+ , inlineUnsafePartial
2425 , etaConvert
2526 , unThunk
2627 , evaluateIifes
@@ -269,10 +270,9 @@ inlineCommonOperators = applyAll $
269270
270271-- (f <<< g $ x) = f (g x)
271272-- (f <<< g) = \x -> f (g x)
272−inlineFnComposition :: (MonadSupply m) => Cpp -> m Cpp
273−inlineFnComposition = everywhereOnCppTopDownM convert
274− where
275− convert :: (MonadSupply m) => Cpp -> m Cpp
273+inlineFnComposition :: forall m. MonadSupply m => Cpp -> m Cpp
274+inlineFnComposition = everywhereOnCppTopDownM convert where
275+ convert :: Cpp -> m Cpp
276276 convert (CppApp fn [dict', x, y, z])
277277 | isFnCompose dict' fn = return $ CppApp x [CppApp y [z]]
278278 | isFnComposeFlipped dict' fn = return $ CppApp y [CppApp x [z]]
@@ -303,6 +303,15 @@ inlineFnComposition = everywhereOnCppTopDownM convert
303303 fnComposeFlipped :: (Text, Text)
304304 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
305305
306+inlineUnsafePartial :: Cpp -> Cpp
307+inlineUnsafePartial = everywhereOnCppTopDown convert where
308+ convert (CppApp (CppAccessor (CppVar unsafePartial) (CppVar partialUnsafe)) [ comp ])
309+ | unsafePartial == C.unsafePartial && partialUnsafe == C.partialUnsafe
310+ -- Apply to undefined here, the application should be optimized away
311+ -- if it is safe to do so
312+ = CppApp comp [ CppVar C.undefined ]
313+ convert other = other
314+
306315toAutoVars :: Cpp -> Cpp
307316toAutoVars = everywhereOnCpp convert
308317 where