Функция filluse
Функция filluse(Fn) - функция, реализованная в Си интерфейсе QBE. Располагается в файле ssa.c и "подключается" в all.h.
Назначение[править]
filluse осуществляет заполнение структур fn->tmp для fn и структур tmp.use для всех fn->tmp.
Исходный код[править]
Функция filluse из ssa.c
/* fill predecessors information in blocks */
/* fill usage, width, phi, and class information
* must not change .visit fields */
void filluse(Fn *fn) {
Blk *b;
Phi *p;
Ins *i;
int m, t, tp, w;
uint a;
Tmp *tmp;
/* todo, is this the correct file? */
tmp = fn->tmp;
for (t=Tmp0; t<fn->ntmp; t++) {
tmp[t].ndef = 0;
tmp[t].nuse = 0;
tmp[t].cls = 0;
tmp[t].phi = 0;
tmp[t].width = WFull;
if (tmp[t].use == 0)
tmp[t].use = vnew(0, sizeof(Use), Pfn);
}
for (b=fn->start; b; b=b->link) {
for (p=b->phi; p; p=p->link) {
assert(rtype(p->to) == RTmp);
tp = p->to.val;
tmp[tp].ndef++;
tmp[tp].cls = p->cls;
tp = phicls(tp, fn->tmp);
for (a=0; a<p->narg; a++)
if (rtype(p->arg[a]) == RTmp) {
t = p->arg[a].val;
adduse(&tmp[t], UPhi, b, p);
t = phicls(t, fn->tmp);
if (t != tp)
tmp[t].phi = tp;
}
}
for (i=b->ins; i-b->ins < b->nins; i++) {
if (!req(i->to, R)) {
assert(rtype(i->to) == RTmp);
w = WFull;
if (isload(i->op) && i->op != Oload)
w = Wsb + (i->op - Oloadsb);
if (isext(i->op))
w = Wsb + (i->op - Oextsb);
if (w == Wsw || w == Wuw)
if (i->cls == Kw)
w = WFull;
t = i->to.val;
tmp[t].width = w;
tmp[t].ndef++;
tmp[t].cls = i->cls;
}
for (m=0; m<2; m++)
if (rtype(i->arg[m]) == RTmp) {
t = i->arg[m].val;
adduse(&tmp[t], UIns, b, i);
}
}
if (rtype(b->jmp.arg) == RTmp)
adduse(&tmp[b->jmp.arg.val], UJmp, b);
}
}