5c/6c/8c/vc: import various changes from charles forsyth

- cover more cases that have no side effects
- ensure function has complex FNX
- pull operators out of OFUNC level
- rewrite OSTRUCT lhs to avoid all side-effects, use regalloc() instead of regret()
This commit is contained in:
cinap_lenrek 2015-10-06 06:20:01 +02:00
parent 99ddc5b097
commit 2d59b15c39
5 changed files with 21 additions and 8 deletions

View file

@ -298,6 +298,7 @@ cgenrel(Node *n, Node *nn, int inrel)
break;
case OFUNC:
l = uncomma(l);
if(l->complex >= FNX) {
if(l->op != OIND)
diag(n, "bad function call");
@ -573,7 +574,7 @@ genasop(int o, Node *l, Node *r, Node *nn)
gopcode(o, &nod1, Z, &nod);
gmove(&nod, &nod2);
if(nn != Z)
gmove(&nod, nn);
gmove(&nod2, nn);
regfree(&nod);
regfree(&nod1);
if(hardleft)
@ -931,12 +932,12 @@ sugen(Node *n, Node *nn, long w)
case OSTRUCT:
/*
* rewrite so lhs has no fn call
* rewrite so lhs has no side effects
*/
if(nn != Z && nn->complex >= FNX) {
if(nn != Z && side(nn)) {
nod1 = *n;
nod1.type = typ(TIND, n->type);
regret(&nod2, &nod1);
regalloc(&nod2, &nod1, Z);
lcgen(nn, &nod2);
regsalloc(&nod0, &nod1);
gopcode(OAS, &nod2, Z, &nod0);
@ -1026,6 +1027,7 @@ sugen(Node *n, Node *nn, long w)
} else
nn = nn->left;
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
n->complex = FNX;
n->type = types[TVOID];
n->left->type = types[TVOID];
cgen(n, Z);

View file

@ -875,6 +875,7 @@ cgen(Node *n, Node *nn)
break;
case OFUNC:
l = uncomma(l);
if(l->complex >= FNX) {
if(l->op != OIND)
diag(n, "bad function call");
@ -1536,6 +1537,7 @@ sugen(Node *n, Node *nn, long w)
} else
nn = nn->left;
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
n->complex = FNX;
n->type = types[TVOID];
n->left->type = types[TVOID];
cgen(n, Z);

View file

@ -1606,6 +1606,7 @@ sugen(Node *n, Node *nn, long w)
} else
nn = nn->left;
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
n->complex = FNX;
n->type = types[TVOID];
n->left->type = types[TVOID];
cgen(n, Z);

View file

@ -950,6 +950,8 @@ loop:
case OOROR:
case OCOMMA:
case ODOT:
case OFAS:
case OINDEX:
if(side(n->left))
break;
n = n->right;
@ -961,6 +963,10 @@ loop:
case OSTRING:
case OLSTRING:
case ONAME:
case OREGPAIR:
case OEXREG:
case OREGISTER:
case OINDREG:
return 0;
}
return 1;

View file

@ -260,6 +260,7 @@ cgen(Node *n, Node *nn)
break;
case OFUNC:
l = uncomma(l);
if(l->complex >= FNX) {
if(l->op != OIND)
diag(n, "bad function call");
@ -530,7 +531,7 @@ genasop(int o, Node *l, Node *r, Node *nn)
gopcode(o, &nod1, Z, &nod);
gmove(&nod, &nod2);
if(nn != Z)
gmove(&nod, nn);
gmove(&nod2, nn);
regfree(&nod);
regfree(&nod1);
if(hardleft)
@ -946,12 +947,12 @@ sugen(Node *n, Node *nn, long w)
case OSTRUCT:
/*
* rewrite so lhs has no fn call
* rewrite so lhs has no side effects
*/
if(nn != Z && nn->complex >= FNX) {
if(nn != Z && side(nn)) {
nod1 = *n;
nod1.type = typ(TIND, n->type);
regret(&nod2, &nod1);
regalloc(&nod2, &nod1, Z);
lcgen(nn, &nod2);
regsalloc(&nod0, &nod1);
gopcode(OAS, &nod2, Z, &nod0);
@ -1041,6 +1042,7 @@ sugen(Node *n, Node *nn, long w)
} else
nn = nn->left;
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
n->complex = FNX;
n->type = types[TVOID];
n->left->type = types[TVOID];
cgen(n, Z);