From d2d6086e3e60fcda63c4f2d8e4ca4387162b4bb5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 07:51:32 -0700 Subject: [PATCH 1/9] start --- tools/building.py | 5 +++++ tools/link.py | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/tools/building.py b/tools/building.py index a87f1a2157e6f..796a5103f6502 100644 --- a/tools/building.py +++ b/tools/building.py @@ -715,6 +715,8 @@ def minify_wasm_js(js_file, wasm_file, expensive_optimizations, debug_info): js_file = acorn_optimizer(js_file, passes) # if we can optimize this js+wasm combination under the assumption no one else # will see the internals, do so + # XXX aside from linkable, we know the entire end-of-opt pipeline here. So we can tell the last one last=True and it can do StackIR + # but for linkable, must do that be4 if not settings.LINKABLE: # if we are optimizing for size, shrink the combined wasm+JS # TODO: support this when a symbol map is used @@ -895,6 +897,9 @@ def minify_wasm_imports_and_exports(js_file, wasm_file, minify_exports, debug_in # might make sense to run Stack IR optimizations here or even -O (as # metadce which runs before us might open up new general optimization # opportunities). however, the benefit is less than 0.5%. + # TODO: Avoid StackIR before, do it just here!!1 + # if settings.OPT_LEVEL > 0: + # args.append(opt_level_to_str(settings.OPT_LEVEL, settings.SHRINK_LEVEL)) # get the mapping SEP = ' => ' diff --git a/tools/link.py b/tools/link.py index 8ede4da831812..37b06064226b4 100644 --- a/tools/link.py +++ b/tools/link.py @@ -424,6 +424,13 @@ def check_human_readable_list(items): if settings.WASM_EXNREF: passes += ['--emit-exnref'] + # If we are not linkable then we will invoke wasm-opt later (for metadce + # and/or import/export minification). Avoid doing StackIR optimizations at + # this time, so that we only do them at the very end (which is more + # efficient). + if not settings.LINKABLE: + passes += ['--no-stack-ir'] + return passes From 40ee0f305ab8f30f2a3c2c86b753ef065b92ac5b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 08:29:24 -0700 Subject: [PATCH 2/9] work --- tools/building.py | 37 ++++++++++++++++++++++--------------- tools/link.py | 5 ++++- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/tools/building.py b/tools/building.py index 796a5103f6502..5f6a1d6a871b6 100644 --- a/tools/building.py +++ b/tools/building.py @@ -715,13 +715,14 @@ def minify_wasm_js(js_file, wasm_file, expensive_optimizations, debug_info): js_file = acorn_optimizer(js_file, passes) # if we can optimize this js+wasm combination under the assumption no one else # will see the internals, do so - # XXX aside from linkable, we know the entire end-of-opt pipeline here. So we can tell the last one last=True and it can do StackIR - # but for linkable, must do that be4 if not settings.LINKABLE: # if we are optimizing for size, shrink the combined wasm+JS # TODO: support this when a symbol map is used if expensive_optimizations: - js_file = metadce(js_file, wasm_file, debug_info=debug_info) + js_file = metadce(js_file, + wasm_file, + debug_info=debug_info, + last=not settings.MINIFY_WASM_IMPORTS_AND_EXPORTS) # now that we removed unneeded communication between js and wasm, we can clean up # the js some more. passes = ['AJSDCE'] @@ -745,8 +746,15 @@ def is_internal_global(name): return name in internal_start_stop_symbols or any(name.startswith(p) for p in internal_prefixes) +# get the flags to pass into the very last binaryen tool invocation, that runs +# the final set of optimizations +def get_last_binaryen_opts(): + return ['--optimize-stack-ir', + opt_level_to_str(settings.OPT_LEVEL, settings.SHRINK_LEVEL)] + + # run binaryen's wasm-metadce to dce both js and wasm -def metadce(js_file, wasm_file, debug_info): +def metadce(js_file, wasm_file, debug_info, last): logger.debug('running meta-DCE') temp_files = shared.get_temp_files() # first, get the JS part of the graph @@ -812,10 +820,13 @@ def metadce(js_file, wasm_file, debug_info): temp = temp_files.get('.json', prefix='emcc_dce_graph_').name utils.write_file(temp, json.dumps(graph, indent=2)) # run wasm-metadce + args = ['--graph-file=' + temp] + if last: + args += get_last_binaryen_opts() out = run_binaryen_command('wasm-metadce', wasm_file, wasm_file, - ['--graph-file=' + temp], + args, debug=debug_info, stdout=PIPE) # find the unused things in js @@ -880,26 +891,22 @@ def asyncify_lazy_load_code(wasm_target, debug): def minify_wasm_imports_and_exports(js_file, wasm_file, minify_exports, debug_info): logger.debug('minifying wasm imports and exports') # run the pass + args = [] if minify_exports: # standalone wasm mode means we need to emit a wasi import module. # otherwise, minify even the imported module names. if settings.MINIFY_WASM_IMPORTED_MODULES: - pass_name = '--minify-imports-and-exports-and-modules' + args.append('--minify-imports-and-exports-and-modules') else: - pass_name = '--minify-imports-and-exports' + args.append('--minify-imports-and-exports') else: - pass_name = '--minify-imports' + args.append('--minify-imports') + # this is always the last tool we run (if we run it) + args += get_last_binaryen_opts() out = run_wasm_opt(wasm_file, wasm_file, [pass_name], debug=debug_info, stdout=PIPE) - # TODO this is the last tool we run, after normal opts and metadce. it - # might make sense to run Stack IR optimizations here or even -O (as - # metadce which runs before us might open up new general optimization - # opportunities). however, the benefit is less than 0.5%. - # TODO: Avoid StackIR before, do it just here!!1 - # if settings.OPT_LEVEL > 0: - # args.append(opt_level_to_str(settings.OPT_LEVEL, settings.SHRINK_LEVEL)) # get the mapping SEP = ' => ' diff --git a/tools/link.py b/tools/link.py index 37b06064226b4..1bfff6eea4dc8 100644 --- a/tools/link.py +++ b/tools/link.py @@ -427,7 +427,10 @@ def check_human_readable_list(items): # If we are not linkable then we will invoke wasm-opt later (for metadce # and/or import/export minification). Avoid doing StackIR optimizations at # this time, so that we only do them at the very end (which is more - # efficient). + # efficient, as if we do StackIR optimizations now then we'd throw that away + # when we reload the wasm in anothre Binaryen tool, and also StackIR + # optimizations lead to stacky code that Binaryen would need to do more work + # to handle in its structured IR). if not settings.LINKABLE: passes += ['--no-stack-ir'] From e7a0e976cdfa1f2bae29b0818619073709c234fc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 08:31:42 -0700 Subject: [PATCH 3/9] fix --- tools/building.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/building.py b/tools/building.py index 5f6a1d6a871b6..8e77c7129146b 100644 --- a/tools/building.py +++ b/tools/building.py @@ -749,8 +749,9 @@ def is_internal_global(name): # get the flags to pass into the very last binaryen tool invocation, that runs # the final set of optimizations def get_last_binaryen_opts(): - return ['--optimize-stack-ir', - opt_level_to_str(settings.OPT_LEVEL, settings.SHRINK_LEVEL)] + return [f'--optimize-level={settings.OPT_LEVEL}', + f'--shrink-level={settings.SHRINK_LEVEL}', + '--optimize-stack-ir'] # run binaryen's wasm-metadce to dce both js and wasm @@ -903,10 +904,7 @@ def minify_wasm_imports_and_exports(js_file, wasm_file, minify_exports, debug_in args.append('--minify-imports') # this is always the last tool we run (if we run it) args += get_last_binaryen_opts() - out = run_wasm_opt(wasm_file, wasm_file, - [pass_name], - debug=debug_info, - stdout=PIPE) + out = run_wasm_opt(wasm_file, wasm_file, args, debug=debug_info, stdout=PIPE) # get the mapping SEP = ' => ' From 4a5f13a72e95e0a9fbe62e7dd592d17a727c56d1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 08:40:12 -0700 Subject: [PATCH 4/9] rebaseline before this PR --- test/code_size/embind_val_wasm.json | 8 ++++---- test/code_size/hello_webgl2_wasm.json | 8 ++++---- test/code_size/hello_webgl2_wasm2js.json | 8 ++++---- test/code_size/hello_webgl_wasm.json | 8 ++++---- test/code_size/hello_webgl_wasm2js.json | 8 ++++---- test/code_size/random_printf_wasm.json | 8 ++++---- test/code_size/random_printf_wasm2js.json | 8 ++++---- test/other/metadce/test_metadce_cxx_ctors1.size | 2 +- test/other/metadce/test_metadce_cxx_ctors2.size | 2 +- test/other/metadce/test_metadce_cxx_except.size | 2 +- test/other/metadce/test_metadce_cxx_except_wasm.size | 2 +- .../metadce/test_metadce_cxx_except_wasm_exnref.size | 2 +- test/other/metadce/test_metadce_cxx_mangle.size | 2 +- test/other/metadce/test_metadce_cxx_noexcept.size | 2 +- test/other/metadce/test_metadce_cxx_wasmfs.size | 2 +- test/other/metadce/test_metadce_files_wasmfs.size | 2 +- test/other/metadce/test_metadce_hello_O0.size | 2 +- test/other/metadce/test_metadce_hello_O1.size | 2 +- test/other/metadce/test_metadce_minimal_pthreads.size | 2 +- test/other/test_unoptimized_code_size.wasm.size | 2 +- .../other/test_unoptimized_code_size_no_asserts.wasm.size | 2 +- test/other/test_unoptimized_code_size_strict.wasm.size | 2 +- 22 files changed, 43 insertions(+), 43 deletions(-) diff --git a/test/code_size/embind_val_wasm.json b/test/code_size/embind_val_wasm.json index 90c08a8403d4b..6afca9f20af9b 100644 --- a/test/code_size/embind_val_wasm.json +++ b/test/code_size/embind_val_wasm.json @@ -3,8 +3,8 @@ "a.html.gz": 380, "a.js": 7072, "a.js.gz": 2997, - "a.wasm": 11618, - "a.wasm.gz": 5811, - "total": 19242, - "total_gz": 9188 + "a.wasm": 11625, + "a.wasm.gz": 5814, + "total": 19249, + "total_gz": 9191 } diff --git a/test/code_size/hello_webgl2_wasm.json b/test/code_size/hello_webgl2_wasm.json index 9089504e4881a..248be23a973de 100644 --- a/test/code_size/hello_webgl2_wasm.json +++ b/test/code_size/hello_webgl2_wasm.json @@ -3,8 +3,8 @@ "a.html.gz": 328, "a.js": 4521, "a.js.gz": 2312, - "a.wasm": 10430, - "a.wasm.gz": 6721, - "total": 15405, - "total_gz": 9361 + "a.wasm": 10427, + "a.wasm.gz": 6719, + "total": 15402, + "total_gz": 9359 } diff --git a/test/code_size/hello_webgl2_wasm2js.json b/test/code_size/hello_webgl2_wasm2js.json index 22df22b3b101d..aebac6e1326ad 100644 --- a/test/code_size/hello_webgl2_wasm2js.json +++ b/test/code_size/hello_webgl2_wasm2js.json @@ -1,8 +1,8 @@ { "a.html": 346, "a.html.gz": 262, - "a.js": 22184, - "a.js.gz": 11590, - "total": 22530, - "total_gz": 11852 + "a.js": 22191, + "a.js.gz": 11586, + "total": 22537, + "total_gz": 11848 } diff --git a/test/code_size/hello_webgl_wasm.json b/test/code_size/hello_webgl_wasm.json index fd9d5277447d5..1453d63157ce4 100644 --- a/test/code_size/hello_webgl_wasm.json +++ b/test/code_size/hello_webgl_wasm.json @@ -3,8 +3,8 @@ "a.html.gz": 328, "a.js": 4059, "a.js.gz": 2153, - "a.wasm": 10430, - "a.wasm.gz": 6721, - "total": 14943, - "total_gz": 9202 + "a.wasm": 10427, + "a.wasm.gz": 6719, + "total": 14940, + "total_gz": 9200 } diff --git a/test/code_size/hello_webgl_wasm2js.json b/test/code_size/hello_webgl_wasm2js.json index a57e6b898806d..09f563277067f 100644 --- a/test/code_size/hello_webgl_wasm2js.json +++ b/test/code_size/hello_webgl_wasm2js.json @@ -1,8 +1,8 @@ { "a.html": 346, "a.html.gz": 262, - "a.js": 21710, - "a.js.gz": 11423, - "total": 22056, - "total_gz": 11685 + "a.js": 21717, + "a.js.gz": 11425, + "total": 22063, + "total_gz": 11687 } diff --git a/test/code_size/random_printf_wasm.json b/test/code_size/random_printf_wasm.json index 1ba9b14d0ca5c..a0299bd7386b8 100644 --- a/test/code_size/random_printf_wasm.json +++ b/test/code_size/random_printf_wasm.json @@ -1,6 +1,6 @@ { - "a.html": 12734, - "a.html.gz": 6921, - "total": 12734, - "total_gz": 6921 + "a.html": 12746, + "a.html.gz": 6918, + "total": 12746, + "total_gz": 6918 } diff --git a/test/code_size/random_printf_wasm2js.json b/test/code_size/random_printf_wasm2js.json index 09fd7096f7374..5468ccc440ee6 100644 --- a/test/code_size/random_printf_wasm2js.json +++ b/test/code_size/random_printf_wasm2js.json @@ -1,6 +1,6 @@ { - "a.html": 17321, - "a.html.gz": 7511, - "total": 17321, - "total_gz": 7511 + "a.html": 17326, + "a.html.gz": 7514, + "total": 17326, + "total_gz": 7514 } diff --git a/test/other/metadce/test_metadce_cxx_ctors1.size b/test/other/metadce/test_metadce_cxx_ctors1.size index 7d00532f6763a..8674ba2683008 100644 --- a/test/other/metadce/test_metadce_cxx_ctors1.size +++ b/test/other/metadce/test_metadce_cxx_ctors1.size @@ -1 +1 @@ -129533 +129525 diff --git a/test/other/metadce/test_metadce_cxx_ctors2.size b/test/other/metadce/test_metadce_cxx_ctors2.size index 1b7b4b6f080c1..7cb6220700cb7 100644 --- a/test/other/metadce/test_metadce_cxx_ctors2.size +++ b/test/other/metadce/test_metadce_cxx_ctors2.size @@ -1 +1 @@ -128987 +128971 diff --git a/test/other/metadce/test_metadce_cxx_except.size b/test/other/metadce/test_metadce_cxx_except.size index 8313a8a6825a2..a2113345ef95c 100644 --- a/test/other/metadce/test_metadce_cxx_except.size +++ b/test/other/metadce/test_metadce_cxx_except.size @@ -1 +1 @@ -171438 +171449 diff --git a/test/other/metadce/test_metadce_cxx_except_wasm.size b/test/other/metadce/test_metadce_cxx_except_wasm.size index c618bfedf1703..541db93715cb0 100644 --- a/test/other/metadce/test_metadce_cxx_except_wasm.size +++ b/test/other/metadce/test_metadce_cxx_except_wasm.size @@ -1 +1 @@ -142585 +142589 diff --git a/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size b/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size index 74e0792796723..aa899d8d11864 100644 --- a/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size +++ b/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size @@ -1 +1 @@ -145222 +145226 diff --git a/test/other/metadce/test_metadce_cxx_mangle.size b/test/other/metadce/test_metadce_cxx_mangle.size index f812243515430..ce8e80541e16a 100644 --- a/test/other/metadce/test_metadce_cxx_mangle.size +++ b/test/other/metadce/test_metadce_cxx_mangle.size @@ -1 +1 @@ -232993 +233002 diff --git a/test/other/metadce/test_metadce_cxx_noexcept.size b/test/other/metadce/test_metadce_cxx_noexcept.size index 7dbd1165d5715..902ffe9b372e9 100644 --- a/test/other/metadce/test_metadce_cxx_noexcept.size +++ b/test/other/metadce/test_metadce_cxx_noexcept.size @@ -1 +1 @@ -132345 +132337 diff --git a/test/other/metadce/test_metadce_cxx_wasmfs.size b/test/other/metadce/test_metadce_cxx_wasmfs.size index f972ca73bad93..9fa974b80528e 100644 --- a/test/other/metadce/test_metadce_cxx_wasmfs.size +++ b/test/other/metadce/test_metadce_cxx_wasmfs.size @@ -1 +1 @@ -169612 +169604 diff --git a/test/other/metadce/test_metadce_files_wasmfs.size b/test/other/metadce/test_metadce_files_wasmfs.size index ba89fd7d98211..167098e49333a 100644 --- a/test/other/metadce/test_metadce_files_wasmfs.size +++ b/test/other/metadce/test_metadce_files_wasmfs.size @@ -1 +1 @@ -51015 +51021 diff --git a/test/other/metadce/test_metadce_hello_O0.size b/test/other/metadce/test_metadce_hello_O0.size index c152784a85e2d..26e203f0426a4 100644 --- a/test/other/metadce/test_metadce_hello_O0.size +++ b/test/other/metadce/test_metadce_hello_O0.size @@ -1 +1 @@ -14449 +14459 diff --git a/test/other/metadce/test_metadce_hello_O1.size b/test/other/metadce/test_metadce_hello_O1.size index 2e5b071d22766..6550c57b3e56e 100644 --- a/test/other/metadce/test_metadce_hello_O1.size +++ b/test/other/metadce/test_metadce_hello_O1.size @@ -1 +1 @@ -2452 +2463 diff --git a/test/other/metadce/test_metadce_minimal_pthreads.size b/test/other/metadce/test_metadce_minimal_pthreads.size index 4a0ca42507637..b15ae42e06908 100644 --- a/test/other/metadce/test_metadce_minimal_pthreads.size +++ b/test/other/metadce/test_metadce_minimal_pthreads.size @@ -1 +1 @@ -19476 +19481 diff --git a/test/other/test_unoptimized_code_size.wasm.size b/test/other/test_unoptimized_code_size.wasm.size index 87645504d6522..23cf959c52198 100644 --- a/test/other/test_unoptimized_code_size.wasm.size +++ b/test/other/test_unoptimized_code_size.wasm.size @@ -1 +1 @@ -14446 +14456 diff --git a/test/other/test_unoptimized_code_size_no_asserts.wasm.size b/test/other/test_unoptimized_code_size_no_asserts.wasm.size index 2ce6276fc8ec5..9cd0d2620d316 100644 --- a/test/other/test_unoptimized_code_size_no_asserts.wasm.size +++ b/test/other/test_unoptimized_code_size_no_asserts.wasm.size @@ -1 +1 @@ -11644 +11654 diff --git a/test/other/test_unoptimized_code_size_strict.wasm.size b/test/other/test_unoptimized_code_size_strict.wasm.size index 87645504d6522..23cf959c52198 100644 --- a/test/other/test_unoptimized_code_size_strict.wasm.size +++ b/test/other/test_unoptimized_code_size_strict.wasm.size @@ -1 +1 @@ -14446 +14456 From f057f04cf7861bf9f87129cc613fcf6ad73a3015 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 10:01:12 -0700 Subject: [PATCH 5/9] fix --- test/code_size/embind_val_wasm.json | 8 ++++---- test/code_size/hello_webgl2_wasm.json | 8 ++++---- test/code_size/hello_webgl2_wasm2js.json | 8 ++++---- test/code_size/hello_webgl_wasm.json | 8 ++++---- test/code_size/hello_webgl_wasm2js.json | 8 ++++---- test/code_size/random_printf_wasm.json | 8 ++++---- test/other/metadce/test_metadce_minimal_pthreads.size | 2 +- tools/link.py | 8 ++++---- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/test/code_size/embind_val_wasm.json b/test/code_size/embind_val_wasm.json index 6afca9f20af9b..7e4e21bfe6256 100644 --- a/test/code_size/embind_val_wasm.json +++ b/test/code_size/embind_val_wasm.json @@ -3,8 +3,8 @@ "a.html.gz": 380, "a.js": 7072, "a.js.gz": 2997, - "a.wasm": 11625, - "a.wasm.gz": 5814, - "total": 19249, - "total_gz": 9191 + "a.wasm": 11588, + "a.wasm.gz": 5778, + "total": 19212, + "total_gz": 9155 } diff --git a/test/code_size/hello_webgl2_wasm.json b/test/code_size/hello_webgl2_wasm.json index 248be23a973de..b1b58d45ae961 100644 --- a/test/code_size/hello_webgl2_wasm.json +++ b/test/code_size/hello_webgl2_wasm.json @@ -3,8 +3,8 @@ "a.html.gz": 328, "a.js": 4521, "a.js.gz": 2312, - "a.wasm": 10427, - "a.wasm.gz": 6719, - "total": 15402, - "total_gz": 9359 + "a.wasm": 10399, + "a.wasm.gz": 6695, + "total": 15374, + "total_gz": 9335 } diff --git a/test/code_size/hello_webgl2_wasm2js.json b/test/code_size/hello_webgl2_wasm2js.json index aebac6e1326ad..02115434cb602 100644 --- a/test/code_size/hello_webgl2_wasm2js.json +++ b/test/code_size/hello_webgl2_wasm2js.json @@ -1,8 +1,8 @@ { "a.html": 346, "a.html.gz": 262, - "a.js": 22191, - "a.js.gz": 11586, - "total": 22537, - "total_gz": 11848 + "a.js": 22193, + "a.js.gz": 11584, + "total": 22539, + "total_gz": 11846 } diff --git a/test/code_size/hello_webgl_wasm.json b/test/code_size/hello_webgl_wasm.json index 1453d63157ce4..c787832cff4e7 100644 --- a/test/code_size/hello_webgl_wasm.json +++ b/test/code_size/hello_webgl_wasm.json @@ -3,8 +3,8 @@ "a.html.gz": 328, "a.js": 4059, "a.js.gz": 2153, - "a.wasm": 10427, - "a.wasm.gz": 6719, - "total": 14940, - "total_gz": 9200 + "a.wasm": 10399, + "a.wasm.gz": 6695, + "total": 14912, + "total_gz": 9176 } diff --git a/test/code_size/hello_webgl_wasm2js.json b/test/code_size/hello_webgl_wasm2js.json index 09f563277067f..4cfd2dbac9510 100644 --- a/test/code_size/hello_webgl_wasm2js.json +++ b/test/code_size/hello_webgl_wasm2js.json @@ -1,8 +1,8 @@ { "a.html": 346, "a.html.gz": 262, - "a.js": 21717, - "a.js.gz": 11425, - "total": 22063, - "total_gz": 11687 + "a.js": 21719, + "a.js.gz": 11420, + "total": 22065, + "total_gz": 11682 } diff --git a/test/code_size/random_printf_wasm.json b/test/code_size/random_printf_wasm.json index a0299bd7386b8..d673819ec543f 100644 --- a/test/code_size/random_printf_wasm.json +++ b/test/code_size/random_printf_wasm.json @@ -1,6 +1,6 @@ { - "a.html": 12746, - "a.html.gz": 6918, - "total": 12746, - "total_gz": 6918 + "a.html": 12694, + "a.html.gz": 6891, + "total": 12694, + "total_gz": 6891 } diff --git a/test/other/metadce/test_metadce_minimal_pthreads.size b/test/other/metadce/test_metadce_minimal_pthreads.size index b15ae42e06908..920392c600889 100644 --- a/test/other/metadce/test_metadce_minimal_pthreads.size +++ b/test/other/metadce/test_metadce_minimal_pthreads.size @@ -1 +1 @@ -19481 +19477 diff --git a/tools/link.py b/tools/link.py index 1bfff6eea4dc8..ef693673c80ca 100644 --- a/tools/link.py +++ b/tools/link.py @@ -424,14 +424,14 @@ def check_human_readable_list(items): if settings.WASM_EXNREF: passes += ['--emit-exnref'] - # If we are not linkable then we will invoke wasm-opt later (for metadce - # and/or import/export minification). Avoid doing StackIR optimizations at - # this time, so that we only do them at the very end (which is more + # If we are not going to run metadce then we will invoke wasm-opt later for + # that purpose (and also possibly for import/export minification). Avoid doing + # StackIR opts at this time, so we only do them at the very end (which is more # efficient, as if we do StackIR optimizations now then we'd throw that away # when we reload the wasm in anothre Binaryen tool, and also StackIR # optimizations lead to stacky code that Binaryen would need to do more work # to handle in its structured IR). - if not settings.LINKABLE: + if will_metadce(): passes += ['--no-stack-ir'] return passes From 21374b5a103ad6e7a86f1edf0f23dc4ebafa5e4a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 10:22:17 -0700 Subject: [PATCH 6/9] new test [ci skip] --- test/test_other.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/test_other.py b/test/test_other.py index 61465b80d475a..d4ea578f5e0dd 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -8038,6 +8038,26 @@ def test_eval_ctors_debug_output(self): self.assertNotContained('ctor_evaller: not successful', err) self.assertContained('could not eval: call import: env.external_thing', err) + @uses_canonical_tmp + @with_env_modify({'EMCC_DEBUG': '1'}) + @parameterized({ + # StackIR optimizations should happen once at the end, and not multiple + # times in the middle. In -O2 we simply do them in the main wasm-opt + # invocation, while in -O3 we run wasm-opt later, and so we should disable + # StackIR first and enable it at the end. + 'O2': (['-O2'], False), + 'O3': (['-O3'], True), + }) + def test_binaryen_stack_ir(self, opts, disable_and_enable): + err = self.run_process([EMXX, test_file('hello_world.c')] + opts, stderr=PIPE).stderr + DISABLE = '--no-stack-ir' + ENABLE = '--optimize-stack-ir' + self.assertContainedIf(DISABLE, err, disable_and_enable) + self.assertContainedIf(ENABLE, err, disable_and_enable) + # they should also appear at most once each + self.assertLess(err.count(DISABLE), 2) + self.assertLess(err.count(ENABLE), 2) + def test_override_js_execution_environment(self): create_file('main.c', r''' #include From 9b2e80083640591b2d6d5ee9856703556c0fbe17 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 12:36:46 -0700 Subject: [PATCH 7/9] update [ci skip] --- test/code_size/embind_val_wasm.json | 7 ------- test/code_size/hello_webgl2_wasm.json | 7 ------- test/code_size/hello_webgl2_wasm2js.json | 7 ------- test/code_size/hello_webgl_wasm.json | 7 ------- test/code_size/hello_webgl_wasm2js.json | 7 ------- test/code_size/random_printf_wasm.json | 7 ------- test/other/metadce/test_metadce_cxx_ctors1.size | 4 ---- test/other/metadce/test_metadce_cxx_ctors2.size | 4 ---- test/other/metadce/test_metadce_cxx_except.size | 4 ---- test/other/metadce/test_metadce_cxx_except_wasm.size | 4 ---- .../other/metadce/test_metadce_cxx_except_wasm_exnref.size | 4 ---- test/other/metadce/test_metadce_cxx_mangle.size | 2 +- test/other/metadce/test_metadce_cxx_noexcept.size | 4 ---- test/other/metadce/test_metadce_cxx_wasmfs.size | 4 ---- test/other/metadce/test_metadce_files_wasmfs.size | 6 +----- test/other/metadce/test_metadce_hello_O0.size | 4 ---- test/other/metadce/test_metadce_hello_O1.size | 4 ---- test/other/metadce/test_metadce_hello_O3.size | 2 +- test/other/metadce/test_metadce_hello_Os.size | 2 +- test/other/metadce/test_metadce_hello_Oz.size | 2 +- test/other/metadce/test_metadce_hello_dylink.size | 2 +- test/other/metadce/test_metadce_hello_wasmfs.size | 2 +- test/other/metadce/test_metadce_mem_O3.size | 2 +- test/other/metadce/test_metadce_mem_O3_grow.size | 2 +- .../other/metadce/test_metadce_mem_O3_grow_standalone.size | 2 +- test/other/metadce/test_metadce_mem_O3_standalone.size | 2 +- test/other/metadce/test_metadce_mem_O3_standalone_lib.size | 2 +- .../other/metadce/test_metadce_mem_O3_standalone_narg.size | 2 +- .../metadce/test_metadce_mem_O3_standalone_narg_flto.size | 2 +- test/other/metadce/test_metadce_minimal_pthreads.size | 6 +----- 30 files changed, 15 insertions(+), 101 deletions(-) diff --git a/test/code_size/embind_val_wasm.json b/test/code_size/embind_val_wasm.json index 914b2bcc61cac..7e4e21bfe6256 100644 --- a/test/code_size/embind_val_wasm.json +++ b/test/code_size/embind_val_wasm.json @@ -3,15 +3,8 @@ "a.html.gz": 380, "a.js": 7072, "a.js.gz": 2997, -<<<<<<< HEAD "a.wasm": 11588, "a.wasm.gz": 5778, "total": 19212, "total_gz": 9155 -======= - "a.wasm": 11625, - "a.wasm.gz": 5814, - "total": 19249, - "total_gz": 9191 ->>>>>>> origin/main } diff --git a/test/code_size/hello_webgl2_wasm.json b/test/code_size/hello_webgl2_wasm.json index 4aefa2cd395d8..b1b58d45ae961 100644 --- a/test/code_size/hello_webgl2_wasm.json +++ b/test/code_size/hello_webgl2_wasm.json @@ -3,15 +3,8 @@ "a.html.gz": 328, "a.js": 4521, "a.js.gz": 2312, -<<<<<<< HEAD "a.wasm": 10399, "a.wasm.gz": 6695, "total": 15374, "total_gz": 9335 -======= - "a.wasm": 10427, - "a.wasm.gz": 6719, - "total": 15402, - "total_gz": 9359 ->>>>>>> origin/main } diff --git a/test/code_size/hello_webgl2_wasm2js.json b/test/code_size/hello_webgl2_wasm2js.json index 450a81c7cbaf6..02115434cb602 100644 --- a/test/code_size/hello_webgl2_wasm2js.json +++ b/test/code_size/hello_webgl2_wasm2js.json @@ -1,15 +1,8 @@ { "a.html": 346, "a.html.gz": 262, -<<<<<<< HEAD "a.js": 22193, "a.js.gz": 11584, "total": 22539, "total_gz": 11846 -======= - "a.js": 22191, - "a.js.gz": 11586, - "total": 22537, - "total_gz": 11848 ->>>>>>> origin/main } diff --git a/test/code_size/hello_webgl_wasm.json b/test/code_size/hello_webgl_wasm.json index b35fd93c009d6..c787832cff4e7 100644 --- a/test/code_size/hello_webgl_wasm.json +++ b/test/code_size/hello_webgl_wasm.json @@ -3,15 +3,8 @@ "a.html.gz": 328, "a.js": 4059, "a.js.gz": 2153, -<<<<<<< HEAD "a.wasm": 10399, "a.wasm.gz": 6695, "total": 14912, "total_gz": 9176 -======= - "a.wasm": 10427, - "a.wasm.gz": 6719, - "total": 14940, - "total_gz": 9200 ->>>>>>> origin/main } diff --git a/test/code_size/hello_webgl_wasm2js.json b/test/code_size/hello_webgl_wasm2js.json index 88fe92fa1bbcb..4cfd2dbac9510 100644 --- a/test/code_size/hello_webgl_wasm2js.json +++ b/test/code_size/hello_webgl_wasm2js.json @@ -1,15 +1,8 @@ { "a.html": 346, "a.html.gz": 262, -<<<<<<< HEAD "a.js": 21719, "a.js.gz": 11420, "total": 22065, "total_gz": 11682 -======= - "a.js": 21717, - "a.js.gz": 11425, - "total": 22063, - "total_gz": 11687 ->>>>>>> origin/main } diff --git a/test/code_size/random_printf_wasm.json b/test/code_size/random_printf_wasm.json index 7f4049cf110ed..d673819ec543f 100644 --- a/test/code_size/random_printf_wasm.json +++ b/test/code_size/random_printf_wasm.json @@ -1,13 +1,6 @@ { -<<<<<<< HEAD "a.html": 12694, "a.html.gz": 6891, "total": 12694, "total_gz": 6891 -======= - "a.html": 12746, - "a.html.gz": 6918, - "total": 12746, - "total_gz": 6918 ->>>>>>> origin/main } diff --git a/test/other/metadce/test_metadce_cxx_ctors1.size b/test/other/metadce/test_metadce_cxx_ctors1.size index 751dbe4f4bdbe..74fbd89b46889 100644 --- a/test/other/metadce/test_metadce_cxx_ctors1.size +++ b/test/other/metadce/test_metadce_cxx_ctors1.size @@ -1,5 +1 @@ -<<<<<<< HEAD -129525 -======= 129522 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_cxx_ctors2.size b/test/other/metadce/test_metadce_cxx_ctors2.size index 75dc6de7f0bee..224cdae73fc13 100644 --- a/test/other/metadce/test_metadce_cxx_ctors2.size +++ b/test/other/metadce/test_metadce_cxx_ctors2.size @@ -1,5 +1 @@ -<<<<<<< HEAD -128971 -======= 128968 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_cxx_except.size b/test/other/metadce/test_metadce_cxx_except.size index db1d1c169f61e..77af2bff754b9 100644 --- a/test/other/metadce/test_metadce_cxx_except.size +++ b/test/other/metadce/test_metadce_cxx_except.size @@ -1,5 +1 @@ -<<<<<<< HEAD -171449 -======= 171440 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_cxx_except_wasm.size b/test/other/metadce/test_metadce_cxx_except_wasm.size index 077a7a747f3b6..32c66c04960b7 100644 --- a/test/other/metadce/test_metadce_cxx_except_wasm.size +++ b/test/other/metadce/test_metadce_cxx_except_wasm.size @@ -1,5 +1 @@ -<<<<<<< HEAD -142589 -======= 142580 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size b/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size index cffd3d58e6347..1e02f2f7bae44 100644 --- a/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size +++ b/test/other/metadce/test_metadce_cxx_except_wasm_exnref.size @@ -1,5 +1 @@ -<<<<<<< HEAD -145226 -======= 145217 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_cxx_mangle.size b/test/other/metadce/test_metadce_cxx_mangle.size index ce8e80541e16a..f812243515430 100644 --- a/test/other/metadce/test_metadce_cxx_mangle.size +++ b/test/other/metadce/test_metadce_cxx_mangle.size @@ -1 +1 @@ -233002 +232993 diff --git a/test/other/metadce/test_metadce_cxx_noexcept.size b/test/other/metadce/test_metadce_cxx_noexcept.size index 9d4ebb21f6aa9..e65d152bb4f71 100644 --- a/test/other/metadce/test_metadce_cxx_noexcept.size +++ b/test/other/metadce/test_metadce_cxx_noexcept.size @@ -1,5 +1 @@ -<<<<<<< HEAD -132337 -======= 132328 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_cxx_wasmfs.size b/test/other/metadce/test_metadce_cxx_wasmfs.size index 493613f8efbba..173b32f02be1b 100644 --- a/test/other/metadce/test_metadce_cxx_wasmfs.size +++ b/test/other/metadce/test_metadce_cxx_wasmfs.size @@ -1,5 +1 @@ -<<<<<<< HEAD -169604 -======= 169591 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_files_wasmfs.size b/test/other/metadce/test_metadce_files_wasmfs.size index 2fb6f4e0cb384..f88426bec9949 100644 --- a/test/other/metadce/test_metadce_files_wasmfs.size +++ b/test/other/metadce/test_metadce_files_wasmfs.size @@ -1,5 +1 @@ -<<<<<<< HEAD -51021 -======= -51018 ->>>>>>> origin/main +50957 diff --git a/test/other/metadce/test_metadce_hello_O0.size b/test/other/metadce/test_metadce_hello_O0.size index e22b90d6527ea..23cf959c52198 100644 --- a/test/other/metadce/test_metadce_hello_O0.size +++ b/test/other/metadce/test_metadce_hello_O0.size @@ -1,5 +1 @@ -<<<<<<< HEAD -14459 -======= 14456 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_hello_O1.size b/test/other/metadce/test_metadce_hello_O1.size index 649a81765ed65..1db299c003761 100644 --- a/test/other/metadce/test_metadce_hello_O1.size +++ b/test/other/metadce/test_metadce_hello_O1.size @@ -1,5 +1 @@ -<<<<<<< HEAD -2463 -======= 2460 ->>>>>>> origin/main diff --git a/test/other/metadce/test_metadce_hello_O3.size b/test/other/metadce/test_metadce_hello_O3.size index 2dfb72b545aa2..173a6680f8970 100644 --- a/test/other/metadce/test_metadce_hello_O3.size +++ b/test/other/metadce/test_metadce_hello_O3.size @@ -1 +1 @@ -1741 +1737 diff --git a/test/other/metadce/test_metadce_hello_Os.size b/test/other/metadce/test_metadce_hello_Os.size index 9cc56f5d51b0f..54c9fc81b32d0 100644 --- a/test/other/metadce/test_metadce_hello_Os.size +++ b/test/other/metadce/test_metadce_hello_Os.size @@ -1 +1 @@ -1732 +1728 diff --git a/test/other/metadce/test_metadce_hello_Oz.size b/test/other/metadce/test_metadce_hello_Oz.size index e6417f67d3d68..b151ec96e078d 100644 --- a/test/other/metadce/test_metadce_hello_Oz.size +++ b/test/other/metadce/test_metadce_hello_Oz.size @@ -1 +1 @@ -1290 +1286 diff --git a/test/other/metadce/test_metadce_hello_dylink.size b/test/other/metadce/test_metadce_hello_dylink.size index 1e56d0a5a68ec..d040d57fddfb8 100644 --- a/test/other/metadce/test_metadce_hello_dylink.size +++ b/test/other/metadce/test_metadce_hello_dylink.size @@ -1 +1 @@ -9355 +9347 diff --git a/test/other/metadce/test_metadce_hello_wasmfs.size b/test/other/metadce/test_metadce_hello_wasmfs.size index 2dfb72b545aa2..173a6680f8970 100644 --- a/test/other/metadce/test_metadce_hello_wasmfs.size +++ b/test/other/metadce/test_metadce_hello_wasmfs.size @@ -1 +1 @@ -1741 +1737 diff --git a/test/other/metadce/test_metadce_mem_O3.size b/test/other/metadce/test_metadce_mem_O3.size index 8f26239674769..6f0bd7fca15f4 100644 --- a/test/other/metadce/test_metadce_mem_O3.size +++ b/test/other/metadce/test_metadce_mem_O3.size @@ -1 +1 @@ -5265 +5261 diff --git a/test/other/metadce/test_metadce_mem_O3_grow.size b/test/other/metadce/test_metadce_mem_O3_grow.size index a3cfb07e7b72b..1ebe64e40449c 100644 --- a/test/other/metadce/test_metadce_mem_O3_grow.size +++ b/test/other/metadce/test_metadce_mem_O3_grow.size @@ -1 +1 @@ -5266 +5262 diff --git a/test/other/metadce/test_metadce_mem_O3_grow_standalone.size b/test/other/metadce/test_metadce_mem_O3_grow_standalone.size index 5fc7532d92b7e..97cbb3bdd4531 100644 --- a/test/other/metadce/test_metadce_mem_O3_grow_standalone.size +++ b/test/other/metadce/test_metadce_mem_O3_grow_standalone.size @@ -1 +1 @@ -5589 +5585 diff --git a/test/other/metadce/test_metadce_mem_O3_standalone.size b/test/other/metadce/test_metadce_mem_O3_standalone.size index 70c4c39d28990..2392400dc3792 100644 --- a/test/other/metadce/test_metadce_mem_O3_standalone.size +++ b/test/other/metadce/test_metadce_mem_O3_standalone.size @@ -1 +1 @@ -5514 +5510 diff --git a/test/other/metadce/test_metadce_mem_O3_standalone_lib.size b/test/other/metadce/test_metadce_mem_O3_standalone_lib.size index ee5ddad2af969..6202b2203facb 100644 --- a/test/other/metadce/test_metadce_mem_O3_standalone_lib.size +++ b/test/other/metadce/test_metadce_mem_O3_standalone_lib.size @@ -1 +1 @@ -5277 +5273 diff --git a/test/other/metadce/test_metadce_mem_O3_standalone_narg.size b/test/other/metadce/test_metadce_mem_O3_standalone_narg.size index 5149a5f23b57c..554553b353b9b 100644 --- a/test/other/metadce/test_metadce_mem_O3_standalone_narg.size +++ b/test/other/metadce/test_metadce_mem_O3_standalone_narg.size @@ -1 +1 @@ -5307 +5303 diff --git a/test/other/metadce/test_metadce_mem_O3_standalone_narg_flto.size b/test/other/metadce/test_metadce_mem_O3_standalone_narg_flto.size index ba913e428266f..ae7b8202b2a62 100644 --- a/test/other/metadce/test_metadce_mem_O3_standalone_narg_flto.size +++ b/test/other/metadce/test_metadce_mem_O3_standalone_narg_flto.size @@ -1 +1 @@ -4124 +4120 diff --git a/test/other/metadce/test_metadce_minimal_pthreads.size b/test/other/metadce/test_metadce_minimal_pthreads.size index 2a46953f4c667..13ebd505f6e91 100644 --- a/test/other/metadce/test_metadce_minimal_pthreads.size +++ b/test/other/metadce/test_metadce_minimal_pthreads.size @@ -1,5 +1 @@ -<<<<<<< HEAD -19477 -======= -19481 ->>>>>>> origin/main +19421 From 653875ee8dc43b020d7e0591e42cbc296f84d24a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 10 Jul 2024 15:07:17 -0700 Subject: [PATCH 8/9] fix comment [ci skip] --- tools/link.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/link.py b/tools/link.py index ef693673c80ca..82c790d28f189 100644 --- a/tools/link.py +++ b/tools/link.py @@ -424,13 +424,14 @@ def check_human_readable_list(items): if settings.WASM_EXNREF: passes += ['--emit-exnref'] - # If we are not going to run metadce then we will invoke wasm-opt later for - # that purpose (and also possibly for import/export minification). Avoid doing - # StackIR opts at this time, so we only do them at the very end (which is more - # efficient, as if we do StackIR optimizations now then we'd throw that away - # when we reload the wasm in anothre Binaryen tool, and also StackIR - # optimizations lead to stacky code that Binaryen would need to do more work - # to handle in its structured IR). + # If we are going to run metadce then that means we will be running binaryen + # tools after the main invocation, whose flags are determined here + # (specifically we will run metadce and possibly also wasm-opt for import/ + # export minification). And when we run such a tool it will "undo" any + # StackIR optimizations (since the conversion to BinaryenIR undoes them as it + # restructures the code). We could re-run those opts, but it is most efficient + # to just not do them now if we'll invoke other tools later, and we'll do them + # only in the very last invocation. if will_metadce(): passes += ['--no-stack-ir'] From 288314a9f4a6177a6c2c25dcd9bbc591e9a8d0db Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 11 Jul 2024 09:59:07 -0700 Subject: [PATCH 9/9] Use llvm-objcopy to strip the names section for --emit-symbol-map, to fix tests --- tools/building.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/building.py b/tools/building.py index 8c917506892f4..83ea46b773af3 100644 --- a/tools/building.py +++ b/tools/building.py @@ -1067,15 +1067,18 @@ def handle_final_wasm_symbols(wasm_file, symbols_file, debug_info): args = [] if symbols_file: args += ['--print-function-map'] - if not debug_info: - # to remove debug info, we just write to that same file, and without -g - args += ['-o', wasm_file] else: # suppress the wasm-opt warning regarding "no output file specified" args += ['--quiet'] output = run_wasm_opt(wasm_file, args=args, stdout=PIPE) if symbols_file: utils.write_file(symbols_file, output) + if not debug_info: + # strip the names section using llvm-objcopy. this is slightly slower than + # using wasm-opt (we could run wasm-opt without -g here and just tell it to + # write the file back out), but running wasm-opt would undo StackIR + # optimizations, if we did those. + strip(wasm_file, wasm_file, sections=['name']) def is_ar(filename):