- foreach_block_succ (src, edge) {
- ir_node *succ = get_edge_src_irn(edge);
- dfs_edge_kind_t kind = dfs_get_edge_kind(lv->dfs, src, succ);
+ /* and find back edge targets which are not reduced reachable from bl */
+ foreach_block_succ (si->block, edge) {
+ ir_node *tgt = get_edge_src_irn(edge);
+ bl_info_t *ti = get_block_info(lv, tgt);
+ dfs_edge_kind_t kind = dfs_get_edge_kind(lv->dfs, si->block, tgt);
+
+ if (kind == DFS_EDGE_BACK && !bitset_is_set(bi->red_reachable, ti->id)) {
+ if (!ti->be_tgt_calc)
+ compute_back_edge_chain(lv, tgt);
+ bitset_set(bi->be_tgt_reach, ti->id);
+ bitset_or(bi->be_tgt_reach, ti->be_tgt_reach);
+ }
+ }
+ bitset_clear(bi->be_tgt_reach, bi->id);
+ }
+}
+
+
+static inline void compute_back_edge_chains(lv_chk_t *lv)
+{
+ size_t elm;
+ int i, n;
+
+ DBG((lv->dbg, LEVEL_2, "back edge sources: %B\n", lv->back_edge_src));
+ bitset_foreach(lv->back_edge_src, elm) {
+ compute_back_edge_chain(lv, lv->map[elm]->block);
+ }
+
+ for (i = 0, n = dfs_get_n_nodes(lv->dfs); i < n; ++i) {
+ const ir_node *bl = (const ir_node*) dfs_get_post_num_node(lv->dfs, i);
+ bl_info_t *bi = get_block_info(lv, bl);
+
+ const ir_edge_t *edge;