ABS_NODE * CFS_MGR::construct_abs_loop( IN IR_BB * entry, IN ABS_NODE * parent, IN BITSET * cur_region, IN GRAPH & cur_graph, IN OUT BITSET & visited) { IS_TRUE0(cur_region == NULL || cur_region->is_contain(IR_BB_id(entry))); IR_CFG * cfg = m_ru->get_cfg(); LI<IR_BB> * li = cfg->map_bb2li(entry); IS_TRUE0(li != NULL && LI_loop_head(li) == entry); ABS_NODE * node = new_abs_node(ABS_LOOP); set_map_bb2abs(entry, node); ABS_NODE_parent(node) = parent; ABS_NODE_loop_head(node) = entry; IR_BB * body_start; cfg->get_loop_two_kids(entry, NULL, &body_start); IS_TRUE0(body_start != NULL); CFS_INFO * ci = map_ir2cfsinfo(cfg->get_last_xr(entry)); IS_TRUE0(ci != NULL && CFS_INFO_head(ci) == entry); IS_TRUE0(CFS_INFO_loop_body(ci)->is_contain(*LI_bb_set(li))); BITSET loc_visited; ABS_NODE_loop_body(node) = construct_abs_tree(body_start, node, LI_bb_set(li), cur_graph, loc_visited); visited.bunion(loc_visited); visited.bunion(IR_BB_id(entry)); return node; }
AbsNode * CfsMgr::constructAbsLoop( IN IRBB * entry, IN AbsNode * parent, IN BitSet * cur_region, IN Graph & cur_graph, IN OUT BitSet & visited) { DUMMYUSE(cur_region); ASSERT0(cur_region == NULL || cur_region->is_contain(BB_id(entry))); IR_CFG * cfg = m_ru->getCFG(); LI<IRBB> * li = cfg->mapBB2LabelInfo(entry); ASSERT0(li != NULL && LI_loop_head(li) == entry); AbsNode * node = new_abs_node(ABS_LOOP); set_map_bb2abs(entry, node); ABS_NODE_parent(node) = parent; ABS_NODE_loop_head(node) = entry; IRBB * body_start; cfg->getKidOfLoop(entry, NULL, &body_start); ASSERT0(body_start != NULL); CFS_INFO * ci = map_ir2cfsinfo(cfg->get_last_xr(entry)); CHECK_DUMMYUSE(ci); ASSERT0(CFS_INFO_head(ci) == entry); ASSERT0(CFS_INFO_loop_body(ci)->is_contain(*LI_bb_set(li))); BitSet loc_visited; ABS_NODE_loop_body(node) = constructAbsTree(body_start, node, LI_bb_set(li), cur_graph, loc_visited); visited.bunion(loc_visited); visited.bunion(BB_id(entry)); return node; }
// //START CfsMgr // CFS_INFO * CfsMgr::new_cfs_info(IR_TYPE irtype) { CFS_INFO * ci = (CFS_INFO*)xmalloc(sizeof(CFS_INFO)); CFS_INFO_cfs_type(ci) = irtype; switch (irtype) { case IR_IF: CFS_INFO_true_body(ci) = m_bs_mgr.create(); CFS_INFO_false_body(ci) = m_bs_mgr.create(); break; case IR_DO_LOOP: case IR_WHILE_DO: case IR_DO_WHILE: CFS_INFO_loop_body(ci) = m_bs_mgr.create(); break; default: UNREACH(); } return ci; }