selfhost/cmd/wcc + lib/ww/typ: nullable fold + slot-pad fast-path (Phase A.3)
A.2's slotsize fast-path covered PTR/SLICE/CHAN/FN/STR but bailed on TAGGED (no nullable fold) and on primitives (cstage let_emit_size pads to 8B for slot storage; tinfo.size is natural width). Fallback hit count under wwdump build was 2187. A.3 closes both gaps. tinfo gains a `nullable: i32` field (fits the existing 4B pad, struct stays 96B). tinfofornode's N_TTAGGED arm detects `(*T | void)` (exactly 2 variants, one N_TPTR, one bare N_TNAME "void" — aliased or !void- wrapped void don't match) and folds to size=8, align=8, nullable=1. Mirrors cmd/wcc/check.c:412-426. slotsize fast-path re-adds TY_TAGGED (safe now) and gains a primitive- pad branch: BOOL/RUNE/I8-I64/U8-U64/INT/UINT/UINTPTR/ENUM/F32/F64 → return 8. Padding lives at the read site; tinfo.size remains a faithful natural-width SSoT. TUPLE/TSTRUCT/TARRAY deliberately stay on the fallback because per-field stride is registerstruct.totsize, not tinfo.size. Post-A.3 fallback hit count: 134 (94% reduction from A.2's 2187). Reviewer's per-kind breakdown: N_TNAME 101 (alias-to-struct chains) + N_TARRAY 33 (struct-element rounding) account for all remaining hits. Both A.4 work. Probes: `(*i32 | void)` byte-identical between stages with the 8B nullable encoding. `(*i32 | nomem)` correctly does NOT fold (nomem ≠ bare void). `(*i32 | !void)` correctly does NOT fold (N_TBANG isn't N_TNAME). 131/131 + 994 + 995 + bootstrap byte-identical (ww2==ww3==ww4).
This commit is contained in:
@@ -85,6 +85,11 @@ type tinfo = struct {
|
||||
params: *tparam,
|
||||
ret: *tinfo,
|
||||
variadic: i32,
|
||||
nullable: i32, // #61 A.3: TY_TAGGED `(*T | void)` fold collapses to
|
||||
// 8B ptr slot (null is the void variant). Mirrors
|
||||
// cstage Type.nullable (cmd/wcc/ww.h:430-433);
|
||||
// slot sits in variadic's natural pad so amalloc(96)
|
||||
// is unchanged.
|
||||
name: str,
|
||||
under: *tinfo,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user