nooc

nooc programming language compiler
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit 1567ded93642a377e855dc6f18dd4a7c021a13be
parent e6f1971177ee88eebb80412c982eb0867c52c477
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Wed, 12 Jan 2022 14:57:56 -0600

ir: remove active member from `struct interval`

It is only used to allocate registers, so it can be local.

Diffstat:
Mir.c | 41++++++++++++++++++++++++++---------------
Mir.h | 1-
2 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/ir.c b/ir.c @@ -4,6 +4,7 @@ #include <stdint.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <strings.h> #include "array.h" @@ -20,7 +21,7 @@ extern struct toplevel toplevel; #define PUTINS(op, val) ins = (struct instr){(op), (val)} ; bumpinterval(out, &ins, val) ; array_add(out, ins) ; #define STARTINS(op, val) PUTINS((op), (val)) ; curi++ ; -#define NEWTMP tmpi++; interval.active = 0; interval.start = curi + 1; interval.end = curi + 1; array_add((&out->intervals), interval); +#define NEWTMP tmpi++; interval.start = curi + 1; interval.end = curi + 1; array_add((&out->intervals), interval); extern struct target targ; @@ -319,6 +320,29 @@ genblock(struct iproc *out, struct block *block) } } +static void +chooseregs(struct iproc *proc) +{ + bool active[proc->intervals.len]; + memset(active, 0, proc->intervals.len * sizeof(*active)); + + // FIXME: this is obviously not close to optimal + for (uint64_t i = 0; i <= curi; i++) { + for (size_t j = 0; j < proc->intervals.len; j++) { + if (active[j] && proc->intervals.data[j].end == i - 1) { + active[j] = false; + regfree(proc->intervals.data[j].reg); + } + + if (!active[j] && proc->intervals.data[j].start == i) { + active[j] = true; + proc->intervals.data[j].reg = regalloc(); + } + } + } + +} + size_t genproc(struct decl *decl, struct proc *proc) { @@ -361,20 +385,7 @@ genproc(struct decl *decl, struct proc *proc) genblock(out, &proc->block); - // FIXME: this is obviously not close to optimal - for (uint64_t i = 0; i <= curi; i++) { - for (size_t j = 0; j < out->intervals.len; j++) { - if (out->intervals.data[j].active && out->intervals.data[j].end == i - 1) { - out->intervals.data[j].active = false; - regfree(out->intervals.data[j].reg); - } - - if (!out->intervals.data[j].active && out->intervals.data[j].start == i) { - out->intervals.data[j].active = true; - out->intervals.data[j].reg = regalloc(); - } - } - } + chooseregs(&iproc); size_t len = targ.emitproc(NULL, out); void *buf = xcalloc(1, len); // FIXME: unnecessary diff --git a/ir.h b/ir.h @@ -32,7 +32,6 @@ struct instr { struct interval { uint64_t start; uint64_t end; - bool active; uint8_t reg; };