Пример #1
0
/* 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;
}
Пример #2
0
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;
}