commit 9be8dcd2584b09ed00978daadb5ec6b597349b0d parent 394f3485b1f97dc88cdc8d130f9a693d624c5d58 Author: Roberto E. Vargas Caballero <Roberto E. Vargas Caballero> Date: Tue, 26 Apr 2016 19:59:28 +0200 [cc2] Add general tree optimizations for jumps and labels These commit adds: - Remove consecutive labels - Jump to jump - Jump to next instruction Diffstat:
M | cc2/optm.c | | | 32 | +++++++++++++++++++++++++++++--- |
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/cc2/optm.c b/cc2/optm.c @@ -1,18 +1,44 @@ +#include <stddef.h> + #include "arch.h" #include "cc2.h" Node * optm(Node *np) { - Node *dst; + Node *p, *dst, *next = np->next; + Symbol *sym, *osym; switch (np->op) { + case ONOP: + if (next && next->op == ONOP) { + sym = np->u.sym; + osym = next->u.sym; + osym->id = sym->id; + osym->numid = sym->id; + osym->u.stmt = sym->u.stmt; + return NULL; + } + break; case OJMP: case OBRANCH: - dst = np->u.sym->u.stmt; - if (dst->op == OJMP) + for (;;) { + dst = np->u.sym->u.stmt; + if (dst->op != OJMP) + break; np->u.sym = dst->u.sym; + } + for (p = np->next; p; p = p->next) { + if (p == dst) + return NULL; + if (p->op == ONOP || + p->op == OBLOOP || + p->op == OELOOP) { + continue; + } + break; + } break; } return np;