summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-12-02 17:30:07 -0800
committerRuss Cox <rsc@golang.org>2009-12-02 17:30:07 -0800
commit7a63a65d3419ee33662b45e84f36ba50e520aef6 (patch)
tree358ee5cb2af08fd44f08fecb9b60f7de8a0b5bad
parent4e9883e6a66afdc7b79cad82f8f615b6ce93e53f (diff)
downloadgolang-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.c4
-rw-r--r--src/cmd/5g/gsubr.c2
-rw-r--r--src/cmd/6g/cgen.c4
-rw-r--r--src/cmd/6g/gsubr.c23
-rw-r--r--src/cmd/8g/cgen.c6
-rw-r--r--src/cmd/gc/range.c9
-rw-r--r--src/cmd/gc/walk.c8
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: