Функция fillrpo — различия между версиями
Alexander (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в [[Си интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в <code>[[ | + | Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в [[Си-интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в <code>[[ Си-интерфейс | all.h]]</code>. |
== Назначение == | == Назначение == | ||
Текущая версия на 15:10, 6 апреля 2018
Функция fillrpo(Fn) - функция, реализованная в Си интерфейсе QBE. Располагается в файле cfg.c и "подключается" в all.h.
Назначение[править]
fillrpo осуществляет обход дерева блоков в reverse postorder порядке. Вычисленные номера блоков записываются в blk->id.
Исходный код[править]
Функция fillrpo из cfg.c
void fillrpo(Fn *f) {
uint n;
Blk *b, **p;
for (b=f->start; b; b=b->link)
b->id = -1u;
n = 1 + rporec(f->start, f->nblk-1);
f->nblk -= n;
f->rpo = alloc(f->nblk * sizeof f->rpo[0]);
for (p=&f->start; (b=*p);) {
if (b->id == -1u) {
edgedel(b, &b->s1);
edgedel(b, &b->s2);
*p = b->link;
} else {
b->id -= n;
f->rpo[b->id] = b;
p = &b->link;
}
}
}