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]);