Eliminate fully overlapping blits after coalescing stack slots

I noticed that my compiler was generating redundant blits, and after
looking through the QBE debug output I believe that I found some low
hanging fruit to help clean them up.

I'm new to this codebase, so please treat this patch with a lot of
skepticism. Happy to make any changes.

Thanks for reviewing, and thank you for QBE!
This commit is contained in:
Richard McCormack 2024-03-30 09:59:39 -04:00 committed by Quentin Carbonneaux
parent 85827e2232
commit c8fc20b8ef

13
mem.c
View file

@ -447,10 +447,15 @@ coalesce(Fn *fn)
if (i->op == Oblit0)
if (slot(&s, &off0, i->arg[0], fn, sl))
if (slot(&s0, &off1, i->arg[1], fn, sl))
if (s->s == s0->s && off0 < off1) {
sz = rsval((i+1)->arg[0]);
assert(sz >= 0);
(i+1)->arg[0] = INT(-sz);
if (s->s == s0->s) {
if (off0 < off1) {
sz = rsval((i+1)->arg[0]);
assert(sz >= 0);
(i+1)->arg[0] = INT(-sz);
} else if (off0 == off1) {
*i = (Ins){.op = Onop};
*(i+1) = (Ins){.op = Onop};
}
}
}
vfree(bl);