--- C:\Documents and Settings\ebrevnov\Local Settings\Temp\1\Ia32BBPolling.cpp-rev321.svn000.tmp.cpp 2007-05-04 20:18:36.000000000 +-0700 +++ C:\Documents and Settings\ebrevnov\Local Settings\Temp\1\Ia32BBPolling.cpp-rev322.svn000.tmp.cpp 2007-05-04 20:18:36.000000000 +-0700 @@ -220,13 +220,13 @@ fg->replaceEdgeTarget(edge, bbpCFGController); } else { // we need a new bbpCFG ControlFlowGraph* bbpCFG = bbp.createBBPSubCFG(*irManager, tlsBaseReg); // Inlining bbpCFG at edge fg->spliceFlowGraphInline(edge, *bbpCFG); - bbp.setBBPSubCFGController(originalTargetId,sourceDispatchId,edge->getTargetNode()); + bbp.setBBPSubCFGController(originalTargetId,sourceDispatchId,bbpCFG->getEntryNode()); } } if (Log::isEnabled()) Log::out() << "BBPolling transformer FINISHED" << ::std::endl; } //runImpl() uint32 getNeedInfo()const{ return NeedInfo_LoopInfo; } @@ -422,15 +425,12 @@ } return false; } bool BBPolling::hasNativeInterruptablePoints(const Node* node) { - if (node->isDispatchNode()) { - return true; - } if (node->isBlockNode()) { // If current BB has an inst that is ThreadInterruptablePoint itself // the hasThreadInterruptablePoint becomes true for it for (Inst* inst = (Inst*)node->getFirstInst(); inst!=NULL; inst = inst->getNextInst()) { if (BBPolling::isThreadInterruptablePoint(inst)) { return true; @@ -439,18 +439,18 @@ } return false; } bool BBPolling::hasAllThreadInterruptablePredecessors(const Node* node) { - if (node->isDispatchNode()) { - return true; - } LoopTree* lt = irManager.getFlowGraph()->getLoopTree(); assert(lt->isValid()); const Edges& edges = node->getInEdges(); + + if (edges.size() == 0) return false; + // All the predecessors must be processed earlier! for (Edges::const_iterator ite = edges.begin(), ende = edges.end(); ite!=ende; ++ite) { Edge* e = *ite; if (!hasThreadInterruptablePoint[e->getSourceNode()->getId()] && !lt->isLoopExit(e)) { return false; }