git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: inliner updates
3b48ac7Andy Arvanitis
src/Language/PureScript/CodeGen/Cpp/Optimizer.hs+1−1
@@ -67,7 +67,7 @@ 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 . applyAll
70+ untilFixedPoint (liftM toAutoVars . inlineFnComposition . inlineUnsafePartial . applyAll
71 [ collapseNestedBlocks
71 [ collapseNestedBlocks
72 , collapseCtorChecksToSwitch
72 , collapseCtorChecksToSwitch
73 , collapseNestedIfs
73 , collapseNestedIfs
src/Language/PureScript/CodeGen/Cpp/Optimizer/Common.hs+1
@@ -41,6 +41,7 @@ isReassigned :: Text -> Cpp -> Bool
41isReassigned var1 = everythingOnCpp (||) check
41isReassigned var1 = everythingOnCpp (||) check
42 where
42 where
43 check :: Cpp -> Bool
43 check :: Cpp -> Bool
44+ check (CppLambda _ args _ _) | var1 `elem` (map fst args) = True
44 check (CppFunction _ args _ _ _) | var1 `elem` (map fst args) = True
45 check (CppFunction _ args _ _ _) | var1 `elem` (map fst args) = True
45 check (CppVariableIntroduction arg _ _) | var1 == fst arg = True
46 check (CppVariableIntroduction arg _ _) | var1 == fst arg = True
46 check (CppAssignment (CppVar arg) _) | var1 == arg = True
47 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
21 , inlineOperator
21 , inlineOperator
22 , inlineCommonOperators
22 , inlineCommonOperators
23 , inlineFnComposition
23 , inlineFnComposition
24+ , inlineUnsafePartial
24 , etaConvert
25 , etaConvert
25 , unThunk
26 , unThunk
26 , evaluateIifes
27 , evaluateIifes
@@ -269,10 +270,9 @@ inlineCommonOperators = applyAll $
269
270
270-- (f <<< g $ x) = f (g x)
271-- (f <<< g $ x) = f (g x)
271-- (f <<< g) = \x -> f (g x)
272-- (f <<< g) = \x -> f (g x)
272−inlineFnComposition :: (MonadSupply m) => Cpp -> m Cpp
273+inlineFnComposition :: forall m. MonadSupply m => Cpp -> m Cpp
273−inlineFnComposition = everywhereOnCppTopDownM convert
274+inlineFnComposition = everywhereOnCppTopDownM convert where
274− where
275− convert :: (MonadSupply m) => Cpp -> m Cpp
275+ convert :: Cpp -> m Cpp
276 convert (CppApp fn [dict', x, y, z])
276 convert (CppApp fn [dict', x, y, z])
277 | isFnCompose dict' fn = return $ CppApp x [CppApp y [z]]
277 | isFnCompose dict' fn = return $ CppApp x [CppApp y [z]]
278 | isFnComposeFlipped dict' fn = return $ CppApp y [CppApp x [z]]
278 | isFnComposeFlipped dict' fn = return $ CppApp y [CppApp x [z]]
@@ -303,6 +303,15 @@ inlineFnComposition = everywhereOnCppTopDownM convert
303 fnComposeFlipped :: (Text, Text)
303 fnComposeFlipped :: (Text, Text)
304 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
304 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
305
305
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+
306toAutoVars :: Cpp -> Cpp
315toAutoVars :: Cpp -> Cpp
307toAutoVars = everywhereOnCpp convert
316toAutoVars = everywhereOnCpp convert
308 where
317 where