ref: 5cf89f06e6dc31901b495ad16adc1cd93f586ebf
parent: 3c8b80689e43668ae45177cd22d042407757ab02
author: Ori Bernstein <[email protected]>
date: Mon Jun 11 09:07:43 EDT 2012
More work towards getting dataflow going. This commit temporarily breaks things.
--- a/8/Makefile
+++ b/8/Makefile
@@ -4,9 +4,9 @@
reduce.o \
regalloc.o \
-CFLAGS+=-I../parse
-LDFLAGS+=-L../parse -lparse
-EXTRADEP=../parse/libparse.a
+CFLAGS+=-I../parse -I../opt
+LDFLAGS+=-L../parse -lparse -L../opt -lopt
+EXTRADEP=../parse/libparse.a ../opt/libopt.a
include ../mk/lexyacc.mk
include ../mk/c.mk
--- a/8/main.c
+++ b/8/main.c
@@ -11,6 +11,7 @@
#include "parse.h"
#include "asm.h"
+#include "opt.h"
Node *file;
static char *outfile;
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -11,6 +11,7 @@
#include "parse.h"
#include "asm.h"
+#include "opt.h"
#include "platform.h" /* HACK. We need some platform specific code gen behavior. *sigh.* */
@@ -607,6 +608,7 @@
int i;
Simp s = {0,};
Func fn;
+ Cfg *cfg;
if(debug)
printf("\n\nfunction %s\n", name);
@@ -622,6 +624,9 @@
if (debug)
for (i = 0; i < s.nstmts; i++)
dump(s.stmts[i], stdout);
+ cfg = mkcfg(s.stmts, s.nstmts);
+ if (debug)
+ dumpcfg(cfg, stdout);
fn.name = name;
fn.isglobl = 1; /* FIXME: we should actually use the visibility of the sym... */
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,5 @@
SUB = parse \
+ opt \
8
-include config.mk
--- a/opt/df.c
+++ b/opt/df.c
@@ -27,6 +27,12 @@
return bb;
}
+void label(Cfg *cfg, Node *lbl, Bb *bb)
+{
+ htput(cfg->lblmap, lbl->lbl.name, bb);
+ lappend(&bb->lbls, &bb->nlbls, lbl->lbl.name);
+}
+
int addnode(Cfg *cfg, Bb *bb, Node *n)
{
switch (exprop(n)) {
@@ -47,16 +53,19 @@
Cfg *mkcfg(Node **nl, int nn)
{
Cfg *cfg;
- Bb *bb;
+ Bb *bb, *targ;
+ Node *a, *b;
int i;
cfg = zalloc(sizeof(Cfg));
+ cfg->lblmap = mkht(strhash, streq);
+ bb = mkbb(cfg);
for (i = 0; i < nn; i++) {
switch (nl[i]->type) {
case Nlbl:
if (bb->nnl)
bb = mkbb(cfg);
- lappend(&bb->lbls, &bb->nlbls, nl[i]->lbl.name);
+ label(cfg, nl[i], bb);
break;
case Nexpr:
if (addnode(cfg, bb, nl[i]))
@@ -68,5 +77,69 @@
die("Invalid node type %s in mkcfg", nodestr(nl[i]->type));
}
}
+ for (i = 0; i < cfg->nfixjmp; i++) {
+ bb = cfg->fixblk[i];
+ switch (exprop(cfg->fixjmp[i])) {
+ case Ojmp:
+ a = cfg->fixjmp[i]->expr.args[0];
+ b = NULL;
+ break;
+ case Ocjmp:
+ a = cfg->fixjmp[i]->expr.args[0];
+ b = cfg->fixjmp[i]->expr.args[1];
+ break;
+ default:
+ die("Bad jump fix thingy");
+ break;
+ }
+ if (a) {
+ targ = htget(cfg->lblmap, a->lbl.name);
+ if (!targ)
+ die("No bb with label %s", a->lbl.name);
+ bsput(bb->out, targ->id);
+ bsput(targ->in, bb->id);
+ }
+ if (b) {
+ targ = htget(cfg->lblmap, b->lbl.name);
+ if (!targ)
+ die("No bb with label %s", b->lbl.name);
+ bsput(bb->out, targ->id);
+ bsput(targ->in, bb->id);
+ }
+ }
return cfg;
+}
+void dumpcfg(Cfg *cfg, FILE *fd)
+{
+ int i, j;
+ Bb *bb;
+ char *sep;
+
+ for (j = 0; j < cfg->nbb; j++) {
+ bb = cfg->bb[j];
+ fprintf(fd, "Bb: %d\n", bb->id);
+
+ /* in edges */
+ fprintf(fd, "In: ");
+ sep = "";
+ for (i = 0; i < bsmax(bb->in); i++) {
+ if (bshas(bb->in, i))
+ fprintf(fd, "%d%s", i, sep);
+ sep = ",";
+ }
+ fprintf(fd, "\n");
+
+ /* out edges */
+ fprintf(fd, "Out: ");
+ sep = "";
+ for (i = 0; i < bsmax(bb->out); i++) {
+ if (bshas(bb->in, i))
+ fprintf(fd, "%d%s", i, sep);
+ sep = ",";
+ }
+ fprintf(fd, "\n");
+
+ for (i = 0; i < bb->nnl; i++)
+ dump(bb->nl[i], fd);
+ }
}
--- a/opt/opt.h
+++ b/opt/opt.h
@@ -6,6 +6,7 @@
size_t nbb;
/* for building bb */
+ Htab *lblmap; /* label => Bb mapping */
Node **fixjmp;
size_t nfixjmp;
Bb **fixblk;
@@ -24,4 +25,5 @@
/* Takes a reduced block, and returns a flow graph. */
Cfg *mkcfg(Node **nl, int nn);
+void dumpcfg(Cfg *c, FILE *fd);
void flow(Cfg *cfg);
--- a/parse/bitset.c
+++ b/parse/bitset.c
@@ -56,6 +56,14 @@
return n;
}
+/* Returns the largest value that the bitset can possibly
+ * hold. It's conservative, but scanning the entire bitset
+ * is a bit slow. This is mostly an aid to iterate over it. */
+int bsmax(Bitset *bs)
+{
+ return bs->nchunks*sizeof(uint)*CHAR_BIT;
+}
+
void delbs(Bitset *bs)
{
free(bs->chunks);
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -233,6 +233,7 @@
void bsintersect(Bitset *a, Bitset *b);
void bsdiff(Bitset *a, Bitset *b);
int bscount(Bitset *bs);
+int bsmax(Bitset *bs);
int bsissubset(Bitset *set, Bitset *sub);
Htab *mkht(ulong (*hash)(void *key), int (*cmp)(void *k1, void *k2));