diff options
author | Russ Cox <rsc@golang.org> | 2009-07-27 15:55:27 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-07-27 15:55:27 -0700 |
commit | 6c393ada8aacd81efc1a01d8c8cbc8b4bad32c85 (patch) | |
tree | 1c5aa8d036d3248b71f2fa0f677256af2d051673 /src/cmd/5g/cgen.c | |
parent | ca80702c19c18b0bedd981eb06a6dbaf7c86b9e5 (diff) | |
download | golang-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.c | 14 |
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; |