Skip to content

Commit 1a6277d

Browse files
committed
v2: decrease arm64 binary size from 20MB to 12MB by optimizing arm64 gen
1 parent 4bcc424 commit 1a6277d

6 files changed

Lines changed: 563 additions & 62 deletions

File tree

‎vlib/v2/builder/builder.v‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,6 +1506,24 @@ fn (mut b Builder) gen_native(backend_arch pref.Arch) {
15061506
ssa_builder.used_fn_keys = b.used_fn_keys.clone()
15071507
}
15081508

1509+
// --single-backend: strip unused backend modules from the binary
1510+
if b.pref.single_backend {
1511+
all_backends := ['cleanc', 'eval', 'c', 'x64', 'arm64']
1512+
own := match b.pref.backend {
1513+
.arm64 { 'arm64' }
1514+
.x64 { 'x64' }
1515+
.cleanc { 'cleanc' }
1516+
.c { 'c' }
1517+
.eval { 'eval' }
1518+
else { '' }
1519+
}
1520+
for backend_mod in all_backends {
1521+
if backend_mod != own {
1522+
ssa_builder.skip_modules[backend_mod] = true
1523+
}
1524+
}
1525+
}
1526+
15091527
// In hot_fn mode, only build the target function body (skip all others)
15101528
if b.pref.hot_fn.len > 0 {
15111529
ssa_builder.hot_fn = b.pref.hot_fn

‎vlib/v2/builder/ssa_build_parallel.v‎

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,12 @@ fn (mut b Builder) ssa_build_parallel(mut ssa_builder ssa.Builder, files []ast.F
109109
seed_instrs := mod.instrs.len
110110
seed_blocks := mod.blocks.len
111111
seed_types := mod.type_store.types.len
112+
seed_funcs := mod.funcs.len
112113

113114
mut workers := []voidptr{cap: actual_chunks}
114115
for ci := 0; ci < actual_chunks; ci++ {
115116
mut worker_mod := mod.new_worker_module()
116-
mut worker_b := ssa_builder.new_worker_clone(worker_mod)
117+
mut worker_b := ssa_builder.new_worker_clone(worker_mod, ci)
117118
workers << voidptr(worker_b)
118119
}
119120

@@ -153,16 +154,25 @@ fn (mut b Builder) ssa_build_parallel(mut ssa_builder ssa.Builder, files []ast.F
153154
for ci := 0; ci < chunk_idx; ci++ {
154155
w := unsafe { &ssa.Builder(workers[ci]) }
155156
w_mod := w.mod
156-
// Collect func_data from worker's modified funcs[]
157+
// Collect func_data from worker's modified funcs[].
158+
// Only include functions that were actually built by this worker,
159+
// not pre-seeded synthetic functions (array__eq, wyhash*, etc.)
160+
// whose blocks already exist in the main module from Phase 3.5.
157161
mut func_data := []ssa.FuncSSAData{cap: 512}
158162
for fi2 := 0; fi2 < w_mod.funcs.len; fi2++ {
159163
wf := w_mod.funcs[fi2]
160-
if wf.blocks.len > 0 {
161-
func_data << ssa.FuncSSAData{
162-
func_idx: fi2
163-
blocks: wf.blocks
164-
params: wf.params
165-
}
164+
if wf.blocks.len == 0 {
165+
continue
166+
}
167+
// Seeded funcs (fi2 < seed_funcs) that already had blocks before
168+
// workers started are not new work — skip them.
169+
if fi2 < seed_funcs && wf.blocks[0] < seed_blocks {
170+
continue
171+
}
172+
func_data << ssa.FuncSSAData{
173+
func_idx: fi2
174+
blocks: wf.blocks
175+
params: wf.params
166176
}
167177
}
168178
mod.merge_worker_module(w_mod, func_data, seed_values, seed_instrs, seed_blocks,

0 commit comments

Comments
 (0)