Функция fillrpo — различия между версиями

Материал из Compilers Wiki
Перейти к: навигация, поиск
(Новая страница: «Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в Си интерфейсе QBE. Ра…»)
 
Строка 1: Строка 1:
Функция <strong>fillrpo(Fn)</strong> - функция, реализованная в [[Си интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в [[Си интерфейс | all.h]].
+
Функция <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;
		}
	}
}