From bdafdad0d538f40f70c98cbe3dfbe27124f92189 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 24 Nov 2012 12:53:51 +0900 Subject: [PATCH] Treat flow control statements separately. I'm not convinced this is the correct fix for while (count--), but it does work. --- tools/qfcc/source/dags.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/qfcc/source/dags.c b/tools/qfcc/source/dags.c index 21432133f..6dc8472ff 100644 --- a/tools/qfcc/source/dags.c +++ b/tools/qfcc/source/dags.c @@ -313,6 +313,13 @@ dagnode_set_edges (dagnode_t *n) { int i; + for (i = 0; i < 3; i++) { + dagnode_t *child = n->children[i]; + if (child && n != child) + set_add (n->edges, child->number); + } + if (n->type == st_flow) + return; for (i = 0; i < 3; i++) { dagnode_t *child = n->children[i]; if (child) { @@ -416,6 +423,17 @@ dag_sort_nodes (dag_t *dag) set_delete (visited); } +static void +dag_make_var_live (set_t *live_vars, operand_t *op) +{ + flowvar_t *var = 0; + + if (op) + var = flow_get_var (op); + if (var) + set_add (live_vars, var->number); +} + static void dag_set_live_vars (set_t *live_vars, dag_t *dag, dagnode_t *n) { @@ -480,6 +498,8 @@ dag_create (flownode_t *flownode) flush_daglabels (); + // count the number of statements so the number of nodes and labels can be + // guessed for (s = block->statements; s; s = s->next) num_statements++; @@ -497,8 +517,13 @@ dag_create (flownode_t *flownode) operand_t *operands[4]; dagnode_t *n = 0, *children[3] = {0, 0, 0}; daglabel_t *op, *lx; + int i; dag_make_children (dag, s, operands, children); + if (s->type == st_flow) + for (i = 0; i < 3; i++) + if (children[i]) + dag_make_var_live (live_vars, operands[i]); op = opcode_label (dag, s->opcode, s->expr); n = children[0]; if (s->type != st_assign