Do not gcse unreachable code
authorAndreas Zwinkau <zwinkau@kit.edu>
Mon, 16 May 2011 11:56:08 +0000 (13:56 +0200)
committerAndreas Zwinkau <zwinkau@kit.edu>
Mon, 16 May 2011 11:56:08 +0000 (13:56 +0200)
During global CSE we now ignore nodes in unreachable blocks,
otherwise cse could pick the wrong representative node
and use unreachable nodes in reachable code.

ir/ir/iropt.c

index 679410d..ba62501 100644 (file)
@@ -6129,6 +6129,16 @@ ir_node *identify_remember(ir_node *n)
        if (value_table == NULL)
                return n;
 
+       if (get_opt_global_cse()) {
+               /* do not remember unreachable nodes */
+               if (get_irg_dom_state(irg) == dom_consistent && !is_Block(n)) {
+                       ir_node *block = get_nodes_block(n);
+                       if (get_Block_dom_depth(block) < 0) {
+                               return n;
+                       }
+               }
+       }
+
        ir_normalize_node(n);
        /* lookup or insert in hash table with given hash key. */
        nn = (ir_node*)pset_insert(value_table, n, ir_node_hash(n));