selfhost: retire stk[i].str spill workaround (closes #14)
End-to-end validation of #8: removed the task-#8 spill in dotchainresolve; bootstrap ww2==ww3==ww4 still holds.
This commit is contained in:
@@ -7972,7 +7972,6 @@ export fn dotchainresolve(c: *cgen, n: *node, out: *dotchain) bool = {
|
|||||||
// bootstrap fixed-point (tests 993/995) — letting these locals get
|
// bootstrap fixed-point (tests 993/995) — letting these locals get
|
||||||
// declared inside the branch bodies trips a per-stage divergence in
|
// declared inside the branch bodies trips a per-stage divergence in
|
||||||
// slot counting.
|
// slot counting.
|
||||||
let stepnd: *node = nil;
|
|
||||||
let stepnm: str = "";
|
let stepnm: str = "";
|
||||||
let fi: *fieldinfo = nil;
|
let fi: *fieldinfo = nil;
|
||||||
let found: *fieldinfo = nil;
|
let found: *fieldinfo = nil;
|
||||||
@@ -7984,17 +7983,8 @@ export fn dotchainresolve(c: *cgen, n: *node, out: *dotchain) bool = {
|
|||||||
for (i >= 0) {
|
for (i >= 0) {
|
||||||
let csi: *structinfo = structlookup(c, curstruct);
|
let csi: *structinfo = structlookup(c, curstruct);
|
||||||
if (csi == nil) { return false; };
|
if (csi == nil) { return false; };
|
||||||
// Spill `stk[i]` to a *node local before reading its `.str`.
|
if (stk[i] == nil) { return false; };
|
||||||
// Task #8 closed the cgen bug behind this — cstage's N_DOT
|
stepnm = stk[i].str;
|
||||||
// had no N_INDEX-lhs branch and fell through, returning the
|
|
||||||
// (AX, BX) cgindex shape as if it were the field. The fix
|
|
||||||
// lives in cmd/w6c/cgen.c N_DOT and the mirror in this
|
|
||||||
// module's cgenexpr.ww cgdot. The spill stays for now (Pike
|
|
||||||
// rule — workaround retirement is task #14), so cstage
|
|
||||||
// compiling this source emits byte-identical asm to wwstage.
|
|
||||||
stepnd = stk[i];
|
|
||||||
if (stepnd == nil) { return false; };
|
|
||||||
stepnm = stepnd.str;
|
|
||||||
fi = csi.fields;
|
fi = csi.fields;
|
||||||
found = nil;
|
found = nil;
|
||||||
for (fi != nil) {
|
for (fi != nil) {
|
||||||
|
|||||||
@@ -2402,7 +2402,6 @@ export fn dotchainresolve(c: *cgen, n: *node, out: *dotchain) bool = {
|
|||||||
// bootstrap fixed-point (tests 993/995) — letting these locals get
|
// bootstrap fixed-point (tests 993/995) — letting these locals get
|
||||||
// declared inside the branch bodies trips a per-stage divergence in
|
// declared inside the branch bodies trips a per-stage divergence in
|
||||||
// slot counting.
|
// slot counting.
|
||||||
let stepnd: *node = nil;
|
|
||||||
let stepnm: str = "";
|
let stepnm: str = "";
|
||||||
let fi: *fieldinfo = nil;
|
let fi: *fieldinfo = nil;
|
||||||
let found: *fieldinfo = nil;
|
let found: *fieldinfo = nil;
|
||||||
@@ -2414,17 +2413,8 @@ export fn dotchainresolve(c: *cgen, n: *node, out: *dotchain) bool = {
|
|||||||
for (i >= 0) {
|
for (i >= 0) {
|
||||||
let csi: *structinfo = structlookup(c, curstruct);
|
let csi: *structinfo = structlookup(c, curstruct);
|
||||||
if (csi == nil) { return false; };
|
if (csi == nil) { return false; };
|
||||||
// Spill `stk[i]` to a *node local before reading its `.str`.
|
if (stk[i] == nil) { return false; };
|
||||||
// Task #8 closed the cgen bug behind this — cstage's N_DOT
|
stepnm = stk[i].str;
|
||||||
// had no N_INDEX-lhs branch and fell through, returning the
|
|
||||||
// (AX, BX) cgindex shape as if it were the field. The fix
|
|
||||||
// lives in cmd/w6c/cgen.c N_DOT and the mirror in this
|
|
||||||
// module's cgenexpr.ww cgdot. The spill stays for now (Pike
|
|
||||||
// rule — workaround retirement is task #14), so cstage
|
|
||||||
// compiling this source emits byte-identical asm to wwstage.
|
|
||||||
stepnd = stk[i];
|
|
||||||
if (stepnd == nil) { return false; };
|
|
||||||
stepnm = stepnd.str;
|
|
||||||
fi = csi.fields;
|
fi = csi.fields;
|
||||||
found = nil;
|
found = nil;
|
||||||
for (fi != nil) {
|
for (fi != nil) {
|
||||||
|
|||||||
@@ -7972,7 +7972,6 @@ export fn dotchainresolve(c: *cgen, n: *node, out: *dotchain) bool = {
|
|||||||
// bootstrap fixed-point (tests 993/995) — letting these locals get
|
// bootstrap fixed-point (tests 993/995) — letting these locals get
|
||||||
// declared inside the branch bodies trips a per-stage divergence in
|
// declared inside the branch bodies trips a per-stage divergence in
|
||||||
// slot counting.
|
// slot counting.
|
||||||
let stepnd: *node = nil;
|
|
||||||
let stepnm: str = "";
|
let stepnm: str = "";
|
||||||
let fi: *fieldinfo = nil;
|
let fi: *fieldinfo = nil;
|
||||||
let found: *fieldinfo = nil;
|
let found: *fieldinfo = nil;
|
||||||
@@ -7984,17 +7983,8 @@ export fn dotchainresolve(c: *cgen, n: *node, out: *dotchain) bool = {
|
|||||||
for (i >= 0) {
|
for (i >= 0) {
|
||||||
let csi: *structinfo = structlookup(c, curstruct);
|
let csi: *structinfo = structlookup(c, curstruct);
|
||||||
if (csi == nil) { return false; };
|
if (csi == nil) { return false; };
|
||||||
// Spill `stk[i]` to a *node local before reading its `.str`.
|
if (stk[i] == nil) { return false; };
|
||||||
// Task #8 closed the cgen bug behind this — cstage's N_DOT
|
stepnm = stk[i].str;
|
||||||
// had no N_INDEX-lhs branch and fell through, returning the
|
|
||||||
// (AX, BX) cgindex shape as if it were the field. The fix
|
|
||||||
// lives in cmd/w6c/cgen.c N_DOT and the mirror in this
|
|
||||||
// module's cgenexpr.ww cgdot. The spill stays for now (Pike
|
|
||||||
// rule — workaround retirement is task #14), so cstage
|
|
||||||
// compiling this source emits byte-identical asm to wwstage.
|
|
||||||
stepnd = stk[i];
|
|
||||||
if (stepnd == nil) { return false; };
|
|
||||||
stepnm = stepnd.str;
|
|
||||||
fi = csi.fields;
|
fi = csi.fields;
|
||||||
found = nil;
|
found = nil;
|
||||||
for (fi != nil) {
|
for (fi != nil) {
|
||||||
|
|||||||
Reference in New Issue
Block a user