commit 9be8dcd2584b09ed00978daadb5ec6b597349b0d
Author:     Roberto E. Vargas Caballero <Roberto E. Vargas Caballero>
AuthorDate: Tue Apr 26 19:59:28 2016 +0200
Commit:     Roberto E. Vargas Caballero <Roberto E. Vargas Caballero>
CommitDate: Tue Apr 26 20:02:09 2016 +0200

    [cc2] Add general tree optimizations for jumps and labels
    
    These commit adds:
        - Remove consecutive labels
        - Jump to jump
        - Jump to next instruction

diff --git a/cc2/optm.c b/cc2/optm.c
index 12cecb1..1690bb2 100644
--- 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;

Reply via email to