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:
parent
85827e2232
commit
c8fc20b8ef
1 changed files with 9 additions and 4 deletions
7
mem.c
7
mem.c
|
@ -447,10 +447,15 @@ coalesce(Fn *fn)
|
||||||
if (i->op == Oblit0)
|
if (i->op == Oblit0)
|
||||||
if (slot(&s, &off0, i->arg[0], fn, sl))
|
if (slot(&s, &off0, i->arg[0], fn, sl))
|
||||||
if (slot(&s0, &off1, i->arg[1], fn, sl))
|
if (slot(&s0, &off1, i->arg[1], fn, sl))
|
||||||
if (s->s == s0->s && off0 < off1) {
|
if (s->s == s0->s) {
|
||||||
|
if (off0 < off1) {
|
||||||
sz = rsval((i+1)->arg[0]);
|
sz = rsval((i+1)->arg[0]);
|
||||||
assert(sz >= 0);
|
assert(sz >= 0);
|
||||||
(i+1)->arg[0] = INT(-sz);
|
(i+1)->arg[0] = INT(-sz);
|
||||||
|
} else if (off0 == off1) {
|
||||||
|
*i = (Ins){.op = Onop};
|
||||||
|
*(i+1) = (Ins){.op = Onop};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vfree(bl);
|
vfree(bl);
|
||||||
|
|
Loading…
Add table
Reference in a new issue