ref: 1cb86ecfd69335631474bea4bb8a102e4559408a
parent: 3b2a10f280a9c927bd678199a90a96f8cddab89c
author: Ori Bernstein <[email protected]>
date: Thu May 7 21:47:40 EDT 2015
A few more fixes for dataflow checks.
--- a/mi/dfcheck.c
+++ b/mi/dfcheck.c
@@ -25,25 +25,27 @@
for (j = 0; j < r->ndefs[did]; j++) {
if (bshas(kill, r->defs[did][j]))
continue;
- if (bshas(reach, r->defs[did][j]))
- def = nodes[r->defs[did][j]];
+ if (!bshas(reach, r->defs[did][j]))
+ continue;
+ def = nodes[r->defs[did][j]];
if (exprop(def) == Oundef)
fatal(n, "%s used before definition", namestr(n->expr.args[0]));
}
} else {
- for (i = 0; i < n->expr.nargs; i++)
- checkundef(n->expr.args[i], r, reach, kill);
+ switch (exprop(n)) {
+ case Oset:
+ case Oasn:
+ case Oblit:
+ checkundef(n->expr.args[1], r, reach, kill);
+ break;
+ default:
+ for (i = 0; i < n->expr.nargs; i++)
+ checkundef(n->expr.args[i], r, reach, kill);
+ break;
+ }
}
}
-void bsdump(Bitset *bs)
-{
- size_t i;
- for (i = 0; bsiter(bs, &i); i++)
- printf("%zd ", i);
- printf("\n");
-}
-
static void checkreach(Cfg *cfg)
{
Bitset *reach, *kill;
@@ -108,6 +110,6 @@
void check(Cfg *cfg)
{
checkret(cfg);
- if(0)
+ if (0)
checkreach(cfg);
}
--- a/mi/reaching.c
+++ b/mi/reaching.c
@@ -15,6 +15,8 @@
Node *assignee(Node *n)
{
+ Node *a;
+
switch (exprop(n)) {
case Oundef:
case Oset:
@@ -26,6 +28,14 @@
case Obsreq:
return n->expr.args[0];
break;
+ case Oblit:
+ a = n->expr.args[0];
+ if (exprop(a) != Oaddr)
+ break;
+ a = n->expr.args[0];
+ if (exprop(a) != Ovar)
+ break;
+ return a;
default:
break;
}
@@ -64,12 +74,22 @@
if (!n)
continue;
did = n->expr.did;
- bsput(gen, bb->nl[i]->nid);
- for (j = 0; j < ndefs[did]; j++)
+ for (j = 0; j < ndefs[did]; j++) {
bsput(kill, defs[did][j]);
+ bsdel(gen, defs[did][j]);
+ }
+ bsput(gen, bb->nl[i]->nid);
+ bsdel(kill, bb->nl[i]->nid);
}
}
+void bsdump(Bitset *bs)
+{
+ size_t i;
+ for (i = 0; bsiter(bs, &i); i++)
+ printf("%zd ", i);
+ printf("\n");
+}
Reaching *reaching(Cfg *cfg)
{
@@ -104,12 +124,12 @@
for (i = 0; i < cfg->nbb; i++) {
if (!cfg->bb[i])
continue;
- bbout = mkbs();
+ bbin = mkbs();
for (j = 0; bsiter(cfg->bb[i]->pred, &j); j++)
- bsunion(bbout, in[j]);
- bbin = bsdup(bbout);
- bsdiff(bbin, kill[i]);
- bsunion(bbin, gen[i]);
+ bsunion(bbin, out[j]);
+ bbout = bsdup(bbin);
+ bsdiff(bbout, kill[i]);
+ bsunion(bbout, gen[i]);
if (!bseq(out[i], bbout) || !bseq(in[i], bbin)) {
changed = 1;
@@ -121,6 +141,22 @@
}
} while (changed);
+// for (i = 0; i < ndecls; i++) {
+// if (defs[i])
+// printf("\t%zd: ", i);
+// for (j = 0; j < ndefs[i]; j++)
+// printf("%zd ", defs[i][j]);
+// if (defs[i])
+// printf("\n");
+// }
+// for (i = 0; i < cfg->nbb; i++) {
+// printf("bb %zd\n", i);
+// printf("\tin: ");
+// bsdump(in[i]);
+// printf("\tout: ");
+// bsdump(out[i]);
+// }
+//
reaching = xalloc(sizeof(Reaching));
reaching->in = in;
reaching->out = out;
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -204,7 +204,7 @@
case Lbool: fprintf(fd, " Lbool %s\n", n->lit.boolval ? "true" : "false"); break;
case Lint: fprintf(fd, " Lint %llu\n", n->lit.intval); break;
case Lflt: fprintf(fd, " Lflt %lf\n", n->lit.fltval); break;
- case Lstr: fprintf(fd, " Lstr %s\n", n->lit.strval.buf); break;
+ case Lstr: fprintf(fd, " Lstr %.*s\n", (int)n->lit.strval.len, n->lit.strval.buf); break;
case Llbl: fprintf(fd, " Llbl %s\n", n->lit.lblval); break;
case Lfunc:
fprintf(fd, " Lfunc\n");