@@ -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