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

Материал из Compilers Wiki
Перейти к: навигация, поиск
(Назначение)
Строка 2: Строка 2:
  
 
== Назначение ==
 
== Назначение ==
<strong>fillpreds</strong> осуществляет построение [https://ru.wikipedia.org/wiki/SSA SSA-формы].  
+
<strong>ssa</strong> осуществляет построение [https://ru.wikipedia.org/wiki/SSA SSA-формы].  
 
#Заполняет dominance frontier (границы доминирования), кладет в <code>blk->fron</code> (размер множества - в <code>blk->nfron</code>);  
 
#Заполняет dominance frontier (границы доминирования), кладет в <code>blk->fron</code> (размер множества - в <code>blk->nfron</code>);  
 
#Заполняет живые переменные;   
 
#Заполняет живые переменные;   

Версия 00:51, 4 апреля 2018

Функция ssa(Fn) - функция, реализованная в Си интерфейсе QBE. Располагается в файле cfg.c и "подключается" в all.h.

Назначение

ssa осуществляет построение SSA-формы.

  1. Заполняет dominance frontier (границы доминирования), кладет в blk->fron (размер множества - в blk->nfron);
  2. Заполняет живые переменные;
  3. Строит SSA-форму, меняя fn.

Исходный код

Функция ssa из ssa.c

/* require rpo and ndef */
void ssa(Fn *fn) {
	Name **stk, *n;
	int d, nt;
	Blk *b, *b1;
	nt = fn->ntmp;
	stk = emalloc(nt * sizeof stk[0]);
	d = debug['L'];
	debug['L'] = 0;
	filldom(fn);
	if (debug['N']) {
		fprintf(stderr, "\n> Dominators:\n");
		for (b1=fn->start; b1; b1=b1->link) {
			if (!b1->dom)
				continue;
			fprintf(stderr, "%10s:", b1->name);
			for (b=b1->dom; b; b=b->dlink)
				fprintf(stderr, " %s", b->name);
			fprintf(stderr, "\n");
		}
	}
	fillfron(fn);
	filllive(fn);
	phiins(fn);
	renblk(fn->start, stk, fn);
	while (nt--)
		while ((n=stk[nt])) {
			stk[nt] = n->up;
			nfree(n);
		}
	debug['L'] = d;
	free(stk);
	if (debug['N']) {
		fprintf(stderr, "\n> After SSA construction:\n");
		printfn(fn, stderr);
	}
}