Функция ssa — различия между версиями
Alexander (обсуждение | вклад) (Новая страница: «Функция <strong>ssa(Fn)</strong> - функция, реализованная в Си интерфейсе QBE. Расп…») |
Admin (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | Функция <strong>ssa(Fn)</strong> - функция, реализованная в [[Си интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в <code>[[ | + | Функция <strong>ssa(Fn)</strong> - функция, реализованная в [[Си-интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>cfg.c</code> и "подключается" в <code>[[ Си-интерфейс | all.h]]</code>. |
== Назначение == | == Назначение == | ||
− | <strong> | + | <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>); | ||
#Заполняет живые переменные; | #Заполняет живые переменные; | ||
− | #Строит [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; |
Текущая версия на 15:08, 6 апреля 2018
Функция ssa(Fn) - функция, реализованная в Си интерфейсе QBE. Располагается в файле cfg.c
и "подключается" в all.h
.
Назначение[править]
ssa осуществляет построение 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); } }