Функция 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); } }