From 7419273b937dc4e3cff1b3cecc788782e7e2de34 Mon Sep 17 00:00:00 2001 From: Melvin Smith Date: Tue, 4 Jun 2002 06:39:50 +0000 Subject: [PATCH] More work on IR. git-svn-id: https://svn.parrot.org/parrot/trunk@1596 d31e2699-5ff4-0310-a27c-f18f2fbe73fe --- imcc/imc.c | 7 +++++++ languages/imcc/imc.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/imcc/imc.c b/imcc/imc.c index cde0763675..60b83fe64b 100644 --- a/imcc/imc.c +++ b/imcc/imc.c @@ -57,6 +57,7 @@ SymReg * mk_const(const char * name, char t) { r->reg = str_dup(name); r->first = -1; r->color = -1; + r->set = t; r->type = VTCONST; if(name[0]) store_symreg(r); @@ -248,6 +249,9 @@ void compute_du_chain(SymReg * r) { fprintf(stderr, "Internal error: symreg %s not referenced\n", r->name); abort(); } + /* Symbol was never used in a statement, ignore for register allocation */ + if(r->first < 0) return; + r->last = r->first; i = r->first; for(ins = instructions[i++]; ins; ins = instructions[i++]) { @@ -271,6 +275,9 @@ int interferes(SymReg * r0, SymReg * r1) { if(r0->first > r1->last) return 0; else if(r0->last < r1->first) return 0; + /* If symbol was never used in a statment, it can't interfere */ + if(r0->first < 0 || r1->first < 0) return 0; + return 1; } diff --git a/languages/imcc/imc.c b/languages/imcc/imc.c index cde0763675..60b83fe64b 100644 --- a/languages/imcc/imc.c +++ b/languages/imcc/imc.c @@ -57,6 +57,7 @@ SymReg * mk_const(const char * name, char t) { r->reg = str_dup(name); r->first = -1; r->color = -1; + r->set = t; r->type = VTCONST; if(name[0]) store_symreg(r); @@ -248,6 +249,9 @@ void compute_du_chain(SymReg * r) { fprintf(stderr, "Internal error: symreg %s not referenced\n", r->name); abort(); } + /* Symbol was never used in a statement, ignore for register allocation */ + if(r->first < 0) return; + r->last = r->first; i = r->first; for(ins = instructions[i++]; ins; ins = instructions[i++]) { @@ -271,6 +275,9 @@ int interferes(SymReg * r0, SymReg * r1) { if(r0->first > r1->last) return 0; else if(r0->last < r1->first) return 0; + /* If symbol was never used in a statment, it can't interfere */ + if(r0->first < 0 || r1->first < 0) return 0; + return 1; }