summary refs log tree commit diff
path: root/rega.c
diff options
context:
space:
mode:
Diffstat (limited to 'rega.c')
-rw-r--r--rega.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/rega.c b/rega.c
index f087f3c..9ceba70 100644
--- a/rega.c
+++ b/rega.c
@@ -571,7 +571,8 @@ rega(Fn *fn)
 				if (rtype(src) != RTmp)
 					continue;
 				x = rfind(&end[b->id], src.val);
-				assert(x != -1);
+				if (x == -1) /* spilled */
+					continue;
 				rl[r] = (!rl[r] || rl[r] == x) ? x : -1;
 			}
 			if (rl[r] == 0)
@@ -586,7 +587,8 @@ rega(Fn *fn)
 				continue;
 			for (bp=s->pred; bp<&s->pred[s->npred]; bp++) {
 				x = rfind(&end[(*bp)->id], t);
-				assert(x != -1);
+				if (x == -1) /* spilled */
+					continue;
 				rl[r] = (!rl[r] || rl[r] == x) ? x : -1;
 			}
 		}
@@ -597,7 +599,7 @@ rega(Fn *fn)
 			r = m->r[j];
 			x = rl[r];
 			assert(x != 0 || t < Tmp0 /* todo, ditto */);
-			if (x > 0) {
+			if (x > 0 && !bshas(m->b, x)) {
 				pmadd(TMP(x), TMP(r), tmp[t].cls);
 				m->r[j] = x;
 			}