Ejemplo n.º 1
0
//
// find def sites (blocks) of var operand
//
void SSABuilder::findDefSites(DefSites& allDefSites) {
    const Nodes& nodes = fg->getNodes();
    Nodes::const_iterator niter;
    for(niter = nodes.begin(); niter != nodes.end(); ++niter) {
        Node* node = *niter;
        if (!node->isBlockNode()) continue;

        // go over each instruction to find var definition
        Inst* first = (Inst*)node->getFirstInst();
        for (Inst* inst = first->getNextInst(); inst != NULL; inst = inst->getNextInst()) {
            // look for var definitions
            if (!inst->isStVar()) 
                continue;

            assert(inst->isVarAccess());
            // if inst->getVar() return NULL, then inst is accessing SSAOpnd.
            // Hence, there is no need to do SSA transformation (addVarDefSite() 
            // immediately returns.
            allDefSites.addVarDefSite(((VarAccessInst*)inst)->getVar(),node);
        }
    }
}