diff options
| author | WormHeamer | 2025-10-27 23:26:44 -0400 |
|---|---|---|
| committer | WormHeamer | 2025-10-27 23:26:44 -0400 |
| commit | dd62801133cddca25d94c9c59f8ca7d0748850c6 (patch) | |
| tree | db5210bd773d0c57f1cfe53b303d1a6debdde0b7 | |
| parent | a2c5243af5bd8482385aeb3395e073ff17f57a0d (diff) | |
small size optimization on <= 1-node NodeList
| -rw-r--r-- | ir.c | 55 | ||||
| -rw-r--r-- | ir.h | 21 | ||||
| -rw-r--r-- | main.c | 2 | ||||
| -rw-r--r-- | test.lang | 2 |
4 files changed, 61 insertions, 19 deletions
@@ -6,17 +6,41 @@ /* node lists */ -void nodelist_push(NodeList *l, Node *p, Arena *a) { - ZDA_PUSH(a, l, p); +void nodelist_fit(NodeList *l, uint32_t sz, Arena *a) { + if (l->cap) { + if (sz > l->cap) { + uint32_t c = l->cap; + while (sz > c) c <<= 1; + l->data = resize(a, l->data, l->cap, c); + l->cap = c; + } + } else { + if (sz > 1) { + uint32_t cap = 2; + while (cap < sz) cap <<= 1; + Node **data = new_arr(a, Node *, cap); + data[0] = l->sbo; + l->data = data; + l->cap = cap; + } + } } -void nodelist_remove(NodeList *l, Node *p) { - for (int i = l->len - 1; i >= 0; i--) { - if (l->data[i] == p) { - if (p) p->refs--; +void nodelist_push(NodeList *l, Node *n, Arena *a) { + nodelist_fit(l, l->len + 1, a); + Node **p = nodelist_nth(l, l->len++); + if (n) n->refs++; + *p = n; +} + +void nodelist_remove(NodeList *l, Node *n) { + Node **data = nodelist_data(l); + for (unsigned i = 0; i < l->len; i++) { + if (data[i] == n) { + if (n) n->refs--; l->len--; if (i < l->len) { - memmove(&l->data[i], &l->data[i + 1], sizeof(Node*) * (l->len - i)); + memmove(&data[i], &data[i+1], (l->len - i) * sizeof(Node *)); } break; } @@ -24,12 +48,15 @@ void nodelist_remove(NodeList *l, Node *p) { } void nodelist_remove_unordered(NodeList *l, Node *p) { - for (int i = l->len - 1; i >= 0; i--) { - if (l->data[i] == p) { + Node **data = nodelist_data(l); + unsigned i = l->len; + while (i) { + i--; + if (data[i] == p) { if (p) p->refs--; l->len--; if (i < l->len) { - l->data[i] = l->data[l->len]; + data[i] = data[l->len]; } break; } @@ -74,13 +101,13 @@ void node_kill(Node *n, Graph *p) { } void node_add_out(Graph *p, Node *a, Node *b) { + assert(b > 0xfffff || !b); nodelist_push(&a->out, b, p->pool->arena); - if (b) b->refs++; } void node_add_in(Graph *p, Node *a, Node *b) { + assert(b > 0xfffff || !b); nodelist_push(&a->in, b, p->pool->arena); - if (b) b->refs++; } void node_set_in(Graph *p, Node *n, int idx, Node *to) { @@ -93,10 +120,10 @@ void node_set_in(Graph *p, Node *n, int idx, Node *to) { } void node_add(Graph *p, Node *src, Node *dest) { - if (src) assert(src->op != N_DEAD); - if (dest) assert(dest->op != N_DEAD); + assert(dest->op != N_DEAD); node_add_in(p, dest, src); if (!src) return; + assert(src->op != N_DEAD); node_add_out(p, src, dest); if (dest->src_pos.n == 0) dest->src_pos = src->src_pos; else if (src->src_pos.n != 0) { @@ -100,7 +100,13 @@ typedef enum { const char *node_type_name(NodeType t); -typedef DYNARR(struct Node *) NodeList; +typedef struct { + unsigned len, cap; + union { + struct Node *sbo; + struct Node **data; + }; +} NodeList; typedef struct Node { int id, refs; @@ -122,8 +128,9 @@ typedef struct Node { /* convenience macros (lisp-inspired lol) */ -#define IN(n, i) ((n)->in.data[i]) -#define OUT(n, i) ((n)->out.data[i]) +#define Ni(nl, i) (*nodelist_nth(&(nl), i)) +#define IN(n, i) Ni(n->in, i) +#define OUT(n, i) Ni(n->out, i) #define CTRL(n) IN(n, 0) #define CAR(n) IN(n, 1) @@ -187,4 +194,12 @@ int node_maybe_uninit(Node *n); #define node_new(...) node_newv(__VA_ARGS__, NULL) +static inline Node **nodelist_data(NodeList *l) { + return l->cap ? l->data : &l->sbo; +} + +static inline Node **nodelist_nth(NodeList *l, uint32_t i) { + return nodelist_data(l) + i; +} + #endif @@ -679,6 +679,6 @@ int main(int argc, const char **argv) { parse_unit(&l, &u); unit_print(&u); lex_free(&l); - fprintf(stderr, "%zu\n", sizeof(Node)); + fprintf(stderr, "node size = %zu\n", sizeof(Node)); return 0; } @@ -4,5 +4,5 @@ func main(a, b i64) i64 { a := b b := t } - return a + b + 3 + return (a + b + 3) xor b } |
