Create dummy uses for global variables

The exit dummy block is setup to provide dummy uses of global variables to
the live variable analysis doesn't miss global variables. Much cleaner than
the previous code :) There may be some issues with aliases, though.
This commit is contained in:
Bill Currie 2012-12-10 15:20:27 +09:00
parent 2e105f17f2
commit c47cb697de

View file

@ -558,13 +558,6 @@ flow_live_vars (flowgraph_t *graph)
def = set_new (); def = set_new ();
for (st = node->sblock->statements; st; st = st->next) { for (st = node->sblock->statements; st; st = st->next) {
flow_analyze_statement (st, stuse, stdef, 0, 0); flow_analyze_statement (st, stuse, stdef, 0, 0);
if (st->type == st_func && !strncmp (st->opcode, "<RETURN", 7)) {
set_t *global_vars = set_new ();
set_assign (global_vars, graph->func->global_vars);
live_set_use (global_vars, use, def);
set_delete (global_vars);
}
live_set_use (stuse, use, def); live_set_use (stuse, use, def);
live_set_def (stdef, use, def); live_set_def (stdef, use, def);
} }
@ -573,6 +566,15 @@ flow_live_vars (flowgraph_t *graph)
node->live_vars.in = set_new (); node->live_vars.in = set_new ();
node->live_vars.out = set_new (); node->live_vars.out = set_new ();
} }
// create in for the exit dummy block using the global vars used by the
// function
use = set_new ();
set_assign (use, graph->func->global_vars);
node = graph->nodes[graph->num_nodes + 1];
node->live_vars.in = use;
node->live_vars.out = set_new ();
node->live_vars.use = set_new ();
node->live_vars.def = set_new ();
while (changed) { while (changed) {
changed = 0; changed = 0;