From: Jürg Billeter Date: Wed, 23 Dec 2009 19:36:55 +0000 (+0100) Subject: Only generate depth-first list once per method in flow analyzer X-Git-Tag: 0.7.10~144 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3a0e6b265506c0af35d9fc4d05560eb6cd505085;p=thirdparty%2Fvala.git Only generate depth-first list once per method in flow analyzer Improves performance. --- diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index 6e1d3b7ee..870a9e1ce 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -173,9 +173,11 @@ public class Vala.FlowAnalyzer : CodeVisitor { } void analyze_body (BasicBlock entry_block) { - build_dominator_tree (entry_block); - build_dominator_frontier (entry_block); - insert_phi_functions (entry_block); + var block_list = get_depth_first_list (entry_block); + + build_dominator_tree (block_list, entry_block); + build_dominator_frontier (block_list, entry_block); + insert_phi_functions (block_list, entry_block); check_variables (entry_block); } @@ -195,10 +197,9 @@ public class Vala.FlowAnalyzer : CodeVisitor { } } - void build_dominator_tree (BasicBlock entry_block) { + void build_dominator_tree (List block_list, BasicBlock entry_block) { // set dom(n) = {E,1,2...,N,X} forall n var dom = new HashMap> (); - var block_list = get_depth_first_list (entry_block); foreach (BasicBlock block in block_list) { var block_set = new HashSet (); foreach (BasicBlock b in block_list) { @@ -283,8 +284,7 @@ public class Vala.FlowAnalyzer : CodeVisitor { } } - void build_dominator_frontier (BasicBlock entry_block) { - var block_list = get_depth_first_list (entry_block); + void build_dominator_frontier (List block_list, BasicBlock entry_block) { for (int i = block_list.size - 1; i >= 0; i--) { var block = block_list[i]; @@ -306,9 +306,9 @@ public class Vala.FlowAnalyzer : CodeVisitor { } } - Map> get_assignment_map (BasicBlock entry_block) { + Map> get_assignment_map (List block_list, BasicBlock entry_block) { var map = new HashMap> (); - foreach (BasicBlock block in get_depth_first_list (entry_block)) { + foreach (BasicBlock block in block_list) { var defined_variables = new ArrayList (); foreach (CodeNode node in block.get_nodes ()) { node.get_defined_variables (defined_variables); @@ -326,15 +326,15 @@ public class Vala.FlowAnalyzer : CodeVisitor { return map; } - void insert_phi_functions (BasicBlock entry_block) { - var assign = get_assignment_map (entry_block); + void insert_phi_functions (List block_list, BasicBlock entry_block) { + var assign = get_assignment_map (block_list, entry_block); int counter = 0; var work_list = new ArrayList (); var added = new HashMap (); var phi = new HashMap (); - foreach (BasicBlock block in get_depth_first_list (entry_block)) { + foreach (BasicBlock block in block_list) { added.set (block, 0); phi.set (block, 0); }