diff --git a/src/cmd/5g/reg.c b/src/cmd/5g/reg.c index 47c2bedd7b..8350e4c50c 100644 --- a/src/cmd/5g/reg.c +++ b/src/cmd/5g/reg.c @@ -801,6 +801,16 @@ mkvar(Reg *r, Adr *a) if(nvar >= NVAR) { if(debug['w'] > 1 && node) fatal("variable not optimized: %D", a); + + // If we're not tracking a word in a variable, mark the rest as + // having its address taken, so that we keep the whole thing + // live at all calls. otherwise we might optimize away part of + // a variable but not all of it. + for(i=0; inode == node) + v->addr = 1; + } goto none; } diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index 3e5b1c5865..0c72d6c95c 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -659,6 +659,16 @@ mkvar(Reg *r, Adr *a) if(nvar >= NVAR) { if(debug['w'] > 1 && node != N) fatal("variable not optimized: %#N", node); + + // If we're not tracking a word in a variable, mark the rest as + // having its address taken, so that we keep the whole thing + // live at all calls. otherwise we might optimize away part of + // a variable but not all of it. + for(i=0; inode == node) + v->addr = 1; + } goto none; } diff --git a/src/cmd/8g/reg.c b/src/cmd/8g/reg.c index e8e712495c..1e8a31dd62 100644 --- a/src/cmd/8g/reg.c +++ b/src/cmd/8g/reg.c @@ -625,6 +625,16 @@ mkvar(Reg *r, Adr *a) if(nvar >= NVAR) { if(debug['w'] > 1 && node != N) fatal("variable not optimized: %D", a); + + // If we're not tracking a word in a variable, mark the rest as + // having its address taken, so that we keep the whole thing + // live at all calls. otherwise we might optimize away part of + // a variable but not all of it. + for(i=0; inode == node) + v->addr = 1; + } goto none; }