diff options
author | Richard Henderson <rth@cygnus.com> | 1999-03-17 13:58:49 -0800 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1999-03-17 14:58:49 -0700 |
commit | 422d0fb02b54499db4147cd9f65e7fe01ecf36b2 (patch) | |
tree | c43c997d7221f644b3d173ec09c04ce2bf156966 /gcc/flow.c | |
parent | e41753123bcf8495387918dfc6d8b20d4297bd31 (diff) | |
download | gcc-422d0fb02b54499db4147cd9f65e7fe01ecf36b2.zip gcc-422d0fb02b54499db4147cd9f65e7fe01ecf36b2.tar.gz gcc-422d0fb02b54499db4147cd9f65e7fe01ecf36b2.tar.bz2 |
flow.c (compute_immediate_dominators): New function.
* flow.c (compute_immediate_dominators): New function.
* basic-block.h (compute_immediate_dominators): Declare it.
From-SVN: r25831
Diffstat (limited to 'gcc/flow.c')
-rw-r--r-- | gcc/flow.c | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -4560,6 +4560,46 @@ compute_dominators (dominators, post_dominators, s_preds, s_succs) free (temp_bitmap); } +/* Given DOMINATORS, compute the immediate dominators into IDOM. */ + +void +compute_immediate_dominators (idom, dominators) + int *idom; + sbitmap *dominators; +{ + sbitmap *tmp; + int b; + + tmp = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks); + + /* Begin with tmp(n) = dom(n) - { n }. */ + for (b = n_basic_blocks; --b >= 0; ) + { + sbitmap_copy (tmp[b], dominators[b]); + RESET_BIT (tmp[b], b); + } + + /* Subtract out all of our dominator's dominators. */ + for (b = n_basic_blocks; --b >= 0; ) + { + sbitmap tmp_b = tmp[b]; + int s; + + for (s = n_basic_blocks; --s >= 0; ) + if (TEST_BIT (tmp_b, s)) + sbitmap_difference (tmp_b, tmp_b, tmp[s]); + } + + /* Find the one bit set in the bitmap and put it in the output array. */ + for (b = n_basic_blocks; --b >= 0; ) + { + int t; + EXECUTE_IF_SET_IN_SBITMAP (tmp[b], 0, t, { idom[b] = t; }); + } + + sbitmap_vector_free (tmp); +} + /* Count for a single SET rtx, X. */ static void |