commit 3ebd1a10457514d71a637b181416abd8e998a936
parent 1c79c987fcc7f947130adf86d32566849657ae54
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Wed, 27 May 2026 05:56:53 -0700
doc: aggregate/sret ABI complete on optimizer path (7 asm cases remain)
Diffstat:
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/doc/OPT_O1_PASSES.md b/doc/OPT_O1_PASSES.md
@@ -515,16 +515,11 @@ Completeness — route all ops through the optimizer:
in regs across the asm). Refactor aa64 asm clobber-mask / callee-save /
restore helpers off `NativeDirectTarget` (same wrapper pattern as va).
Toy cases: 102,104,105,108,110,19,20.
-- [~] **Aggregates / sret / byval** — mostly landed. DONE: aggregate locals
- forced to frame; per-part ABI typing in plan_call/plan_ret; aggregate
- results via copy_bytes; aggregate-typed IR_COPY/IR_LOAD/IR_STORE via
- copy_bytes. 130 (record sret) and 124 (slices) now pass. REMAINING:
- **tail call + sret** (36 musttail, 37 tail). Bug: in the tail+sret arg
- shuffle, the first argument is loaded into x8, then x8 is overwritten with
- the forwarded sret pointer before being moved to x0 — so x0 gets the sret
- pointer instead of arg0 (see `aa_plan_call` tail/sret path + the tail-call
- argument staging). Order the sret-x8 setup after the argument moves, or
- stage args through temps that don't alias x8.
+- [x] **Aggregates / sret / byval** — DONE. Aggregate locals forced to frame;
+ per-part ABI typing in plan_call/plan_ret; aggregate results via
+ copy_bytes; aggregate-typed IR_COPY/IR_LOAD/IR_STORE via copy_bytes; sret
+ x8 set after argument loads (was clobbering an arg allocated to x8).
+ 124/130/36/37 all pass.
- [ ] **BREAK_TO / CONTINUE_TO + SCOPE cond** — currently unused by frontends
(toy/c lower break/continue to `BR`+labels), but unwired in emit. Either
lower them to CFG edges in cg_ir_lower or wire emit, for true