on master help sign in
javascript: optimize apply tailcalls
6a1e21eraichoo
jsrts/Runtime-common.js+9
@@ -57,3 +57,12 @@ var __IDRRT__EVALTC = function(arg0) {
57
57
58 return ret;
58 return ret;
59};
59};
60+
61+var __IDRRT__APPLYTC = function(fn0, arg0) {
62+ var ev = __IDRRT__EVALTC(fn0);
63+ var ret = (ev instanceof __IDRRT__Con && __IDRLT__mAPPLY0[ev.tag])?(__IDRLT__mAPPLY0[ev.tag](fn0,arg0,ev)):(null)
64+ while (ret instanceof __IDRRT__Cont)
65+ ret = ret.k();
66+
67+ return ret;
68+}
src/IRTS/CodegenJavaScript.hs+45−39
@@ -848,57 +848,62 @@ elimDuplicateEvals (JSAlloc fun (Just (JSFunction args (JSSeq seq)))) =
848
848
849elimDuplicateEvals js = js
849elimDuplicateEvals js = js
850
850
851−optimizeEvalTailcalls :: JS -> JS
851+optimizeEvalTailcalls :: (String, String) -> JS -> JS
852+optimizeEvalTailcalls (fun, tc) js =
853+ optHelper js
854+ where
855+ optHelper :: JS -> JS
852−optimizeEvalTailcalls (JSApp (JSIdent "__IDRRT__tailcall") [
856+ optHelper (JSApp (JSIdent "__IDRRT__tailcall") [
853− JSFunction [] (JSReturn (JSApp (JSIdent "__IDR__mEVAL0") args))
857+ JSFunction [] (JSReturn (JSApp (JSIdent n) args))
858+ ])
854− ]) = JSApp (JSIdent "__IDRRT__EVALTC") $ map optimizeEvalTailcalls args
859+ | n == fun = JSApp (JSIdent tc) $ map optHelper args
855
860
856−optimizeEvalTailcalls (JSFunction args body) =
861+ optHelper (JSFunction args body) =
857− JSFunction args $ optimizeEvalTailcalls body
862+ JSFunction args $ optHelper body
858
863
859−optimizeEvalTailcalls (JSSeq seq) =
864+ optHelper (JSSeq seq) =
860− JSSeq $ map optimizeEvalTailcalls seq
865+ JSSeq $ map optHelper seq
861
866
862−optimizeEvalTailcalls (JSReturn ret) =
867+ optHelper (JSReturn ret) =
863− JSReturn $ optimizeEvalTailcalls ret
868+ JSReturn $ optHelper ret
864
869
865−optimizeEvalTailcalls (JSApp lhs rhs) =
870+ optHelper (JSApp lhs rhs) =
866− JSApp (optimizeEvalTailcalls lhs) (map optimizeEvalTailcalls rhs)
871+ JSApp (optHelper lhs) (map optHelper rhs)
867
872
868−optimizeEvalTailcalls (JSNew con args) =
873+ optHelper (JSNew con args) =
869− JSNew con $ map optimizeEvalTailcalls args
874+ JSNew con $ map optHelper args
870
875
871−optimizeEvalTailcalls (JSOp op lhs rhs) =
876+ optHelper (JSOp op lhs rhs) =
872− JSOp op (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
877+ JSOp op (optHelper lhs) (optHelper rhs)
873
878
874−optimizeEvalTailcalls (JSProj obj field) =
879+ optHelper (JSProj obj field) =
875− JSProj (optimizeEvalTailcalls obj) field
880+ JSProj (optHelper obj) field
876
881
877−optimizeEvalTailcalls (JSArray vals) =
882+ optHelper (JSArray vals) =
878− JSArray $ map optimizeEvalTailcalls vals
883+ JSArray $ map optHelper vals
879
884
880−optimizeEvalTailcalls (JSAssign lhs rhs) =
885+ optHelper (JSAssign lhs rhs) =
881− JSAssign (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
886+ JSAssign (optHelper lhs) (optHelper rhs)
882
887
883−optimizeEvalTailcalls (JSAlloc var (Just val)) =
888+ optHelper (JSAlloc var (Just val)) =
884− JSAlloc var (Just $ optimizeEvalTailcalls val)
889+ JSAlloc var (Just $ optHelper val)
885
890
886−optimizeEvalTailcalls (JSIndex lhs rhs) =
891+ optHelper (JSIndex lhs rhs) =
887− JSIndex (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
892+ JSIndex (optHelper lhs) (optHelper rhs)
888
893
889−optimizeEvalTailcalls (JSCond conds) =
894+ optHelper (JSCond conds) =
890− JSCond $ map (optimizeEvalTailcalls *** optimizeEvalTailcalls) conds
895+ JSCond $ map (optHelper *** optHelper) conds
891
896
892−optimizeEvalTailcalls (JSTernary c t f) =
897+ optHelper (JSTernary c t f) =
893− JSTernary (
898+ JSTernary (
894− optimizeEvalTailcalls c
899+ optHelper c
895− ) (
900+ ) (
896− optimizeEvalTailcalls t
901+ optHelper t
897− ) (
902+ ) (
898− optimizeEvalTailcalls f
903+ optHelper f
899− )
904+ )
900
905
901−optimizeEvalTailcalls js = js
906+ optHelper js = js
902
907
903reduceLoop :: [String] -> ([JS], [JS]) -> [JS]
908reduceLoop :: [String] -> ([JS], [JS]) -> [JS]
904reduceLoop reduced (cons, program) =
909reduceLoop reduced (cons, program) =
@@ -1029,8 +1034,9 @@ codegenJavaScript target definitions filename outputType = do
1029 deadElim = elimDeadLoop removeAlloc
1034 deadElim = elimDeadLoop removeAlloc
1030 inlined = inlineFunctions deadElim
1035 inlined = inlineFunctions deadElim
1031 elimDup = map elimDuplicateEvals inlined
1036 elimDup = map elimDuplicateEvals inlined
1032− evalTC = map optimizeEvalTailcalls elimDup
1037+ evalTC = map (optimizeEvalTailcalls ("__IDR__mEVAL0", "__IDRRT__EVALTC")) elimDup
1033− js = evalTC in
1038+ applyTC = map (optimizeEvalTailcalls ("__IDR__mAPPLY0", "__IDRRT__APPLYTC")) evalTC
1039+ js = applyTC in
1034 map compileJS js
1040 map compileJS js
1035
1041
1036 mainLoop :: JS
1042 mainLoop :: JS