From ef0f30935f16912ee37faa20c3ca751e503c064d Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Tue, 20 Nov 2012 14:30:42 +0900 Subject: [PATCH] Kill all dag nodes on pointer assignment. It's brutal, but it works and is conservatively correct. --- tools/qfcc/include/dags.h | 1 + tools/qfcc/source/dags.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/tools/qfcc/include/dags.h b/tools/qfcc/include/dags.h index 55acee6df..7cefa98ec 100644 --- a/tools/qfcc/include/dags.h +++ b/tools/qfcc/include/dags.h @@ -58,6 +58,7 @@ typedef struct dagnode_s { int topo; ///< topological sort order struct set_s *parents; ///< empty if root node int cost; ///< cost of this node in temp vars + unsigned killed:1; ///< node is unavailable for cse st_type_t type; ///< type of node (st_node = leaf) daglabel_t *label; ///< ident/const if leaf node, or operator etype_t tl; diff --git a/tools/qfcc/source/dags.c b/tools/qfcc/source/dags.c index 296fffb75..89fd0d98f 100644 --- a/tools/qfcc/source/dags.c +++ b/tools/qfcc/source/dags.c @@ -229,6 +229,8 @@ node (operand_t *op) if (op->o.label->daglabel) node = op->o.label->daglabel->dagnode; } + if (node && node->killed) + node = 0; return node; } @@ -238,6 +240,8 @@ dagnode_match (const dagnode_t *n, const daglabel_t *op, { int i; + if (n->killed) + return 0; if (n->label->opcode != op->opcode) return 0; for (i = 0; i < 3; i++) { @@ -364,6 +368,16 @@ dag_set_live_vars (set_t *live_vars, dag_t *dag, dagnode_t *n) } } +static void +dag_kill_nodes (dag_t *dag, dagnode_t *n) +{ + int i; + + for (i = 0; i < dag->num_nodes; i++) + dag->nodes[i]->killed = 1; + n->killed = 0; +} + dag_t * dag_create (flownode_t *flownode) { @@ -445,6 +459,8 @@ dag_create (flownode_t *flownode) } if (n->type == st_func) dag_set_live_vars (live_vars, dag, n); + if (n->type == st_ptrassign) + dag_kill_nodes (dag, n); } nodes = malloc (dag->num_nodes * sizeof (dagnode_t *));