From: Jürg Billeter Date: Wed, 23 Dec 2009 19:46:41 +0000 (+0100) Subject: Generate reverse postorder instead of preorder list in flow analyzer X-Git-Tag: 0.7.10~143 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae18e9b49e837dc09ace876e413a269780592a8a;p=thirdparty%2Fvala.git Generate reverse postorder instead of preorder list in flow analyzer --- diff --git a/vala/valabasicblock.vala b/vala/valabasicblock.vala index 498622c89..c69f6c663 100644 --- a/vala/valabasicblock.vala +++ b/vala/valabasicblock.vala @@ -40,6 +40,8 @@ public class Vala.BasicBlock { Set phi_functions = new HashSet (); + public bool postorder_visited { get; set; } + public BasicBlock () { } diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index 870a9e1ce..5cb8f1fbf 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -181,6 +181,7 @@ public class Vala.FlowAnalyzer : CodeVisitor { check_variables (entry_block); } + // generates reverse postorder list List get_depth_first_list (BasicBlock entry_block) { var list = new ArrayList (); depth_first_traverse (entry_block, list); @@ -188,13 +189,14 @@ public class Vala.FlowAnalyzer : CodeVisitor { } void depth_first_traverse (BasicBlock current, List list) { - if (current in list) { + if (current.postorder_visited) { return; } - list.add (current); + current.postorder_visited = true; foreach (BasicBlock succ in current.get_successors ()) { depth_first_traverse (succ, list); } + list.insert (0, current); } void build_dominator_tree (List block_list, BasicBlock entry_block) {