Функция fillrpo — различия между версиями
Alexander (обсуждение | вклад) (Новая страница: «Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в Си интерфейсе QBE. Ра…») |
Alexander (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в [[Си интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в [[ | + | Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в [[Си интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в <code>[[ all.h | all.h]]</code>. |
== Назначение == | == Назначение == |
Версия 09:13, 26 марта 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; } } }