From 69009071293d63bc39d93ce2d96ba51df2fcaa70 Mon Sep 17 00:00:00 2001 From: Bill Currie <bill@taniwha.org> Date: Thu, 3 May 2012 19:32:44 +0900 Subject: [PATCH] Remove dead labels when jump threading. This lets the dead block removal do a better job. --- tools/qfcc/source/statements.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index 323925605..f2f0ccc4b 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -1026,6 +1026,7 @@ remove_label_from_dest (ex_label_t *label) if (!label) return; + debug (0, "dropping deceased label %s", label->name); sblock = label->dest; for (l = &sblock->labels; *l; l = &(*l)->next) { if (*l == label) { @@ -1040,29 +1041,30 @@ static void thread_jumps (sblock_t *blocks) { sblock_t *sblock; - ex_label_t *label, *l; - statement_t *s; if (!blocks) return; for (sblock = blocks; sblock->next; sblock = sblock->next) { + statement_t *s; + ex_label_t **label, *l; + s = (statement_t *) sblock->tail; if (!strcmp (s->opcode, "<GOTO>")) - label = s->opa->o.label; + label = &s->opa->o.label; else if (!strncmp (s->opcode, "<IF", 3)) - label = s->opb->o.label; + label = &s->opb->o.label; else continue; - for (l = label; + for (l = *label; (l->dest->statements && !strcmp (l->dest->statements->opcode, "<GOTO>")); l = l->dest->statements->opa->o.label) { } - if (l != label) { - if (!strcmp (s->opcode, "<GOTO>")) - s->opa->o.label = l; - else if (!strncmp (s->opcode, "<IF", 3)) - s->opb->o.label = l; + if (l != *label) { + if (!--(*label)->used) + remove_label_from_dest (*label); + l->used++; + *label = l; } } }