commit a83174f44741088906718cc656675099e9193ad5
parent 60aacea0c3dad234b59dcfeb5d50e3de69662515
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Mon, 5 Oct 2015 21:27:02 -0400
factor vector duplication in vdup()
Diffstat:
6 files changed, 17 insertions(+), 24 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
+}