Browse Source

fix bug in jumps simplification

In presence of jump loops, the algorithm would
create cycles in the disjoint-set data structure.
This caused infinite recursion and stack overflows.
Quentin Carbonneaux 8 years ago
parent
commit
ae80e4f7ca
1 changed files with 5 additions and 2 deletions
  1. 5 2
      cfg.c

+ 5 - 2
cfg.c

@@ -304,8 +304,11 @@ simpljmp(Fn *fn)
 	for (b=fn->start; b; b=b->link) {
 	for (b=fn->start; b; b=b->link) {
 		assert(!b->phi);
 		assert(!b->phi);
 		if (b->nins == 0)
 		if (b->nins == 0)
-		if (b->jmp.type == Jjmp)
-			uf[b->id] = b->s1;
+		if (b->jmp.type == Jjmp) {
+			uffind(&b->s1, uf);
+			if (b->s1 != b)
+				uf[b->id] = b->s1;
+		}
 	}
 	}
 	for (b=fn->start; b; b=b->link) {
 	for (b=fn->start; b; b=b->link) {
 		if (b->s1)
 		if (b->s1)