-/**
- * Update the nodes after a match in the value table. If both nodes have
- * the same MacroBlock but different Blocks, we must ensure that the node
- * with the dominating Block (the node that is near to the MacroBlock header
- * is stored in the table.
- * Because a MacroBlock has only one "non-exception" flow, we don't need
- * dominance info here: We known, that one block must dominate the other and
- * following the only block input will allow to find it.
- */
-static void update_known_irn(ir_node *known_irn, const ir_node *new_ir_node)
-{
- ir_node *known_blk, *new_block, *block, *mbh;
-
- if (get_opt_global_cse()) {
- /* Block inputs are meaning less */
- return;
- }
- known_blk = get_irn_n(known_irn, -1);
- new_block = get_irn_n(new_ir_node, -1);
- if (known_blk == new_block) {
- /* already in the same block */
- return;
- }
- /*
- * We expect the typical case when we built the graph. In that case, the
- * known_irn is already the upper one, so checking this should be faster.
- */
- block = new_block;
- mbh = get_Block_MacroBlock(new_block);
- for (;;) {
- if (block == known_blk) {
- /* ok, we have found it: known_block dominates new_block as expected */
- return;
- }
- if (block == mbh) {
- /*
- * We have reached the MacroBlock header NOT founding
- * the known_block. new_block must dominate known_block.
- * Update known_irn.
- */
- set_irn_n(known_irn, -1, new_block);
- return;
- }
- assert(get_Block_n_cfgpreds(block) == 1);
- block = get_Block_cfgpred_block(block, 0);
- }
-} /* update_value_table */
-