#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 };