schedule loop nesting computations earlier

This commit is contained in:
Quentin Carbonneaux 2016-12-21 09:56:40 -05:00
parent d04ba5eae8
commit 3c3afdc896
4 changed files with 63 additions and 26 deletions

47
cfg.c
View file

@ -228,3 +228,50 @@ fillfron(Fn *fn)
addfron(a, b->s2);
}
}
static void
loopmark(Blk *hd, Blk *b, void f(Blk *, Blk *))
{
uint p;
if (b->id < hd->id || b->visit == hd->id)
return;
b->visit = hd->id;
f(hd, b);
for (p=0; p<b->npred; ++p)
loopmark(hd, b->pred[p], f);
}
void
loopiter(Fn *fn, void f(Blk *, Blk *))
{
int n;
uint p;
Blk *b;
for (b=fn->start; b; b=b->link)
b->visit = -1;
for (n=0; n<fn->nblk; ++n) {
b = fn->rpo[n];
for (p=0; p<b->npred; ++p)
if (b->pred[p]->id >= n)
loopmark(b, b->pred[p], f);
}
}
void
multloop(Blk *hd, Blk *b)
{
(void)hd;
b->loop *= 10;
}
void
fillloop(Fn *fn)
{
Blk *b;
for (b=fn->start; b; b=b->link)
b->loop = 1;
loopiter(fn, multloop);
}