Функция ssa — различия между версиями
Alexander (обсуждение | вклад) (Новая страница: «Функция <strong>ssa(Fn)</strong> - функция, реализованная в Си интерфейсе QBE. Расп…») |
Alexander (обсуждение | вклад) |
||
| Строка 2: | Строка 2: | ||
== Назначение == | == Назначение == | ||
| − | <strong>fillpreds</strong> осуществляет построение [https://ru.wikipedia.org/wiki/SSA | + | <strong>fillpreds</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>); | ||
#Заполняет живые переменные; | #Заполняет живые переменные; | ||
| − | #Строит [https://ru.wikipedia.org/wiki/SSA | + | #Строит [https://ru.wikipedia.org/wiki/SSA SSA-форму], меняя fn. |
== Исходный код == | == Исходный код == | ||
Функция <strong>ssa</strong> из <code>ssa.c</code> | Функция <strong>ssa</strong> из <code>ssa.c</code> | ||
| − | /* require rpo and ndef */ | + | /* require rpo and ndef */ |
| − | void ssa(Fn *fn) { | + | void ssa(Fn *fn) { |
Name **stk, *n; | Name **stk, *n; | ||
int d, nt; | int d, nt; | ||
Версия 09:17, 26 марта 2018
Функция ssa(Fn) - функция, реализованная в Си интерфейсе QBE. Располагается в файле cfg.c и "подключается" в all.h.
Назначение
fillpreds осуществляет построение SSA-формы.
- Заполняет dominance frontier (границы доминирования), кладет в
blk->fron(размер множества - вblk->nfron); - Заполняет живые переменные;
- Строит 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);
}
}