1
0
mirror of git://projects.qi-hardware.com/wernermisc.git synced 2024-11-15 11:36:15 +02:00

m1/perf/sched.c: if register allocation fails, return an error instead of aborting

This commit is contained in:
Werner Almesberger 2011-09-24 20:33:09 -03:00
parent bb8c1ce741
commit 3da0074896

View File

@ -244,7 +244,7 @@ static int alloc_reg(struct insn *setter)
} else { } else {
reg = list_pop(&sc->unallocated); reg = list_pop(&sc->unallocated);
if (!reg) if (!reg)
abort(); return -1;
#ifdef REG_STATS #ifdef REG_STATS
sc->curr_regs++; sc->curr_regs++;
@ -495,10 +495,11 @@ static void unblock_after(struct insn *insn, int cycle)
} }
static void issue(struct insn *insn, unsigned *code) static int issue(struct insn *insn, unsigned *code)
{ {
struct data_ref *ref; struct data_ref *ref;
int end; int end, reg;
end = sc->cycle+insn->latency; end = sc->cycle+insn->latency;
Dprintf("cycle %d: insn %lu L %d (A %d B %d)\n", sc->cycle, Dprintf("cycle %d: insn %lu L %d (A %d B %d)\n", sc->cycle,
@ -523,7 +524,10 @@ static void issue(struct insn *insn, unsigned *code)
abort(); abort();
} }
CODE(end).dest = alloc_reg(insn); reg = alloc_reg(insn);
if (reg < 0)
return -1;
CODE(end).dest = reg;
CODE(sc->cycle).opcode = fpvm_to_pfpu(insn->vm_insn->opcode); CODE(sc->cycle).opcode = fpvm_to_pfpu(insn->vm_insn->opcode);
foreach (ref, &insn->dependants) foreach (ref, &insn->dependants)
@ -580,7 +584,8 @@ static int schedule(unsigned int *code)
} }
} }
if (best) { if (best) {
issue(best, code); if (issue(best, code) < 0)
return -1;
list_del(&best->more); list_del(&best->more);
remaining--; remaining--;
} }