/* Encode expression for a list of BB. Scan IR statement literally, and encoding it for generating the unique id for each individual expressions, and update the 'GEN-SET' and 'KILL-SET' of IR-EXPR for BB as well as. */ bool IR_EXPR_TAB::perform(IN OUT OptCTX & oc) { BBList * bbl = m_ru->get_bb_list(); C<IRBB*> * cb; for (IRBB * bb = bbl->get_head(&cb); bb != NULL; bb = bbl->get_next(&cb)) { encode_bb(bb); } OC_is_expr_tab_valid(oc) = true; return true; }
bool IR_CP::perform(OptCtx & oc) { START_TIMER_AFTER(); ASSERT0(OC_is_cfg_valid(oc)); if (m_prop_kind == CP_PROP_CONST) { m_ru->checkValidAndRecompute(&oc, PASS_DOM, PASS_DU_REF, PASS_DU_CHAIN, PASS_UNDEF); } else { m_ru->checkValidAndRecompute(&oc, PASS_DOM, PASS_DU_REF, PASS_LIVE_EXPR, PASS_DU_CHAIN, PASS_UNDEF); } if (!OC_is_du_chain_valid(oc)) { END_TIMER_AFTER(get_pass_name()); return false; } bool change = false; IRBB * entry = m_ru->get_cfg()->get_entry(); ASSERT(entry, ("Not unique entry, invalid Region")); Graph domtree; m_cfg->get_dom_tree(domtree); List<Vertex*> lst; Vertex * root = domtree.get_vertex(BB_id(entry)); m_cfg->sortDomTreeInPreorder(root, lst); Vector<IR*> usevec; for (Vertex * v = lst.get_head(); v != NULL; v = lst.get_next()) { IRBB * bb = m_cfg->get_bb(VERTEX_id(v)); ASSERT0(bb); change |= doProp(bb, usevec); } if (change) { doFinalRefine(); OC_is_expr_tab_valid(oc) = false; OC_is_aa_valid(oc) = false; OC_is_du_chain_valid(oc) = true; //already update. OC_is_ref_valid(oc) = true; //already update. ASSERT0(m_ru->verifyMDRef() && m_du->verifyMDDUChain()); ASSERT0(verifySSAInfo(m_ru)); } END_TIMER_AFTER(get_pass_name()); return change; }