Skip to content

perf(coro): fuse synchronous child await transactions - #164

Merged
cpunion merged 4 commits into
llvm-corofrom
coro/stdlib-io-frame-perf-20260814
Aug 14, 2026
Merged

perf(coro): fuse synchronous child await transactions#164
cpunion merged 4 commits into
llvm-corofrom
coro/stdlib-io-frame-perf-20260814

Conversation

@cpunion

@cpunion cpunion commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • fuse managed-child completion preparation with bounded inline selection
  • keep llvm.coro.resume/done/destroy in generated callers while fusing allocation-elided destroy, parent reactivation, and completion consumption
  • retain the fully checked scheduler path for real suspension, depth fallback, dynamic frames, panic/recover, Goexit, cancellation, and retained panic traces
  • remove superseded compiler-only runtime hooks and bind the new hook identities into required roots and physical descriptor digests
  • refresh LLVM 22 LIT/metadata expectations and document the transaction/performance checkpoint

Validation

  • runtime core package passes; fused inline-await subset also passes with -race
  • native defer, explicit panic, and production time.Sleep E2E tests pass
  • key native/wasm pre- and post-CoroSplit await, recover, interface, method, and keepalive tests pass
  • all 12 _testmeta fixtures pass in isolated processes
  • actual standard-file, direct-syscall, blocking-pipe/timer-progress, and loopback-TCP smoke runs pass
  • go build -p=1 ./cmd/llgo passes

The aggregate metadata command was intentionally stopped when one long-lived LLVM process reached about 3.5 GiB RSS; the same 12 fixtures all passed when process-isolated. No process remained afterward.

Measured checkpoint

Darwin arm64, Go 1.26.5, LLVM 22.1.8, full LTO, same io_workload source and independent caches:

  • 5,000 standard-file operations, 9-run retired-instruction median: 1,244,109,625 -> 1,153,042,521 (-7.32%)
  • cycles median: 449,759,850 -> 442,010,131 (-1.72%)
  • stripped binary: 7,797,952 -> 7,667,072 bytes (-1.68%)
  • Mach-O __text: 4,152,648 -> 4,073,188 bytes (-1.91%)

Wall-clock file timing was noisy on the shared host, so no stable wall-time percentage is claimed.

Known independent gap

The _testgo/goexit fixture still stops before LIT checking on the pre-existing unsupported outcome-plain terminal outcome recipe goexit gap. This PR updates its ABI expectation but does not expand outcome-plain semantics.

@cpunion
cpunion merged commit b482653 into llvm-coro Aug 14, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant