summary refs log tree commit diff
path: root/lisc
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-11-20 15:49:10 -0500
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-11-20 15:49:10 -0500
commitc5259db2c45e60db6b7468f9d24dd66882da6fd5 (patch)
tree57d4a187741bca498fcaf4a6232458165070dc95 /lisc
parent3ad28f1560132688e5a1e951c2152708b2992ee3 (diff)
downloadroux-c5259db2c45e60db6b7468f9d24dd66882da6fd5.tar.gz
avoid having conflicting hints in rega
Diffstat (limited to 'lisc')
-rw-r--r--lisc/rega.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/lisc/rega.c b/lisc/rega.c
index 1117101..a45a6e3 100644
--- a/lisc/rega.c
+++ b/lisc/rega.c
@@ -28,6 +28,17 @@ hint(int t)
 	return &tmp[phicls(t, tmp)].hint.r;
 }
 
+static void
+sethint(int t, int r)
+{
+	ulong m;
+
+	m = tmp[phicls(t, tmp)].hint.m;
+	if (*hint(t) == -1)
+	if (!(BIT(r) & m))
+		*hint(t) = r;
+}
+
 static int
 rfind(RMap *m, int t)
 {
@@ -96,8 +107,7 @@ ralloc(RMap *m, int t)
 					diag("rega: no more regs");
 	}
 	radd(m, t, r);
-	if (*hint(t) == -1)
-		*hint(t) = r;
+	sethint(t, r);
 	return TMP(r);
 }
 
@@ -340,8 +350,7 @@ doblk(Blk *b, RMap *cur)
 			}
 			if (isreg(i->to))
 			if (rtype(i->arg[0]) == RTmp)
-			if (*hint(i->arg[0].val) == -1)
-				*hint(i->arg[0].val) = i->to.val;
+				sethint(i->arg[0].val, i->to.val);
 			/* fall through */
 		default:
 			if (!req(i->to, R)) {
@@ -402,7 +411,7 @@ rega(Fn *fn)
 			break;
 		else {
 			assert(rtype(i->to) == RTmp);
-			*hint(i->to.val) = i->arg[0].val;
+			sethint(i->to.val, i->arg[0].val);
 		}
 
 	/* 2. assign registers following post-order */