scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

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:
Mcc2/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;