소스 검색

fix allocation ordering bug in rega

When we process one block, we
start by allocating registers
for all the temporaries live
at the exit of the block.

Before this patch we processed
temps first, then in doblk() we
would mark globally live registers
allocated. This meant that temps
could get wrongly assigned a live
register.

The fix is simple: we now process
registers first at block exits,
then allocate temps.
Quentin Carbonneaux 3 년 전
부모
커밋
87dc3ea290
1개의 변경된 파일2개의 추가작업 그리고 2개의 파일을 삭제
  1. 2 2
      rega.c

+ 2 - 2
rega.c

@@ -359,8 +359,6 @@ doblk(Blk *b, RMap *cur)
 	Mem *m;
 	Ref *ra[4];
 
-	for (r=0; bsiter(b->out, &r) && r<Tmp0; r++)
-		radd(cur, r, r);
 	if (rtype(b->jmp.arg) == RTmp)
 		b->jmp.arg = ralloc(cur, b->jmp.arg.val);
 	curi = &insb[NIns];
@@ -534,6 +532,8 @@ rega(Fn *fn)
 				rl[j] = t;
 			}
 		}
+		for (r=0; bsiter(b->out, &r) && r<Tmp0; r++)
+			radd(&cur, r, r);
 		for (j=0; j<x; j++)
 			ralloctry(&cur, rl[j], 1);
 		for (j=0; j<x; j++)