3 #define MASK(w) (BIT(8*(w)-1)*2-1) 89 if (rtype(*r) ==
RCon)
91 assert(rtype(*r) ==
RTmp);
135 if (rtype(r) ==
RTmp) {
147 r = iins(
Kl,
Oadd, r, r1, l);
161 r = iins(
cls, ld, r,
R, l);
163 mask(
cls, &r, msk, l);
176 default:
die(
"unreachable");
179 case AUnk:
return req(a->
base, r);
197 int off,
cls, cls1, op, sz, ld;
221 if (il->
type != LLoad)
223 return load(sl, msk, il);
233 if (killsl(i->
to, sl)
247 switch (
alias(sl.
ref, sl.
sz, r1, sz, &off, curf)) {
251 msk1 = (
MASK(sz) << 8*off) & msks;
254 msk1 = (
MASK(sz) >> 8*off) & msks;
257 if ((msk1 & msk) == 0)
261 if (op ==
Oshr && off + sl.
sz > 4)
265 r = iins(cls1, op, r, r1, il);
267 if ((msk1 & msk) != msk1 || off + sz < sl.
sz)
268 mask(
cls, &r, msk1 & msk, il);
269 if ((msk & ~msk1) != 0) {
270 r1 = def(sl, msk & ~msk1, b, i, il);
273 r = iins(
cls,
Oor, r, r1, il);
276 cast(&r, sl.
cls, il);
290 for (ist=ilog; ist<&ilog[nlog]; ++ist)
296 mask(
cls, &r, msk, il);
298 cast(&r, sl.
cls, il);
303 if (killsl(p->
to, sl))
316 r1 = def(sl, msk, bp, 0, &l);
323 p =
alloc(
sizeof *p);
324 vgrow(&ilog, ++nlog);
333 for (np=0; np<b->
npred; ++np) {
336 && il->
type != LNoLoad
343 r1 = def(sl, msks, bp, 0, &l);
350 mask(
cls, &r, msk, il);
355 icmp(
const void *pa,
const void *pb)
362 if ((c = a->
bid - b->
bid))
370 if ((c = a->
off - b->
off))
392 for (i=b->
ins; i<&b->ins[b->
nins]; ++i) {
397 l = (
Loc){LRoot, i-b->
ins, b};
398 i->
arg[1] = def(sl,
MASK(sz), b, i, &l);
400 qsort(ilog, nlog,
sizeof ilog[0], icmp);
401 vgrow(&ilog, nlog+1);
404 for (ist=ilog, n=0; n<fn->
nblk; ++n) {
406 for (; ist->
bid == n && ist->
isphi; ++ist) {
413 if (ist->
bid == n && ist->
off == ni)
420 && !req(i->
arg[1],
R)) {
454 fprintf(stderr,
"\n> After load elimination:\n");
int escapes(Ref r, Fn *fn)
Blk * start
Указатель на блок функции, являющийся её входной точкой
int ncon
Размер массива con.
Структура, хранящая информацию об инструкциях.
void * vnew(ulong, size_t, Pool)
Con * con
Массив используемых функцией констант
Структура, хранящая описание переменных (более подробное описание переменной ищите в Tmp)...
Tmp * tmp
Массив используемых функцией переменных
int ntmp
Размер массива tmp.
Непосредственно информация о базовом блоке.
void idup(Ins **, Ins *, ulong)
void printfn(Fn *, FILE *)
Ref getcon(int64_t, Fn *)
void vgrow(void *, ulong)
uint nblk
Количество блоков в функции
Blk ** rpo
Ссылка на массив блоков, пронумерованных в порядке Reverse-Post Order, заполняется функцией fillrpo...
int alias(Ref p, int sp, Ref q, int sq, int *delta, Fn *fn)
struct Insert::@20::@21 phi
Ref newtmp(char *, int, Fn *)
Структура, хранящая в себе информацию о функции