w6c: key tagged natural-push call args on type equality, not slot size
pushargsrev's five aistagged gates (N_IDENT #55, N_CALL #21, N_INDEX #12, N_DOT #22a, deref #35) treated a tagged arg as already-tagged when its SLOT SIZE matched the param's. A same-slot subset union ((bool|void) into (i64|bool|void), both 16B) then natural-pushed the narrower box's words carrying SOURCE tags — no re-layout, no cg_widen_tag_remap twin — so the callee matched the wrong arm (silent: probes exited 10/90 where cstage exits 30/27). cstage keys widen detection on type equality (cgen.c:10000 same = (pu == au) || type_eq) and routes every non-same tagged source through the zeroed scratch + tag remap; the slot-DIFFER wwstage path already mirrored that byte-identically, so the fix computes cstage's same check once (wsame) and replaces each slot-size test with it. This also erases the last known cs!=ww shape divergence (the 16B-local staging vs direct-push frame delta on prefix subsets). 8 subsetwiden_* fixtures own the class: call-result/ident/str-payload /mid-arg remap (the wrong-arm shapes), prefix (the shape-divergence repro), and bigslot/return-pos/struct-24-to-32 sibling guards. Corpus pin 1740/343/22/209/1166/3480.
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
package wwfixture;
|
||||
|
||||
def protocolversion: i32 = 1;
|
||||
def corpuscount: i32 = 1732;
|
||||
def corpuscount: i32 = 1740;
|
||||
def errorcount: i32 = 343;
|
||||
def compilecount: i32 = 22;
|
||||
def runcount: i32 = 209;
|
||||
def runexitcount: i32 = 1158;
|
||||
def nativecount: i32 = 3464;
|
||||
def corpushash: str = "df3862c647aae744b549089ab4a180b36371fe898f5996c13099f52da203265e";
|
||||
def runexitcount: i32 = 1166;
|
||||
def nativecount: i32 = 3480;
|
||||
def corpushash: str = "a2f2514f07ca4e20457331e30f051394da3e59fcfa8f5f6ec3b33d9c14490354";
|
||||
|
||||
type directive = enum i32 {
|
||||
ERROR = 0,
|
||||
|
||||
Reference in New Issue
Block a user