blob: d9aa409dddba1cb488e6ab522b17f69a14216319 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include "ir.h"
static void
porec(struct block ***rpo, struct block *b)
{
if (wasvisited(b)) return;
markvisited(b);
if (b->s2) porec(rpo, b->s2);
if (b->s1) porec(rpo, b->s1);
*--*rpo = b;
}
void
sortrpo(struct function *fn)
{
static struct block **rpobuf;
struct block **rpoend, **rpo;
int i, ndead;
xbgrow(&rpobuf, fn->nblk);
rpo = rpoend = rpobuf + fn->nblk,
startbbvisit();
fn->entry->id = 0;
porec(&rpo, fn->entry);
ndead = rpo - rpobuf;
for (struct block *blk = fn->entry; ndead > 0; blk = blk->lnext) {
if (!wasvisited(blk)) {
blk->lnext = blk->lprev = NULL;
freeblk(fn, blk);
--ndead;
}
}
for (i = 1, ++rpo; rpo < rpoend; ++rpo, ++i) {
rpo[-1]->lnext = rpo[0];
rpo[0]->lprev = rpo[-1];
rpo[0]->id = i;
}
fn->entry->lprev = rpo[-1];
rpo[-1]->lnext = fn->entry;
}
/* vim:set ts=3 sw=3 expandtab: */
|