Commit 802e1a61 authored by Ken Thompson's avatar Ken Thompson

static init reenabled

R=r
OCL=29358
CL=29358
parent ce5bcbe3
...@@ -11,6 +11,21 @@ static struct ...@@ -11,6 +11,21 @@ static struct
Type* type; Type* type;
} xxx; } xxx;
enum
{
TC_xxx,
TC_unknown, // class
TC_struct,
TC_array,
TC_slice,
TC_map,
TS_start, // state
TS_middle,
TS_end,
};
/* /*
* the init code (thru initfix) reformats the * the init code (thru initfix) reformats the
* var = ... * var = ...
...@@ -26,6 +41,23 @@ static struct ...@@ -26,6 +41,23 @@ static struct
* write the code in this form, but ... * write the code in this form, but ...
*/ */
static int
typeclass(Type *t)
{
if(t != T)
switch(t->etype) {
case TSTRUCT:
return TC_struct;
case TARRAY:
if(t->bound >= 0)
return TC_array;
return TC_slice;
case TMAP:
return TC_map;
}
return TC_unknown;
}
void void
initlin(Node* n) initlin(Node* n)
{ {
...@@ -78,16 +110,6 @@ sametmp(Node *n1, Node *n2) ...@@ -78,16 +110,6 @@ sametmp(Node *n1, Node *n2)
return 0; return 0;
} }
int
indsametmp(Node *n1, Node *n2)
{
if(n1->op == OIND)
if(inittmp(n1->left))
if(n1->left->xoffset == n2->xoffset)
return 1;
return 0;
}
Node* Node*
findarg(Node *n, char *arg, char *fn) findarg(Node *n, char *arg, char *fn)
{ {
...@@ -203,7 +225,11 @@ mapindex(Node *n) ...@@ -203,7 +225,11 @@ mapindex(Node *n)
// pull all the primatives // pull all the primatives
key = findarg(n, "key", "mapassign1"); key = findarg(n, "key", "mapassign1");
if(key == N)
return N;
val = findarg(n, "val", "mapassign1"); val = findarg(n, "val", "mapassign1");
if(val == N)
return N;
index = nodintconst(xxx.type->bound); index = nodintconst(xxx.type->bound);
xxx.type->bound++; xxx.type->bound++;
dowidth(xxx.type); dowidth(xxx.type);
...@@ -227,83 +253,200 @@ mapindex(Node *n) ...@@ -227,83 +253,200 @@ mapindex(Node *n)
// look through the whole structure // look through the whole structure
// and substitute references of B to A. // and substitute references of B to A.
// some rewrite goes on also. // some rewrite goes on also.
int void
initsub(Node *n, Node *nam) initsub(Node *n, Node *nam)
{ {
Iter iter; Iter iter;
Node *r, *w; Node *r, *w, *c;
int any; int class, state;
// we could probably get a little more
// out of this if we allow minimal simple
// expression on the right (eg OADDR-ONAME)
if(n->op != ONAME)
return 0;
class = typeclass(nam->type);
state = TS_start;
switch(class) {
case TC_struct:
goto str;
case TC_array:
goto ary;
case TC_slice:
goto sli;
case TC_map:
goto map;
}
return 0;
any = 0; str:
r = listfirst(&iter, &xxx.list); for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
while(r != N) { if(r->op != OAS && r->op != OEMPTY)
switch(r->op) { continue;
case OAS:
case OEMPTY: // optional first usage "nam = N"
if(r->left != N) if(r->right == N && sametmp(r->left, nam)) {
switch(r->left->op) { if(state != TS_start) {
case ONAME: dump("", r);
if(sametmp(r->left, nam)) { fatal("initsub: str-first and state=%d", state);
any = 1; }
r->left = n; state = TS_middle;
r->op = OEMPTY;
w = slicerewrite(r->right); continue;
if(w != N) { }
n = w->left; // from now on use fixed array
r->right = w; // last usage "n = nam"
break; if(r->left != N && sametmp(r->right, nam)) {
} if(state == TS_end) {
dump("", r);
w = maprewrite(r->right); fatal("initsub: str-last and state=%d", state);
if(w != N) {
n = w->left; // from now on use fixed array
r->right = w;
break;
}
}
break;
case ODOT:
if(sametmp(r->left->left, nam)) {
any = 1;
r->left->left = n;
}
if(indsametmp(r->left->left, nam)) {
any = 1;
r->left->left->left = n;
}
break;
case OINDEX:
if(sametmp(r->left->left, nam)) {
any = 1;
r->left->left = n;
}
if(indsametmp(r->left->left, nam)) {
any = 1;
r->left->left->left = n;
}
break;
} }
break; state = TS_end;
case OCALL: r->op = OEMPTY;
// call to mapassign1 continue;
// look through the parameters }
w = findarg(r, "hmap", "mapassign1");
// middle usage "(nam DOT name) AS expr"
if(r->left->op != ODOT || !sametmp(r->left->left, nam))
continue;
if(state == TS_end) {
dump("", r);
fatal("initsub: str-middle and state=%d", state);
}
state = TS_middle;
r->left->left = n;
}
return;
ary:
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
if(r->op != OAS && r->op != OEMPTY)
continue;
// optional first usage "nam = N"
if(r->right == N && sametmp(r->left, nam)) {
if(state != TS_start) {
dump("", r);
fatal("initsub: ary-first and state=%d", state);
}
state = TS_middle;
r->op = OEMPTY;
continue;
}
// last usage "n = nam"
if(r->left != N && sametmp(r->right, nam)) {
if(state == TS_end) {
dump("", r);
fatal("initsub: ary-last and state=%d", state);
}
state = TS_end;
r->op = OEMPTY;
continue;
}
// middle usage "(nam INDEX literal) = expr"
if(r->left->op != OINDEX || !sametmp(r->left->left, nam))
continue;
if(state == TS_end) {
dump("", r);
fatal("initsub: ary-middle and state=%d", state);
}
state = TS_middle;
r->left->left = n;
}
return;
sli:
w = N;
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
if(r->op != OAS && r->op != OEMPTY)
continue;
// first usage "nam = (newarray CALL args)"
if(r->right != N && sametmp(r->left, nam)) {
w = slicerewrite(r->right);
if(w == N) if(w == N)
break; continue;
if(sametmp(w, nam)) { if(state != TS_start) {
any = 1; dump("", r);
*r = *mapindex(r); fatal("initsub: ary-first and state=%d", state);
} }
if(indsametmp(w, nam)) { state = TS_middle;
fatal("indirect map index"); r->right = w;
any = 1; r->left = n;
w->right->left = n; continue;
}
// last usage "n = nam"
if(r->left != N && sametmp(r->right, nam)) {
if(state != TS_middle) {
dump("", r);
fatal("initsub: ary-last and state=%d", state);
} }
break; state = TS_end;
r->op = OEMPTY;
continue;
}
// middle usage "(nam INDEX literal) = expr"
if(r->left->op != OINDEX || !sametmp(r->left->left, nam))
continue;
if(state != TS_middle) {
dump("", r);
fatal("initsub: ary-middle and state=%d", state);
}
state = TS_middle;
r->left->left = w->left;
}
return;
map:
return;
w = N;
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
if(r->op == OCALL) {
// middle usage "(CALL mapassign1 key, val, map)"
c = mapindex(r);
if(c == N)
continue;
state = TS_middle;
*r = *c;
continue;
}
if(r->op != OAS && r->op != OEMPTY)
continue;
// first usage "nam = (newmap CALL args)"
if(r->right != N && sametmp(r->left, nam)) {
w = maprewrite(r->right);
if(w == N)
continue;
if(state != TS_start) {
dump("", r);
fatal("initsub: ary-first and state=%d", state);
}
state = TS_middle;
r->right = w;
r->left = n;
continue;
}
// last usage "n = nam"
if(r->left != N && sametmp(r->right, nam)) {
if(state != TS_middle) {
dump("", r);
fatal("initsub: ary-last and state=%d", state);
}
state = TS_end;
r->op = OEMPTY;
continue;
} }
r = listnext(&iter);
} }
return any; return;
} }
Node* Node*
...@@ -312,12 +455,11 @@ initfix(Node* n) ...@@ -312,12 +455,11 @@ initfix(Node* n)
Iter iter; Iter iter;
Node *r; Node *r;
//dump("prelin", n);
xxx.list = N; xxx.list = N;
initlin(n); initlin(n);
xxx.list = rev(xxx.list); xxx.list = rev(xxx.list);
if(1)
if(0)
return xxx.list; return xxx.list;
if(debug['A']) if(debug['A'])
...@@ -328,8 +470,7 @@ dump("preinitfix", xxx.list); ...@@ -328,8 +470,7 @@ dump("preinitfix", xxx.list);
while(r != N) { while(r != N) {
if(r->op == OAS) if(r->op == OAS)
if(inittmp(r->right)) { if(inittmp(r->right)) {
if(initsub(r->left, r->right)) initsub(r->left, r->right);
r->op = OEMPTY;
} }
r = listnext(&iter); r = listnext(&iter);
} }
......
...@@ -2382,6 +2382,7 @@ tempname(Node *n, Type *t) ...@@ -2382,6 +2382,7 @@ tempname(Node *n, Type *t)
// give each tmp a different name so that there // give each tmp a different name so that there
// a chance to registerizer them // a chance to registerizer them
snprint(namebuf, sizeof(namebuf), "autotmp_%.4d", statuniqgen); snprint(namebuf, sizeof(namebuf), "autotmp_%.4d", statuniqgen);
statuniqgen++;
s = lookup(namebuf); s = lookup(namebuf);
memset(n, 0, sizeof(*n)); memset(n, 0, sizeof(*n));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment