ref: 6db22a4b62e552e9ede23734cee42c89e80a6524
parent: 8e8131e3e7dbc21f60631a80ad3e638df80661ae
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 12:38:19 EDT 2012
Start hashing by decl node, instead of decl id
--- a/8/isel.c
+++ b/8/isel.c
@@ -57,11 +57,11 @@
switch (exprop(n)) {
case Ovar:
- if (hthas(s->locs, (void*)n->expr.did)) {
- stkoff = (size_t)htget(s->locs, (void*)n->expr.did);
+ if (hthas(s->locs, n)) {
+ stkoff = (size_t)htget(s->locs, n);
l = locmem(-stkoff, locphysreg(Rebp), NULL, ModeL);
- } else if (hthas(s->globls, (void*)n->expr.did)) {
- l = locstrlbl(htget(s->globls, (void*)n->expr.did));
+ } else if (hthas(s->globls, n)) {
+ l = locstrlbl(htget(s->globls, n));
} else {
die("%s (id=%ld) not found", namestr(n->expr.args[0]), n->expr.did);
}
@@ -751,3 +751,4 @@
writeasm(fn, &is, fd);
}
+
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -52,6 +52,30 @@
static Node *one;
static Node *ptrsz;
+static size_t did(Node *n)
+{
+ if (n->type == Ndecl) {
+ return n->decl.did;
+ } else if (n->type == Nexpr) {
+ assert(exprop(n) == Ovar);
+ return n->expr.did;
+ }
+ dump(n, stderr);
+ die("Can't get did");
+ return 0;
+}
+
+static ulong dclhash(void *dcl)
+{
+ /* large-prime hash. meh. */
+ return did(dcl) * 366787;
+}
+
+static int dcleq(void *a, void *b)
+{
+ return did(a) == did(b);
+}
+
static void append(Simp *s, Node *n)
{
lappend(&s->stmts, &s->nstmts, n);
@@ -539,7 +563,7 @@
s->stksz += size(n);
if (debug)
printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.did, s->stksz);
- htput(s->locs, (void*)n->decl.did, (void*)s->stksz);
+ htput(s->locs, n, (void*)s->stksz);
}
static void declarearg(Simp *s, Node *n)
@@ -547,7 +571,7 @@
assert(n->type == Ndecl);
if (debug)
printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.did, -(s->argsz + 8));
- htput(s->locs, (void*)n->decl.did, (void*)-(s->argsz + 8));
+ htput(s->locs, n, (void*)-(s->argsz + 8));
s->argsz += size(n);
}
@@ -634,7 +658,7 @@
printf("\n\nfunction %s\n", name);
/* set up the simp context */
- s.locs = mkht(ptrhash, ptreq);
+ s.locs = mkht(dclhash, dcleq);
/* unwrap to the function body */
n = n->expr.args[0];
@@ -695,7 +719,7 @@
k = htkeys(st->dcl, &nk);
for (i = 0; i < nk; i++) {
s = htget(st->dcl, k[i]);
- htput(globls, (void*)s->decl.did, asmname(s->decl.name));
+ htput(globls, s, asmname(s->decl.name));
}
free(k);
@@ -721,7 +745,7 @@
n = file->file.stmts;
nn = file->file.nstmts;
- globls = mkht(ptrhash, ptreq);
+ globls = mkht(dclhash, dcleq);
/* We need to define all global variables before use */
fillglobls(file->file.globls, globls);
--- a/test/test.sh
+++ b/test/test.sh
@@ -7,7 +7,7 @@
function use {
rm -f $1
echo $MU $1.myr -o $1.use && \
- $MU $1.myr -o $1.use && \
+ $MU $1.myr -o $1.use
}
function build {