diff options
author | Russ Cox <rsc@golang.org> | 2009-12-02 17:30:07 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-12-02 17:30:07 -0800 |
commit | 7a63a65d3419ee33662b45e84f36ba50e520aef6 (patch) | |
tree | 358ee5cb2af08fd44f08fecb9b60f7de8a0b5bad | |
parent | 4e9883e6a66afdc7b79cad82f8f615b6ce93e53f (diff) | |
download | golang-7a63a65d3419ee33662b45e84f36ba50e520aef6.tar.gz |
6g etc: groundwork for eliminating redundant bounds checks.
drop check in range over array.
drop check in [256]array indexed by byte.
R=ken2
http://codereview.appspot.com/163088
-rw-r--r-- | src/cmd/5g/cgen.c | 4 | ||||
-rw-r--r-- | src/cmd/5g/gsubr.c | 2 | ||||
-rw-r--r-- | src/cmd/6g/cgen.c | 4 | ||||
-rw-r--r-- | src/cmd/6g/gsubr.c | 23 | ||||
-rw-r--r-- | src/cmd/8g/cgen.c | 6 | ||||
-rw-r--r-- | src/cmd/gc/range.c | 9 | ||||
-rw-r--r-- | src/cmd/gc/walk.c | 8 |
7 files changed, 34 insertions, 22 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c index 6fc42f5ac..dea94dc08 100644 --- a/src/cmd/5g/cgen.c +++ b/src/cmd/5g/cgen.c @@ -547,7 +547,7 @@ agen(Node *n, Node *res) v = mpgetfix(nr->val.u.xval); if(isslice(nl->type)) { - if(!debug['B']) { + if(!debug['B'] && !n->etype) { n1 = n3; n1.op = OINDREG; n1.type = types[tptr]; @@ -599,7 +599,7 @@ agen(Node *n, Node *res) gmove(&n1, &n2); regfree(&n1); - if(!debug['B']) { + if(!debug['B'] && !n->etype) { // check bounds regalloc(&n4, types[TUINT32], N); if(isslice(nl->type)) { diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c index b14c7d2f3..5357d06fa 100644 --- a/src/cmd/5g/gsubr.c +++ b/src/cmd/5g/gsubr.c @@ -1767,7 +1767,7 @@ oindex_const: v = mpgetfix(r->val.u.xval); if(o & ODynam) { - if(!debug['B']) { + if(!debug['B'] && !n->etype) { n1 = *reg; n1.op = OINDREG; n1.type = types[tptr]; diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c index 041f6c13c..1e7c6e442 100644 --- a/src/cmd/6g/cgen.c +++ b/src/cmd/6g/cgen.c @@ -504,7 +504,7 @@ agen(Node *n, Node *res) v = mpgetfix(nr->val.u.xval); if(isslice(nl->type)) { - if(!debug['B']) { + if(!debug['B'] && !n->etype) { n1 = n3; n1.op = OINDREG; n1.type = types[tptr]; @@ -547,7 +547,7 @@ agen(Node *n, Node *res) gmove(&n1, &n2); regfree(&n1); - if(!debug['B']) { + if(!debug['B'] && !n->etype) { // check bounds if(isslice(nl->type)) { n1 = n3; diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c index 4f3c85a6b..7461649ad 100644 --- a/src/cmd/6g/gsubr.c +++ b/src/cmd/6g/gsubr.c @@ -1827,23 +1827,24 @@ oindex: agen(l, reg); } + if(!(o & ODynam) && l->type->width >= unmappedzero && l->op == OIND) { + // cannot rely on page protections to + // catch array ptr == 0, so dereference. + n2 = *reg; + n2.op = OINDREG; + n2.type = types[TUINT8]; + n2.xoffset = 0; + gins(ATESTB, nodintconst(0), &n2); + } + // check bounds - if(!debug['B']) { + if(!debug['B'] && !n->etype) { if(o & ODynam) { n2 = *reg; n2.op = OINDREG; n2.type = types[tptr]; n2.xoffset = Array_nel; } else { - if(l->type->width >= unmappedzero && l->op == OIND) { - // cannot rely on page protections to - // catch array ptr == 0, so dereference. - n2 = *reg; - n2.op = OINDREG; - n2.type = types[TUINT8]; - n2.xoffset = 0; - gins(ATESTB, nodintconst(0), &n2); - } nodconst(&n2, types[TUINT64], l->type->bound); } gins(optoas(OCMP, types[TUINT32]), reg1, &n2); @@ -1879,7 +1880,7 @@ oindex_const: v = mpgetfix(r->val.u.xval); if(o & ODynam) { - if(!debug['B']) { + if(!debug['B'] && !n->etype) { n1 = *reg; n1.op = OINDREG; n1.type = types[tptr]; diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c index 84cb4bcbe..3f0514a36 100644 --- a/src/cmd/8g/cgen.c +++ b/src/cmd/8g/cgen.c @@ -540,7 +540,7 @@ agen(Node *n, Node *res) v = mpgetfix(nr->val.u.xval); if(isslice(nl->type)) { - if(!debug['B']) { + if(!debug['B'] && !n->etype) { n1 = n3; n1.op = OINDREG; n1.type = types[tptr]; @@ -558,7 +558,7 @@ agen(Node *n, Node *res) n1.xoffset = Array_array; gmove(&n1, &n3); } else - if(!debug['B']) { + if(!debug['B'] && !n->etype) { if(v < 0) yyerror("out of bounds on array"); else @@ -583,7 +583,7 @@ agen(Node *n, Node *res) gmove(&n1, &n2); regfree(&n1); - if(!debug['B']) { + if(!debug['B'] && !n->etype) { // check bounds if(isslice(nl->type)) { n1 = n3; diff --git a/src/cmd/gc/range.c b/src/cmd/gc/range.c index 758cd4f29..4147e8e6c 100644 --- a/src/cmd/gc/range.c +++ b/src/cmd/gc/range.c @@ -91,7 +91,7 @@ walkrange(Node *n) Node *ohv1, *hv1, *hv2; // hidden (old) val 1, 2 Node *ha, *hit; // hidden aggregate, iterator Node *a, *v1, *v2; // not hidden aggregate, val 1, 2 - Node *fn; + Node *fn, *tmp; NodeList *body, *init; Type *th, *t; @@ -128,8 +128,11 @@ walkrange(Node *n) n->nincr = nod(OASOP, hv1, nodintconst(1)); n->nincr->etype = OADD; body = list1(nod(OAS, v1, hv1)); - if(v2) - body = list(body, nod(OAS, v2, nod(OINDEX, ha, hv1))); + if(v2) { + tmp = nod(OINDEX, ha, hv1); + tmp->etype = 1; // no bounds check + body = list(body, nod(OAS, v2, tmp)); + } break; case TMAP: diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 3c3a00cfd..62bbf9f5a 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -787,6 +787,14 @@ walkexpr(Node **np, NodeList **init) case OINDEX: walkexpr(&n->left, init); walkexpr(&n->right, init); + + // if range of type cannot exceed static array bound, + // disable bounds check + if(!isslice(n->left->type)) + if(n->right->type->width < 4) + if((1<<(8*n->right->type->width)) <= n->left->type->bound) + n->etype = 1; + goto ret; case OINDEXMAP: |