summaryrefslogtreecommitdiff
path: root/src/cmd/5g/cgen.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-07-27 15:55:27 -0700
committerRuss Cox <rsc@golang.org>2009-07-27 15:55:27 -0700
commit6c393ada8aacd81efc1a01d8c8cbc8b4bad32c85 (patch)
tree1c5aa8d036d3248b71f2fa0f677256af2d051673 /src/cmd/5g/cgen.c
parentca80702c19c18b0bedd981eb06a6dbaf7c86b9e5 (diff)
downloadgolang-6c393ada8aacd81efc1a01d8c8cbc8b4bad32c85.tar.gz
avoid register computing len(x), cap(x)
for slice or string x. R=ken OCL=32249 CL=32249
Diffstat (limited to 'src/cmd/5g/cgen.c')
-rw-r--r--src/cmd/5g/cgen.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c
index 46fb048ff..327bb1aeb 100644
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -91,6 +91,20 @@ cgen(Node *n, Node *res)
goto ret;
}
+ // update addressability for string, slice
+ // can't do in walk because n->left->addable
+ // changes if n->left is an escaping local variable.
+ switch(n->op) {
+ case OLEN:
+ if(isslice(n->left->type) || istype(n->left->type, TSTRING))
+ n->addable = n->left->addable;
+ break;
+ case OCAP:
+ if(isslice(n->left->type))
+ n->addable = n->left->addable;
+ break;
+ }
+
if(n->addable) {
gmove(n, res);
goto ret;