From 1a3f9445301d8a3ce2c92a0d6ce3e40a7c5adb3f Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Wed, 25 Jun 2008 11:35:06 -0700 Subject: [PATCH] simul assignment SVN=124591 --- src/cmd/gc/walk.c | 97 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 11 deletions(-) diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 0c89ff138d2..bd2e8d97aa7 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1908,42 +1908,117 @@ loop1: /* * from ascompat[ee] * a,b = c,d - * simultaneous assignment. there can be - * later use of an earlier lvalue. + * simultaneous assignment. there cannot + * be later use of an earlier lvalue. */ int -vmatch(Node *l, Node *r) +vmatch2(Node *l, Node *r) { - dump("l", l); - dump("r", r); - return 0; + +loop: + /* + * isolate all right sides + */ + if(r == N) + return 0; + switch(r->op) { + case ONAME: + // match each right given left + if(l == r) + return 1; + case OLITERAL: + return 0; + } + if(vmatch2(l, r->right)) + return 1; + r = r->left; + goto loop; +} + +int +vmatch1(Node *l, Node *r) +{ + +loop: + /* + * isolate all left sides + */ + if(l == N) + return 0; + switch(l->op) { + case ONAME: + // match each left with all rights + return vmatch2(l, r); + case OLITERAL: + return 0; + } + if(vmatch1(l->right, r)) + return 1; + l = l->left; + goto loop; } Node* reorder3(Node *n) { Iter save1, save2; - Node *l1, *l2; + Node *l1, *l2, *q, *r; int c1, c2; + r = N; + l1 = listfirst(&save1, &n); c1 = 0; while(l1 != N) { - l2 = listfirst(&save1, &n); + l2 = listfirst(&save2, &n); c2 = 0; while(l2 != N) { if(c2 > c1) { - if(vmatch(l1->left, l2->right)) { + if(vmatch1(l1->left, l2->right)) { + q = nod(OXXX, N, N); + tempname(q, l2->right->type); + q = nod(OAS, l1->left, q); + l1->left = q->right; + if(r == N) + r = q; + else + r = nod(OLIST, r, q); + break; } } - l2 = listnext(&save1); + l2 = listnext(&save2); c2++; } l1 = listnext(&save1); c1++; } - return n; + if(r == N) + return n; + + q = N; + l1 = listfirst(&save1, &n); + while(l1 != N) { + if(q == N) + q = l1; + else + q = nod(OLIST, q, l1); + l1 = listnext(&save1); + } + + r = rev(r); + l1 = listfirst(&save1, &r); + while(l1 != N) { + if(q == N) + q = l1; + else + q = nod(OLIST, q, l1); + l1 = listnext(&save1); + } + + q = rev(q); +//dump("res", q); + return q; } Node*