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:
M | ir.c | | | 41 | ++++++++++++++++++++++++++--------------- |
M | ir.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;
};