[wasm-split] Split globals' ref.func dependencies#8443
Open
aheejin wants to merge 2 commits intowasm_split_global_transitivefrom
Open
[wasm-split] Split globals' ref.func dependencies#8443aheejin wants to merge 2 commits intowasm_split_global_transitivefrom
aheejin wants to merge 2 commits intowasm_split_global_transitivefrom
Conversation
When a global is exclusively used by a secondary module and thus moved to that module, and its initializer has a `(ref.func $func)`, we used to create a trampoline and export it from the primary module in all cases, even in the case that the function is in the same secondary module. This now moves those functions referred to by `ref.func`s to the secondary module, as long as they don't have uses anywhere else. To do this, we now skip scanning global initializers in `indirectReferencesToSecondaryFunctions`, and selectively create trampolines only when needed in `shareImportableItems`. The running time of `wasm-split` hasn't really changed with this PR, compared to the previous PR #8442 (~25s range in acx_gallery). #8441, #8442, and this PR combined reduce the size of the primary module by 46.6%. --- `wasm-objdump -h` result: - Before (#8442) ``` Type start=0x0000000c end=0x00035d44 (size=0x00035d38) count: 11185 Import start=0x00035d48 end=0x00132efc (size=0x000fd1b4) count: 32642 Function start=0x00132f00 end=0x00145dac (size=0x00012eac) count: 62890 Table start=0x00145daf end=0x001498ea (size=0x00003b3b) count: 2921 Tag start=0x001498ec end=0x001498f0 (size=0x00000004) count: 1 Global start=0x001498f4 end=0x00289e60 (size=0x0014056c) count: 47728 Export start=0x00289e65 end=0x004977fe (size=0x0020d999) count: 35861 Start start=0x00497800 end=0x00497802 (size=0x00000002) start: 828 Elem start=0x00497806 end=0x00501649 (size=0x00069e43) count: 12303 DataCount start=0x0050164b end=0x0050164c (size=0x00000001) count: 1 Code start=0x00501651 end=0x00730f22 (size=0x0022f8d1) count: 62890 Data start=0x00730f26 end=0x00750ab3 (size=0x0001fb8d) count: 1 ``` - After (This PR) ``` Type start=0x0000000c end=0x00035d38 (size=0x00035d2c) count: 11185 Import start=0x00035d3c end=0x00132ef0 (size=0x000fd1b4) count: 32642 Function start=0x00132ef4 end=0x001436cc (size=0x000107d8) count: 53001 Table start=0x001436cf end=0x0014720a (size=0x00003b3b) count: 2921 Tag start=0x0014720c end=0x00147210 (size=0x00000004) count: 1 Global start=0x00147214 end=0x00287b75 (size=0x00140961) count: 47728 Export start=0x00287b79 end=0x002e703f (size=0x0005f4c6) count: 25972 Start start=0x002e7041 end=0x002e7043 (size=0x00000002) start: 828 Elem start=0x002e7047 end=0x00349aa7 (size=0x00062a60) count: 12303 DataCount start=0x00349aa9 end=0x00349aaa (size=0x00000001) count: 1 Code start=0x00349aaf end=0x00550a4e (size=0x00206f9f) count: 53001 Data start=0x00550a52 end=0x005705df (size=0x0001fb8d) count: 1 ``` We can see while the size of the function and the code sections have decreased, the big gains come from the decrease of the export section, which can contain long function names.
This was referenced Mar 10, 2026
Member
Author
|
cc @biggs0125 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When a global is exclusively used by a secondary module and thus moved to that module, and its initializer has a
(ref.func $func), we used to create a trampoline and export it from the primary module in all cases, even in the case that the function is in the same secondary module. This now moves those functions referred to byref.funcs to the secondary module, as long as they don't have uses anywhere else.To do this, we now skip scanning global initializers in
indirectReferencesToSecondaryFunctions, and selectively create trampolines only when needed inshareImportableItems.The running time of
wasm-splithasn't really changed with this PR, compared to the previous PR #8442 (~25s range in acx_gallery).#8441, #8442, and this PR combined reduce the size of the primary module of acx_gallery by 46.6%.
wasm-objdump -hresult:We can see while the size of the function and the code sections have decreased, the big gains come from the decrease of the export section, which can contain long function names.