static void resetBlockVisitFlags(TR::Compilation *comp) { for (TR::Block *block = comp->getStartBlock(); block != NULL; block = block->getNextBlock()) { block->setHasBeenVisited(false); } }
TR::TreeTop * OMR::Simplifier::simplifyExtendedBlock(TR::TreeTop * treeTop) { TR::Block * block = 0; _containingStructure = NULL; _blockRemoved = false; for (; treeTop; treeTop = treeTop->getNextTreeTop()) { TR::Node * node = treeTop->getNode(); TR_ASSERT(node->getOpCodeValue() == TR::BBStart, "Simplification, expected BBStart treetop"); TR::Block * b = node->getBlock(); if (block && !b->isExtensionOfPreviousBlock()) break; if (b->isOSRCodeBlock() || b->isOSRCatchBlock()) { b->setHasBeenVisited(); treeTop = b->getExit(); continue; } #ifdef DEBUG if (block != b) b->setHasBeenVisited(); #endif if (!block && _reassociate && comp()->getFlowGraph()->getStructure() != NULL // [99391] getStructureOf() only valid if structure isn't invalidated ) { // b is first block in the extended block TR_BlockStructure *blockStructure = b->getStructureOf(); if(blockStructure) { TR_Structure *parent = blockStructure->getParent(); while (parent) { TR_RegionStructure *region = parent->asRegion(); if (region->isNaturalLoop() /* || region->containsInternalCycles() */) { _containingStructure = region; break; } parent = parent->getParent(); } } } block = b; if (trace()) traceMsg(comp(), "simplifying block_%d\n", block->getNumber()); _performLowerTreeSimplifier=NULL; _performLowerTreeNode=NULL; simplify(block); if(_performLowerTreeSimplifier) { _performLowerTreeNode = postWalkLowerTreeSimplifier(_performLowerTreeSimplifier, _performLowerTreeNode, block, (TR::Simplifier *) this); _performLowerTreeSimplifier->setNode(_performLowerTreeNode); } // If the block itself was removed from the CFG during simplification, find // the next 'legitimate' block to be simplified // //if (comp()->getFlowGraph()->getRemovedNodes().find(block)) if(block->nodeIsRemoved()) { TR::TreeTop * tt = findNextLegalTreeTop(comp(), block); // in certain cases the removed block might be the last one we haven't // visited and therefore we won't be able to find a treetop to continue // in such cases we exit the loop // treeTop = tt ? tt->getPrevTreeTop() : 0; if (!treeTop) break; } else { treeTop = block->getExit(); } } // now remove any unreachable blocks // if (_blockRemoved) { // if the next block to be processed has been removed, // find the next valid block to process // if (treeTop) { TR::Block *b = treeTop->getNode()->getBlock(); //if (comp()->getFlowGraph()->getRemovedNodes().find(b)) if(b->nodeIsRemoved()) treeTop = findNextLegalTreeTop(comp(), b); } } return treeTop; }