From c1c7be4d3e2dc649e20b5e39364662d3e070d84b Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Fri, 26 Aug 2022 19:47:37 +0300 Subject: [PATCH 1/5] Add flags to enable/disable specific optimizations --- src/aeso_ast_to_fcode.erl | 36 +++++++++++++++++++++++------------- src/aeso_fcode_to_fate.erl | 2 +- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 1cb00fe..e6ed05b 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -184,7 +184,7 @@ ast_to_fcode(Code, Options) -> optimize(FCode1, Options) -> Verbose = lists:member(pp_fcode, Options), [io:format("-- Before lambda lifting --\n~s\n\n", [format_fcode(FCode1)]) || Verbose], - FCode2 = optimize_fcode(FCode1), + FCode2 = optimize_fcode(FCode1, Options), [ io:format("-- After optimization --\n~s\n\n", [format_fcode(FCode2)]) || Verbose, FCode2 /= FCode1 ], FCode3 = lambda_lift(FCode2), [ io:format("-- After lambda lifting --\n~s\n\n", [format_fcode(FCode3)]) || Verbose, FCode3 /= FCode2 ], @@ -1287,20 +1287,30 @@ lambda_lift_exprs(Layout, As) -> [lambda_lift_expr(Layout, A) || A <- As]. %% - Constant propagation %% - Inlining --spec optimize_fcode(fcode()) -> fcode(). -optimize_fcode(Code = #{ functions := Funs }) -> - Code1 = Code#{ functions := maps:map(fun(Name, Def) -> optimize_fun(Code, Name, Def) end, Funs) }, +-spec optimize_fcode(fcode(), [option()]) -> fcode(). +optimize_fcode(Code = #{ functions := Funs }, Options) -> + Code1 = Code#{ functions := maps:map(fun(Name, Def) -> optimize_fun(Code, Name, Def, Options) end, Funs) }, eliminate_dead_code(Code1). --spec optimize_fun(fcode(), fun_name(), fun_def()) -> fun_def(). -optimize_fun(Fcode, Fun, Def = #{ body := Body }) -> - %% io:format("Optimizing ~p =\n~s\n", [_Fun, prettypr:format(pp_fexpr(_Body))]), - Def#{ body := drop_unused_lets( - simplifier( - let_floating( - bind_subexpressions( - inline_local_functions( - inliner(Fcode, Fun, Body)))))) }. +-spec optimize_fun(fcode(), fun_name(), fun_def(), [option()]) -> fun_def(). +optimize_fun(Fcode, Fun, Def = #{ body := Body0 }, Options) -> + All = proplists:get_value(optimizate_all, Options, true), + + Inliner = proplists:get_value(optimizate_inliner, Options, All), + InlineLocalFunctions = proplists:get_value(optimizate_inline_local_functions, Options, All), + BindSubexpressions = proplists:get_value(optimizate_bind_subexpressions, Options, All), + LetFloating = proplists:get_value(optimizate_let_floating, Options, All), + Simplifier = proplists:get_value(optimizate_simplifier, Options, All), + DropUnusedLets = proplists:get_value(optimizate_drop_unused_lets, Options, All), + + Body1 = if Inliner -> inliner (Fcode, Fun, Body0); true -> Body0 end, + Body2 = if InlineLocalFunctions -> inline_local_functions(Body1); true -> Body1 end, + Body3 = if BindSubexpressions -> bind_subexpressions (Body2); true -> Body2 end, + Body4 = if LetFloating -> let_floating (Body3); true -> Body3 end, + Body5 = if Simplifier -> simplifier (Body4); true -> Body4 end, + Body6 = if DropUnusedLets -> drop_unused_lets (Body5); true -> Body5 end, + + Def#{ body := Body6 }. %% --- Inlining --- diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 014f319..48b7609 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -77,7 +77,7 @@ compile(ChildContracts, FCode, Options) -> #{ contract_name := ContractName, functions := Functions } = FCode, SFuns = functions_to_scode(ChildContracts, ContractName, Functions, Options), - SFuns1 = optimize_scode(SFuns, Options), + SFuns1 = proplists:get_value(optimize_scode, Options, true) andalso optimize_scode(SFuns, Options), FateCode = to_basic_blocks(SFuns1), ?debug(compile, Options, "~s\n", [aeb_fate_asm:pp(FateCode)]), FateCode. -- 2.30.2 From 0dbdf207bfa4e72e24837e527cba1efb66d4bd52 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Fri, 26 Aug 2022 19:53:00 +0300 Subject: [PATCH 2/5] Fix typos --- src/aeso_ast_to_fcode.erl | 14 +++++++------- src/aeso_fcode_to_fate.erl | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index e6ed05b..8ffa1e7 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -1294,14 +1294,14 @@ optimize_fcode(Code = #{ functions := Funs }, Options) -> -spec optimize_fun(fcode(), fun_name(), fun_def(), [option()]) -> fun_def(). optimize_fun(Fcode, Fun, Def = #{ body := Body0 }, Options) -> - All = proplists:get_value(optimizate_all, Options, true), + All = proplists:get_value(optimize_all, Options, true), - Inliner = proplists:get_value(optimizate_inliner, Options, All), - InlineLocalFunctions = proplists:get_value(optimizate_inline_local_functions, Options, All), - BindSubexpressions = proplists:get_value(optimizate_bind_subexpressions, Options, All), - LetFloating = proplists:get_value(optimizate_let_floating, Options, All), - Simplifier = proplists:get_value(optimizate_simplifier, Options, All), - DropUnusedLets = proplists:get_value(optimizate_drop_unused_lets, Options, All), + Inliner = proplists:get_value(optimize_inliner, Options, All), + InlineLocalFunctions = proplists:get_value(optimize_inline_local_functions, Options, All), + BindSubexpressions = proplists:get_value(optimize_bind_subexpressions, Options, All), + LetFloating = proplists:get_value(optimize_let_floating, Options, All), + Simplifier = proplists:get_value(optimize_simplifier, Options, All), + DropUnusedLets = proplists:get_value(optimize_drop_unused_lets, Options, All), Body1 = if Inliner -> inliner (Fcode, Fun, Body0); true -> Body0 end, Body2 = if InlineLocalFunctions -> inline_local_functions(Body1); true -> Body1 end, diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 48b7609..4688e6f 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -77,7 +77,7 @@ compile(ChildContracts, FCode, Options) -> #{ contract_name := ContractName, functions := Functions } = FCode, SFuns = functions_to_scode(ChildContracts, ContractName, Functions, Options), - SFuns1 = proplists:get_value(optimize_scode, Options, true) andalso optimize_scode(SFuns, Options), + SFuns1 = optimize_scode(SFuns, Options), FateCode = to_basic_blocks(SFuns1), ?debug(compile, Options, "~s\n", [aeb_fate_asm:pp(FateCode)]), FateCode. @@ -708,6 +708,8 @@ tuple(N) -> aeb_fate_ops:tuple(?a, N). %% Optimize optimize_scode(Funs, Options) -> + All = proplists:get_value(optimize_all, Options, true), + OptimizeScode = proplists:get_value(optimize_scode, Options, All), maps:map(fun(Name, Def) -> optimize_fun(Funs, Name, Def, Options) end, Funs). -- 2.30.2 From 65da15a6e27dbdf7a36d3f677442533a7be1ef54 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Fri, 26 Aug 2022 19:54:24 +0300 Subject: [PATCH 3/5] Enable/disable scode optimization --- src/aeso_fcode_to_fate.erl | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 4688e6f..c886e85 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -709,9 +709,13 @@ tuple(N) -> aeb_fate_ops:tuple(?a, N). optimize_scode(Funs, Options) -> All = proplists:get_value(optimize_all, Options, true), - OptimizeScode = proplists:get_value(optimize_scode, Options, All), - maps:map(fun(Name, Def) -> optimize_fun(Funs, Name, Def, Options) end, - Funs). + case proplists:get_value(optimize_scode, Options, All) of + true -> + maps:map(fun(Name, Def) -> optimize_fun(Funs, Name, Def, Options) end, + Funs); + false -> + Funs + end. flatten(missing) -> missing; flatten(Code) -> lists:map(fun flatten_s/1, lists:flatten(Code)). -- 2.30.2 From 33a5388936b06c99bd365c1f6ba325b1a4479f91 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Fri, 26 Aug 2022 20:07:54 +0300 Subject: [PATCH 4/5] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4779b34..32cadfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Options to enable/disable certain optimizations. ### Changed ### Removed ### Fixed -- 2.30.2 From f663bce7bfa2260dbd8202961a7e8e7564f7f43e Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Sat, 27 Aug 2022 18:18:32 +0300 Subject: [PATCH 5/5] Remove optimize_all option --- src/aeso_ast_to_fcode.erl | 14 ++++++-------- src/aeso_fcode_to_fate.erl | 3 +-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 8ffa1e7..1e0138e 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -1294,14 +1294,12 @@ optimize_fcode(Code = #{ functions := Funs }, Options) -> -spec optimize_fun(fcode(), fun_name(), fun_def(), [option()]) -> fun_def(). optimize_fun(Fcode, Fun, Def = #{ body := Body0 }, Options) -> - All = proplists:get_value(optimize_all, Options, true), - - Inliner = proplists:get_value(optimize_inliner, Options, All), - InlineLocalFunctions = proplists:get_value(optimize_inline_local_functions, Options, All), - BindSubexpressions = proplists:get_value(optimize_bind_subexpressions, Options, All), - LetFloating = proplists:get_value(optimize_let_floating, Options, All), - Simplifier = proplists:get_value(optimize_simplifier, Options, All), - DropUnusedLets = proplists:get_value(optimize_drop_unused_lets, Options, All), + Inliner = proplists:get_value(optimize_inliner, Options, true), + InlineLocalFunctions = proplists:get_value(optimize_inline_local_functions, Options, true), + BindSubexpressions = proplists:get_value(optimize_bind_subexpressions, Options, true), + LetFloating = proplists:get_value(optimize_let_floating, Options, true), + Simplifier = proplists:get_value(optimize_simplifier, Options, true), + DropUnusedLets = proplists:get_value(optimize_drop_unused_lets, Options, true), Body1 = if Inliner -> inliner (Fcode, Fun, Body0); true -> Body0 end, Body2 = if InlineLocalFunctions -> inline_local_functions(Body1); true -> Body1 end, diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index c886e85..9e19be5 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -708,8 +708,7 @@ tuple(N) -> aeb_fate_ops:tuple(?a, N). %% Optimize optimize_scode(Funs, Options) -> - All = proplists:get_value(optimize_all, Options, true), - case proplists:get_value(optimize_scode, Options, All) of + case proplists:get_value(optimize_scode, Options, true) of true -> maps:map(fun(Name, Def) -> optimize_fun(Funs, Name, Def, Options) end, Funs); -- 2.30.2