U_32 EscapeAnalyzer::doAnalysis() { MemoryManager memManager("EscapeAnalyzer::doAnalysis"); StlDeque<Inst*> candidateSet(memManager); BitSet escapingInsts(memManager,irManager.getInstFactory().getNumInsts()); const Nodes& nodes = irManager.getFlowGraph().getNodes(); Nodes::const_iterator niter; // // Clear all marks on instructions // Collect instructions that are candidate for escape optimizations // for(niter = nodes.begin(); niter != nodes.end(); ++niter) { Node* node = *niter; Inst *headInst = (Inst*)node->getFirstInst(); for (Inst* inst=headInst->getNextInst();inst!=NULL;inst=inst->getNextInst()) { if (isEscapeOptimizationCandidate(inst)) candidateSet.push_back(inst); } } // // Iteratively mark instructions whose results escape the method // for(niter = nodes.begin(); niter != nodes.end(); ++niter) { Node* node = *niter; Inst *headInst = (Inst*)node->getFirstInst(); for (Inst* inst=headInst->getNextInst();inst!=NULL;inst=inst->getNextInst()) { if (isPotentiallyEscapingInst(inst) == false) continue; escapingInsts.setBit(inst->getId(),true); for (U_32 i=0; i<inst->getNumSrcOperands(); i++) { if (isEscapingSrcObject(inst,i) == false) continue; // src escapes markEscapingInst(inst->getSrc(i)->getInst(),escapingInsts); } } } // // Print out non-escaping instructions // U_32 numTrapped = 0; while (candidateSet.empty() == false) { Inst* inst = candidateSet.front(); candidateSet.pop_front(); if (escapingInsts.getBit(inst->getId())) continue; numTrapped++; } return numTrapped; }
void PersistentInstructionIdGenerator::runPass(IRManager& irm) { MemoryManager mm("PersistentInstructionIdGenerator::runPass"); MethodDesc& methodDesc = irm.getMethodDesc(); StlVector<Node*> nodes(mm); irm.getFlowGraph().getNodesPostOrder(nodes); StlVector<Node*>::reverse_iterator i; for(i = nodes.rbegin(); i != nodes.rend(); ++i) { Node* node = *i; Inst* label = (Inst*)node->getFirstInst(); for(Inst* inst = label->getNextInst(); inst != NULL; inst = inst->getNextInst()) inst->setPersistentInstructionId(PersistentInstructionId(&methodDesc, inst->getId() - irm.getMinimumInstId())); } }