소스 검색

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!
Richard McCormack 1 년 전
부모
커밋
c8fc20b8ef
1개의 변경된 파일9개의 추가작업 그리고 4개의 파일을 삭제
  1. 9 4
      mem.c

+ 9 - 4
mem.c

@@ -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);