17 tmpuse(
Ref r,
int use,
int loop,
Fn *fn)
22 if (rtype(r) ==
RMem) {
24 tmpuse(m->
base, 1, loop, fn);
25 tmpuse(m->
index, 1, loop, fn);
51 fprintf(stderr,
"\n> Loop information:\n");
53 for (a=0; a<b->
npred; ++a)
57 fprintf(stderr,
"\t%-10s", b->
name);
58 fprintf(stderr,
" (% 3d ", b->
nlive[0]);
59 fprintf(stderr,
"% 3d) ", b->
nlive[1]);
72 tmpuse(p->
to, 0, 0, fn);
73 for (a=0; a<p->
narg; a++) {
76 tmpuse(p->
arg[a], 1, n, fn);
81 tmpuse(i->
to, 0, n, fn);
82 tmpuse(i->
arg[0], 1, n, fn);
83 tmpuse(i->
arg[1], 1, n, fn);
85 tmpuse(b->
jmp.
arg, 1, n, fn);
88 fprintf(stderr,
"\n> Spill costs:\n");
90 fprintf(stderr,
"\t%-10s %d\n",
93 fprintf(stderr,
"\n");
103 static BSet mask[2][1];
106 tcmp0(
const void *pa,
const void *pb)
110 ca = tmp[*(
int *)pa].cost;
111 cb = tmp[*(
int *)pb].cost;
112 return (cb < ca) ? -1 : (cb > ca);
116 tcmp1(
const void *pa,
const void *pb)
120 c = bshas(fst, *(
int *)pb) - bshas(fst, *(
int *)pa);
121 return c ? c : tcmp0(pa, pb);
129 assert(t >=
Tmp0 &&
"cannot spill register");
146 if (slot4 == slot8) {
161 static int *tarr, maxt;
169 tarr =
emalloc(nt *
sizeof tarr[0]);
172 for (i=0, t=0;
bsiter(b, &t); t++) {
177 qsort(tarr, nt,
sizeof tarr[0], tcmp0);
180 qsort(tarr, nt,
sizeof tarr[0], tcmp1);
182 for (i=0; i<k && i<nt; i++)
189 limit2(
BSet *b1,
int k1,
int k2,
BSet *fst)
197 limit(b1,
T.
ngpr - k1, fst);
198 limit(b2,
T.
nfpr - k2, fst);
208 tmp[
phicls(t, tmp)].hint.m |= r;
260 store(i->
to, tmp[t].slot);
263 }
while (i != b->
ins && regcpy(i-1));
268 for (n=0, r=0;
T.
rsave[n]>=0; n++)
298 Blk *b, *s1, *s2, *hd, **bp;
299 int j, l, t, k, lvarg[2];
301 BSet u[1], v[1], w[1];
317 for (t=0; t<ntmp; t++) {
337 if (s1 && s1->
id <= b->
id)
339 if (s2 && s2->
id <= b->
id)
340 if (!hd || s2->
id >= hd->
id)
346 for (k=0; k<2; k++) {
356 limit(w, n - (l - j), 0);
391 if (!req(i->
to,
R)) {
392 assert(rtype(i->
to) ==
RTmp);
408 switch (rtype(i->
arg[n])) {
423 lvarg[n] = bshas(v, t);
432 if (rtype(i->
arg[n]) ==
RTmp) {
444 if (!req(i->
to,
R)) {
446 store(i->
to, tmp[t].
slot);
457 assert(rtype(p->
to) ==
RTmp);
461 store(p->
to, tmp[t].
slot);
462 }
else if (bshas(b->
in, t))
477 fprintf(stderr,
"\n> Block information:\n");
479 fprintf(stderr,
"\t%-10s (% 5d) ", b->
name, b->
loop);
482 fprintf(stderr,
"\n> After spilling:\n");
Blk * start
Указатель на блок функции, являющийся её входной точкой
void emit(int, int, Ref, Ref, Ref)
void bsunion(BSet *, BSet *)
Структура, хранящая информацию об инструкциях.
uint ndef
Количество блоков, в которых есть объявление переменной
void bsinit(BSet *, uint)
void bscopy(BSet *, BSet *)
Структура, хранящая описание переменных (более подробное описание переменной ищите в Tmp)...
Содержит информацию о переменной
Tmp * tmp
Массив используемых функцией переменных
int ntmp
Размер массива tmp.
Непосредственно информация о базовом блоке.
int bsiter(BSet *, int *)
void idup(Ins **, Ins *, ulong)
void printfn(Fn *, FILE *)
void loopiter(Fn *, void(*)(Blk *, Blk *))
char name[NString]
Имя переменной
uint nblk
Количество блоков в функции
bits(* retregs)(Ref, int[2])
Blk ** rpo
Ссылка на массив блоков, пронумерованных в порядке Reverse-Post Order, заполняется функцией fillrpo...
bits(* argregs)(Ref, int[2])
Номер (в массиве Fn->tmp) первой не регистровой переменной
void bsinter(BSet *, BSet *)
void bsdiff(BSet *, BSet *)
void liveon(BSet *, Blk *, Blk *)
void dumpts(BSet *, Tmp *, FILE *)
Структура, хранящая в себе информацию о функции
uint nuse
Количество блоков, в которых переменная используется