23 if (!req(cp[r.
val], rcp)) {
40 for (a=0; a<p->
narg; a++) {
41 r1 = copyof(p->
arg[a], cp);
42 if (req(r1,
R) || req(r1, p->
to))
44 if (req(r,
R) || req(r, r1))
51 update(p->
to, r, cp, pw);
57 static bits extcpy[] = {
61 [Wsh] =
BIT(Wsh) |
BIT(Wsw),
62 [Wuh] =
BIT(Wuh) |
BIT(Wuw),
90 r = copyof(i->
arg[0], cp);
91 if (iscopy(i, r, fn)) {
92 update(i->
to, r, cp, pw);
93 }
else if (!req(i->
to,
R)) {
94 assert(rtype(i->
to) ==
RTmp);
95 update(i->
to, i->
to, cp, pw);
102 assert((rtype(*r) !=
RTmp || !req(copyof(*r, cp),
R)) &&
"ssa invariant broken");
123 visitphi(p, cp, &pw);
125 visitins(i, cp, &pw, fn);
134 visitphi(u->
u.
phi, cp, &pw);
137 visitins(u->
u.
ins, cp, &pw, fn);
142 die(
"invalid use %d", u->
type);
148 for (pp=&b->
phi; (p=*pp);) {
150 if (!req(r, p->
to)) {
154 for (a=0; a<p->
narg; a++)
155 subst(&p->
arg[a], cp);
159 r = copyof(i->
to, cp);
160 if (!req(r, i->
to)) {
165 subst(&i->
arg[a], cp);
170 fprintf(stderr,
"\n> Copy information:");
173 fprintf(stderr,
"\n%10s not seen!",
176 else if (!req(cp[t],
TMP(t))) {
177 fprintf(stderr,
"\n%10s copy of ",
182 fprintf(stderr,
"\n\n> After copy elimination:\n");
Blk * start
Указатель на блок функции, являющийся её входной точкой
Структура, хранящая информацию об инструкциях.
Структура, хранящая описание переменных (более подробное описание переменной ищите в Tmp)...
Содержит информацию о переменной
Tmp * tmp
Массив используемых функцией переменных
Use * use
Содержит информацию об использовании переменной
int ntmp
Размер массива tmp.
Непосредственно информация о базовом блоке.
void printfn(Fn *, FILE *)
char name[NString]
Имя переменной
Номер (в массиве Fn->tmp) первой не регистровой переменной
void printref(Ref, Fn *, FILE *)
Структура, хранящая в себе информацию о функции
uint nuse
Количество блоков, в которых переменная используется
Структура, хранящая информацию об одном "использовании" переменной.