summary refs log tree commit diff
path: root/lisc
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-10-05 21:27:02 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-10-05 21:38:55 -0400
commita83174f44741088906718cc656675099e9193ad5 (patch)
treee006679c5d7cc42692abe48a61b8776fd54067c0 /lisc
parent60aacea0c3dad234b59dcfeb5d50e3de69662515 (diff)
downloadroux-a83174f44741088906718cc656675099e9193ad5.tar.gz
factor vector duplication in vdup()
Diffstat (limited to 'lisc')
-rw-r--r--lisc/isel.c14
-rw-r--r--lisc/lisc.h1
-rw-r--r--lisc/parse.c3
-rw-r--r--lisc/rega.c12
-rw-r--r--lisc/spill.c4
-rw-r--r--lisc/util.c7
6 files changed, 17 insertions, 24 deletions
diff --git a/lisc/isel.c b/lisc/isel.c
index e4a10c8..126baf7 100644
--- a/lisc/isel.c
+++ b/lisc/isel.c
@@ -662,11 +662,8 @@ isel(Fn *fn)
 			assert(i->op != OArg && i->op != OArgc);
 			emit(i->op, i->wide, i->to, i->arg[0], i->arg[1]);
 		}
-		n = &insb[NIns] - curi;
-		free(b->ins);
-		b->ins = alloc(n * sizeof b->ins[0]);
-		memcpy(b->ins, curi, n * sizeof b->ins[0]);
-		b->nins = n;
+		b->nins = &insb[NIns] - curi;
+		vdup(&b->ins, curi, b->nins * sizeof(Ins));
 	}
 
 	if (debug['C']) {
@@ -708,11 +705,8 @@ isel(Fn *fn)
 		for (i=&b->ins[b->nins]; i>b->ins;) {
 			sel(*--i, fn);
 		}
-		n = &insb[NIns] - curi;
-		free(b->ins);
-		b->ins = alloc(n * sizeof b->ins[0]);
-		memcpy(b->ins, curi, n * sizeof b->ins[0]);
-		b->nins = n;
+		b->nins = &insb[NIns] - curi;
+		vdup(&b->ins, curi, b->nins * sizeof(Ins));
 	}
 
 	if (debug['I']) {
diff --git a/lisc/lisc.h b/lisc/lisc.h
index 8166143..7ae7db9 100644
--- a/lisc/lisc.h
+++ b/lisc/lisc.h
@@ -277,6 +277,7 @@ Blk *balloc();
 void emit(int, int, Ref, Ref, Ref);
 void emiti(Ins);
 int bcnt(Bits *);
+void vdup(void *, void *, size_t);
 
 /* parse.c */
 extern OpDesc opdesc[NOp];
diff --git a/lisc/parse.c b/lisc/parse.c
index 6e7cff1..a32df4b 100644
--- a/lisc/parse.c
+++ b/lisc/parse.c
@@ -423,8 +423,7 @@ static void
 closeblk()
 {
 	curb->nins = curi - insb;
-	curb->ins = alloc(curb->nins * sizeof(Ins));
-	memcpy(curb->ins, insb, curb->nins * sizeof(Ins));
+	vdup(&curb->ins, insb, curb->nins * sizeof(Ins));
 	blink = &curb->link;
 	curi = insb;
 }
diff --git a/lisc/rega.c b/lisc/rega.c
index ce96798..2f335e6 100644
--- a/lisc/rega.c
+++ b/lisc/rega.c
@@ -343,7 +343,6 @@ rega(Fn *fn)
 {
 	int n, t, r, x;
 	Blk *b, *b1, *s, ***ps, *blist;
-	Ins *i;
 	RMap *end, *beg, cur;
 	Phi *p;
 	uint u;
@@ -424,9 +423,6 @@ rega(Fn *fn)
 					pmadd(src, dst, tmp[t].wide);
 				}
 			pmgen();
-			/* todo, moving this out of
-			 * here would make sense */
-			n = curi-insb;
 			if (!n)
 				continue;
 			b1 = balloc();
@@ -435,10 +431,8 @@ rega(Fn *fn)
 			blist = b1;
 			fn->nblk++;
 			sprintf(b1->name, "%s_%s", b->name, s->name);
-			i = alloc(n * sizeof(Ins));
-			memcpy(i, insb, n * sizeof(Ins));
-			b1->ins = i;
-			b1->nins = n;
+			b1->nins = curi - insb;
+			vdup(&b1->ins, insb, b1->nins * sizeof(Ins));
 			b1->jmp.type = JJmp;
 			b1->s1 = s;
 			**ps = b1;
@@ -459,7 +453,7 @@ rega(Fn *fn)
 	free(beg);
 
 	if (debug['R']) {
-		fprintf(stderr, "\n> After register allocation\n");
+		fprintf(stderr, "\n> After register allocation:\n");
 		printfn(fn, stderr);
 	}
 }
diff --git a/lisc/spill.c b/lisc/spill.c
index 710ce9a..1b11031 100644
--- a/lisc/spill.c
+++ b/lisc/spill.c
@@ -401,10 +401,8 @@ spill(Fn *fn)
 				p->to = slot(p->to.val);
 		}
 		b->in = v;
-		free(b->ins);
 		b->nins = &insb[NIns] - curi;
-		b->ins = alloc(b->nins * sizeof(Ins));
-		memcpy(b->ins, curi, b->nins * sizeof(Ins));
+		vdup(&b->ins, curi, b->nins * sizeof(Ins));
 	}
 
 	/* align the locals to a 16 byte boundary */
diff --git a/lisc/util.c b/lisc/util.c
index 31f2982..fe0e4b1 100644
--- a/lisc/util.c
+++ b/lisc/util.c
@@ -65,3 +65,10 @@ bcnt(Bits *b)
 	}
 	return i;
 }
+
+void
+vdup(void *pd, void *s, size_t sz)
+{
+	free(*(void **)pd);
+	memcpy(*(void **)pd = alloc(sz), s, sz);
+}