#include "blocks.h"
#include "flow.h"
#include "optimise.h"

#define ADDRLP4 (ADDRL + P + sizeop(4));
extern int do_verify;

static void doNode(Node node);
static void cleanBlock(Block b);

extern void mkauto(Symbol p);

static char* clean(void) {
    flow_applyToBlocks(cleanBlock);
    do_verify = 0;
    return NULL;
}

static void cleanBlock(Block block) {
    Node p, last;
    last = block_lastNode(block)->x.next;
    for (p = block_firstNode(block); p != last; p = p->x.next) {
        doNode(p);
    }
}

static void doNode(Node node) {
    if (generic(node->op) == VREG) {
        Symbol sym = node->syms[0];
        node->op = ADDRLP4;
        if (sym->sclass == REGISTER) {
            sym->sclass = AUTO;
            mkauto(sym);
            LOG(("vreg %s => local %d\n", sym->name, sym->x.offset));
        } 
    } else if (node->kids[0]) {
        doNode(node->kids[0]);
        if (node->kids[1]) {
            doNode(node->kids[1]);
        }
    }
}

optimiser cleanup = {
    "cleanup",
    "Assigns temps to locals. This phase is compulsory. No attempt to merge local variables is made.",
    15,
    &clean
};