summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lisc/main.c5
-rw-r--r--lisc/ssa.c26
2 files changed, 24 insertions, 7 deletions
diff --git a/lisc/main.c b/lisc/main.c
index b3389c4..da56729 100644
--- a/lisc/main.c
+++ b/lisc/main.c
@@ -47,9 +47,11 @@ func(Fn *fn)
 		fprintf(stderr, "\n> After parsing:\n");
 		printfn(fn, stderr);
 	}
-	isel(fn);
 	fillrpo(fn);
 	fillpreds(fn);
+	ssa(fn);
+#if 0
+	isel(fn);
 	filllive(fn);
 	fillcost(fn);
 	spill(fn);
@@ -67,6 +69,7 @@ func(Fn *fn)
 		printf("/* end function %s */\n\n", fn->name);
 	} else
 		fprintf(stderr, "\n");
+#endif
 	freeall();
 }
 
diff --git a/lisc/ssa.c b/lisc/ssa.c
index d715861..455b687 100644
--- a/lisc/ssa.c
+++ b/lisc/ssa.c
@@ -100,12 +100,12 @@ inter(Blk *b1, Blk *b2)
 	if (b1 == 0)
 		return b2;
 	while (b1 != b2) {
-		if (b1->id > b2->id) {
+		if (b1->id < b2->id) {
 			bt = b1;
 			b1 = b2;
 			b2 = bt;
 		}
-		while (b1->id < b2->id)
+		while (b1->id > b2->id)
 			b1 = b1->idom;
 	}
 	return b1;
@@ -129,7 +129,8 @@ filldom(Fn *fn)
 			b = fn->rpo[n];
 			d = 0;
 			for (p=0; p<b->npred; p++)
-				if (b->pred[p]->idom)
+				if (b->pred[p]->idom
+				||  b->pred[p] == fn->start)
 					d = inter(d, b->pred[p]);
 			if (d != b->idom) {
 				ch++;
@@ -252,7 +253,7 @@ phiins(Fn *fn)
 		}
 		defs = u;
 		while (bp != be) {
-			fn->tmp[t].visit = 1;
+			fn->tmp[t].visit = t;
 			b = *bp++;
 			BCLR(u, b->id);
 			for (n=0; n<b->nfron; n++) {
@@ -263,7 +264,7 @@ phiins(Fn *fn)
 					p->wide = w;
 					p->to = TMP(t);
 					p->link = a->phi;
-					a->phi = p->link;
+					a->phi = p;
 					if (!BGET(defs, a->id))
 					if (!BGET(u, a->id)) {
 						BSET(u, a->id);
@@ -321,6 +322,7 @@ rendef(Ref *r, Blk *b, Name **stk, Fn *fn)
 	if (req(*r, R) || !fn->tmp[t].visit)
 		return;
 	r1 = index(t, fn);
+	fn->tmp[r1.val].visit = t;
 	stk[t] = nnew(r1, b, stk[t]);
 	*r = r1;
 }
@@ -373,7 +375,7 @@ renblk(Blk *b, Name **stk, Fn *fn)
 	for (ps=succ; (s=*ps); ps++)
 		for (p=s->phi; p; p=p->link) {
 			t = p->to.val;
-			if (fn->tmp[t].visit) {
+			if ((t=fn->tmp[t].visit)) {
 				m = p->narg++;
 				p->arg[m] = getstk(t, b, stk);
 				p->blk[m] = b;
@@ -388,12 +390,24 @@ ssa(Fn *fn)
 {
 	Name **stk, *n;
 	int d, nt;
+	Blk *b, *b1;
 
 	nt = fn->ntmp;
 	stk = emalloc(nt * sizeof stk[0]);
 	d = debug['L'];
 	debug['L'] = 0;
 	filldom(fn);
+	if (debug['N']) {
+		fprintf(stderr, "\n> Dominators:\n");
+		for (b1=fn->start; b1; b1=b1->link) {
+			if (!b1->dom)
+				continue;
+			fprintf(stderr, "%-10s:", b1->name);
+			for (b=b1->dom; b; b=b->dlink)
+				fprintf(stderr, " %s", b->name);
+			fprintf(stderr, "\n");
+		}
+	}
 	fillfron(fn);
 	filllive(fn);
 	phiins(fn);