5g/6g/8g: fix double function call in slice
Fixes #654.
R=ken2
CC=golang-dev
https://golang.org/cl/310041
diff --git a/src/cmd/8g/ggen.c b/src/cmd/8g/ggen.c
index f6fa7da..23177c2 100644
--- a/src/cmd/8g/ggen.c
+++ b/src/cmd/8g/ggen.c
@@ -843,9 +843,9 @@
cgen_inline(Node *n, Node *res)
{
Node nodes[5];
- Node n1, n2, nres, nnode0, ntemp;
+ Node n1, n2, nres, ntemp;
vlong v;
- int i, narg, bad;
+ int i, narg;
if(n->op != OCALLFUNC)
goto no;
@@ -950,47 +950,38 @@
return 1;
sliceslice:
- getargs(n->list, nodes, narg);
+ ntemp.op = OXXX;
+ if(!sleasy(n->list->n->right)) {
+ Node *n0;
+
+ n0 = n->list->n->right;
+ tempname(&ntemp, res->type);
+ cgen(n0, &ntemp);
+ n->list->n->right = &ntemp;
+ getargs(n->list, nodes, narg);
+ n->list->n->right = n0;
+ } else
+ getargs(n->list, nodes, narg);
nres = *res; // result
- nnode0 = nodes[0]; // input slice
- ntemp.op = OXXX;
- if(!sleasy(res) || !sleasy(&nodes[0])) {
- bad = 0;
- if(res->ullman >= UINF)
- bad = 1;
- for(i=0; i<narg; i++) {
- if(nodes[i].ullman >= UINF)
- bad = 1;
- if(nodes[i].op == OREGISTER)
- regfree(&nodes[i]);
- }
-
- if(bad)
- goto no;
-
- tempname(&ntemp, res->type);
- if(!sleasy(&nodes[0])) {
- cgen(&nodes[0], &ntemp);
- nnode0 = ntemp;
- }
- getargs(n->list, nodes, narg);
- if(!sleasy(res))
- nres = ntemp;
+ if(!sleasy(res)) {
+ if(ntemp.op == OXXX)
+ tempname(&ntemp, res->type);
+ nres = ntemp;
}
-
+
if(narg == 3) { // old[lb:]
// move width to where it would be for old[lb:hb]
nodes[3] = nodes[2];
nodes[2].op = OXXX;
// if(lb[1] > old.nel[0]) goto throw;
- n2 = nnode0;
+ n2 = nodes[0];
n2.xoffset += Array_nel;
cmpandthrow(&nodes[1], &n2);
// ret.nel = old.nel[0]-lb[1];
- n2 = nnode0;
+ n2 = nodes[0];
n2.xoffset += Array_nel;
regalloc(&n1, types[TUINT32], N);
@@ -1004,7 +995,7 @@
regfree(&n1);
} else { // old[lb:hb]
// if(hb[2] > old.cap[0]) goto throw;
- n2 = nnode0;
+ n2 = nodes[0];
n2.xoffset += Array_cap;
cmpandthrow(&nodes[2], &n2);
@@ -1031,7 +1022,7 @@
}
// ret.cap = old.cap[0]-lb[1]; (uses hb[2])
- n2 = nnode0;
+ n2 = nodes[0];
n2.xoffset += Array_cap;
regalloc(&n1, types[TUINT32], &nodes[2]);
@@ -1045,7 +1036,7 @@
regfree(&n1);
// ret.array = old.array[0]+lb[1]*width[3]; (uses lb[1])
- n2 = nnode0;
+ n2 = nodes[0];
n2.xoffset += Array_array;
regalloc(&n1, types[tptr], &nodes[1]);