shithub: mc

Download patch

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");