aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-05-28 21:46:20 -0400
committerRuss Cox <rsc@golang.org>2014-05-28 21:46:20 -0400
commit9dd062b82e9fc126c787449cc3b4730d0d0525c6 (patch)
tree9a4a47072a79e3d697e55797581ecc33029832d5
parent948b2c722b32d2bc63d6f326c80831801b0e06f7 (diff)
downloadgo-9dd062b82e9fc126c787449cc3b4730d0d0525c6.tar.gz
go-9dd062b82e9fc126c787449cc3b4730d0d0525c6.zip
undo CL 102820043 / b0ce6dbafc18
Breaks 386 and arm builds. The obvious reason is that this CL only edited 6g/gsubr.c and failed to edit 5g/gsubr.c and 8g/gsubr.c. However, the obvious CL applying the same edit to those files (CL 101900043) causes mysterious build failures in various of the standard package tests, usually involving reflect. Something deep and subtle is broken but only on the 32-bit systems. Undo this CL for now. ««« original CL description cmd/gc: fix x=x crash The 'nodarg' function is used to obtain a Node* representing a function argument or result. It returned a brand new Node*, but that violates the guarantee in most places in the compiler that two Node*s refer to the same variable if and only if they are the same Node* pointer. Reestablish that invariant by making nodarg return a preexisting named variable if present. Having fixed that, avoid any copy during x=x in componentgen, because the VARDEF we emit before the copy marks the lhs x as dead incorrectly. The change in walk.c avoids modifying the result of nodarg. This was the only place in the compiler that did so. Fixes #8097. LGTM=r, khr R=golang-codereviews, r, khr CC=golang-codereviews, iant https://golang.org/cl/102820043 »»» TBR=r CC=golang-codereviews, khr https://golang.org/cl/95660043
-rw-r--r--src/cmd/5g/cgen.c8
-rw-r--r--src/cmd/6g/cgen.c7
-rw-r--r--src/cmd/6g/gsubr.c9
-rw-r--r--src/cmd/8g/cgen.c7
-rw-r--r--src/cmd/gc/walk.c3
-rw-r--r--test/live.go26
6 files changed, 1 insertions, 59 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c
index 9011b20228..9faf754617 100644
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -1490,7 +1490,6 @@ sgen(Node *n, Node *res, int64 w)
}
if(osrc%align != 0 || odst%align != 0)
fatal("sgen: unaligned offset src %d or dst %d (align %d)", osrc, odst, align);
-
// if we are copying forward on the stack and
// the src and dst overlap, then reverse direction
dir = align;
@@ -1675,13 +1674,6 @@ componentgen(Node *nr, Node *nl)
freer = 1;
}
- // nl and nr are 'cadable' which basically means they are names (variables) now.
- // If they are the same variable, don't generate any code, because the
- // VARDEF we generate will mark the old value as dead incorrectly.
- // (And also the assignments are useless.)
- if(nr != N && nl->op == ONAME && nr->op == ONAME && nl == nr)
- goto yes;
-
switch(nl->type->etype) {
case TARRAY:
if(nl->op == ONAME)
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index 4dd505b086..ae1309142c 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -1585,13 +1585,6 @@ componentgen(Node *nr, Node *nl)
freer = 1;
}
}
-
- // nl and nr are 'cadable' which basically means they are names (variables) now.
- // If they are the same variable, don't generate any code, because the
- // VARDEF we generate will mark the old value as dead incorrectly.
- // (And also the assignments are useless.)
- if(nr != N && nl->op == ONAME && nr->op == ONAME && nl == nr)
- goto yes;
switch(nl->type->etype) {
case TARRAY:
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index e4d00bf419..bd2f2304b4 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -462,7 +462,6 @@ Node*
nodarg(Type *t, int fp)
{
Node *n;
- NodeList *l;
Type *first;
Iter savet;
@@ -483,14 +482,6 @@ nodarg(Type *t, int fp)
if(t->etype != TFIELD)
fatal("nodarg: not field %T", t);
-
- if(fp == 1) {
- for(l=curfn->dcl; l; l=l->next) {
- n = l->n;
- if((n->class == PPARAM || n->class == PPARAMOUT) && !isblanksym(t->sym) && n->sym == t->sym)
- return n;
- }
- }
n = nod(ONAME, N, N);
n->type = t->type;
diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c
index d626c2eb02..1aae7771c7 100644
--- a/src/cmd/8g/cgen.c
+++ b/src/cmd/8g/cgen.c
@@ -1397,13 +1397,6 @@ componentgen(Node *nr, Node *nl)
}
}
- // nl and nr are 'cadable' which basically means they are names (variables) now.
- // If they are the same variable, don't generate any code, because the
- // VARDEF we generate will mark the old value as dead incorrectly.
- // (And also the assignments are useless.)
- if(nr != N && nl->op == ONAME && nr->op == ONAME && nl == nr)
- goto yes;
-
switch(nl->type->etype) {
case TARRAY:
if(nl->op == ONAME)
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 1cb25512e5..2d402d04f5 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1652,8 +1652,7 @@ ascompatte(int op, Node *call, int isddd, Type **nl, NodeList *lr, int fp, NodeL
// optimization - can do block copy
if(eqtypenoname(r->type, *nl)) {
a = nodarg(*nl, fp);
- r = nod(OCONVNOP, r, N);
- r->type = a->type;
+ a->type = r->type;
nn = list1(convas(nod(OAS, a, r), init));
goto ret;
}
diff --git a/test/live.go b/test/live.go
index 286fcc3064..21d3e6a5fa 100644
--- a/test/live.go
+++ b/test/live.go
@@ -564,29 +564,3 @@ func f38(b bool) {
}
println()
}
-
-// issue 8097: mishandling of x = x during return.
-
-func f39() (x []int) {
- x = []int{1}
- println() // ERROR "live at call to printnl: x"
- return x
-}
-
-func f39a() (x []int) {
- x = []int{1}
- println() // ERROR "live at call to printnl: x"
- return
-}
-
-func f39b() (x [10]*int) {
- x = [10]*int{new(int)} // ERROR "live at call to new: x"
- println() // ERROR "live at call to printnl: x"
- return x
-}
-
-func f39c() (x [10]*int) {
- x = [10]*int{new(int)} // ERROR "live at call to new: x"
- println() // ERROR "live at call to printnl: x"
- return
-}