@@ -385,7 +385,8 @@ codegenJS_all target definitions includes libs filename outputType = do
385 let bytecode = map toBC definitions
385 let bytecode = map toBC definitions
386 let info = initCompileInfo bytecode
386 let info = initCompileInfo bytecode
387 let js = concatMap (translateDecl info) bytecode
387 let js = concatMap (translateDecl info) bytecode
388− let code = concatMap processFunction js
388+ let full = concatMap processFunction js
389+ let code = deadCodeElim full
389 let (cons, opt) = optimizeConstructors code
390 let (cons, opt) = optimizeConstructors code
390 let (header, rt) = case target of
391 let (header, rt) = case target of
391 Node -> ("#!/usr/bin/env node\n", "-node")
392 Node -> ("#!/usr/bin/env node\n", "-node")
@@ -416,11 +417,59 @@ codegenJS_all target definitions includes libs filename outputType = do
416 , writable = True
417 , writable = True
420+ deadCodeElim :: [JS] -> [JS]
421+ deadCodeElim js = concatMap collectFunctions js
423+ collectFunctions :: JS -> [JS]
424+ collectFunctions fun@(JSAlloc name _)
425+ | name == translateName (sMN 0 "runMain") = [fun]
427+ collectFunctions fun@(JSAlloc name (Just (JSFunction _ body))) =
428+ let invokations = sum $ map (
429+ \x -> execState (countInvokations name x) 0
431+ in if invokations == 0
435+ countInvokations :: String -> JS -> State Int ()
436+ countInvokations name (JSAlloc _ (Just (JSFunction _ body))) =
437+ countInvokations name body
439+ countInvokations name (JSSeq seq) =
440+ void $ traverse (countInvokations name) seq
442+ countInvokations name (JSAssign _ rhs) =
443+ countInvokations name rhs
445+ countInvokations name (JSCond conds) =
447+ runKleisli $ arr id *** Kleisli (countInvokations name)
450+ countInvokations name (JSSwitch _ conds def) =
452+ runKleisli $ arr id *** Kleisli (countInvokations name)
453+ ) conds >> traverse (countInvokations name) def
455+ countInvokations name (JSApp lhs rhs) =
456+ void $ countInvokations name lhs >> traverse (countInvokations name) rhs
458+ countInvokations name (JSNew _ args) =
459+ void $ traverse (countInvokations name) args
461+ countInvokations name (JSArray args) =
462+ void $ traverse (countInvokations name) args
464+ countInvokations name (JSIdent name')
465+ | name == name' = get >>= put . (+1)
466+ | otherwise = return ()
468+ countInvokations _ _ = return ()
419 processFunction :: JS -> [JS]
470 processFunction :: JS -> [JS]
420− processFunction js =
471+ processFunction =
422− collectSplitFunctions . (\x -> evalRWS (splitFunction x) () 0)
472+ collectSplitFunctions . (\x -> evalRWS (splitFunction x) () 0)
425 includeLibs :: [String] -> String
474 includeLibs :: [String] -> String
426 includeLibs =
475 includeLibs =