diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-11-19 21:38:23 -0500 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-11-19 21:38:35 -0500 |
commit | bbaf4fd61b28036c0b9b80ee32b17a0766df12f3 (patch) | |
tree | 29820ace8b7bfcb993303ab230f8f4f127f17984 | |
parent | a968dc687d8a4fa3303a750d3ef1eea9369b2fdd (diff) | |
download | roux-bbaf4fd61b28036c0b9b80ee32b17a0766df12f3.tar.gz |
start memopt(), still buggy
-rw-r--r-- | lisc/Makefile | 2 | ||||
-rw-r--r-- | lisc/lisc.h | 3 | ||||
-rw-r--r-- | lisc/main.c | 2 | ||||
-rw-r--r-- | lisc/mem.c | 71 | ||||
-rw-r--r-- | lisc/ssa.c | 1 |
5 files changed, 78 insertions, 1 deletions
diff --git a/lisc/Makefile b/lisc/Makefile index 6db1153..560fd4f 100644 --- a/lisc/Makefile +++ b/lisc/Makefile @@ -1,5 +1,5 @@ BIN = lisc -OBJ = main.o util.o parse.o ssa.o copy.o live.o isel.o spill.o rega.o emit.o +OBJ = main.o util.o parse.o mem.o ssa.o copy.o live.o isel.o spill.o rega.o emit.o CFLAGS = -Wall -Wextra -std=c99 -g -pedantic diff --git a/lisc/lisc.h b/lisc/lisc.h index fcce670..6393755 100644 --- a/lisc/lisc.h +++ b/lisc/lisc.h @@ -373,6 +373,9 @@ void parse(FILE *, void (Dat *), void (Fn *)); void printfn(Fn *, FILE *); void printref(Ref, Fn *, FILE *); +/* mem.c */ +void memopt(Fn *); + /* ssa.c */ void filluse(Fn *); void fillpreds(Fn *); diff --git a/lisc/main.c b/lisc/main.c index 90f8b37..a393a69 100644 --- a/lisc/main.c +++ b/lisc/main.c @@ -6,6 +6,7 @@ char debug['Z'+1] = { ['A'] = 0, /* abi lowering */ ['I'] = 0, /* instruction selection */ ['L'] = 0, /* liveness */ + ['M'] = 0, /* memory optimization */ ['N'] = 0, /* ssa construction */ ['C'] = 0, /* copy elimination */ ['S'] = 0, /* spilling */ @@ -52,6 +53,7 @@ func(Fn *fn) fillrpo(fn); fillpreds(fn); filluse(fn); + memopt(fn); ssa(fn); filluse(fn); copy(fn); diff --git a/lisc/mem.c b/lisc/mem.c new file mode 100644 index 0000000..bfc8218 --- /dev/null +++ b/lisc/mem.c @@ -0,0 +1,71 @@ +#include "lisc.h" + +/* Memory optimization: + * + * - replace alloced slots used only in + * load/store operations + */ + +/* require use, maintains use counts */ +void +memopt(Fn *fn) +{ + Blk *b; + Ins *i, *l; + Tmp *t; + Use *u, *ue; + int a; + + b = fn->start; + for (i=b->ins; i-b->ins < b->nins; i++) { + if (OAlloc > i->op || i->op > OAlloc1) + continue; + assert(NAlign == 3); + assert(rtype(i->to) == RTmp); + t = &fn->tmp[i->to.val]; + for (u=t->use; u != &t->use[t->nuse]; u++) { + if (u->type != UIns) + goto NextIns; + l = u->u.ins; + if (l->op < OStorel || l->op > OStoreb) + if (l->op < OLoad || l->op > OLoad1) + goto NextIns; + } + /* get rid of the alloc and replace uses */ + *i = (Ins){.op = ONop}; + t->ndef--; + ue = &t->use[t->nuse]; + for (u=t->use; u != ue; u++) { + l = u->u.ins; + if (OStorel <= l->op && l->op <= OStoreb) { + l->wide = (l->op == OStorel); + l->op = OCopy; + l->to = l->arg[1]; + l->arg[1] = R; + t->nuse--; + t->ndef++; + } else + switch(l->op) { + case OLoad+Tl: + l->wide = 1; + l->op = OCopy; + break; + case OLoad+Tsw: + case OLoad+Tuw: + l->wide = 0; + l->op = OCopy; + break; + default: + /* keep l->wide */ + a = l->op - OLoad; + l->op = OExt + a; + break; + } + } + NextIns:; + } + if (debug['M']) { + fprintf(stderr, "\n> After memory optimization:\n"); + printfn(fn, stderr); + } +} diff --git a/lisc/ssa.c b/lisc/ssa.c index ac90b6e..9d6ef4a 100644 --- a/lisc/ssa.c +++ b/lisc/ssa.c @@ -467,6 +467,7 @@ renblk(Blk *b, Name **stk, Fn *fn) renblk(s, stk, fn); } +/* require ndef */ void ssa(Fn *fn) { |