// Process the structure recursively // int32_t TR_ExpressionsSimplification::perform(TR_Structure * str) { if (trace()) traceMsg(comp(), "Analyzing root Structure : %p\n", str); TR_RegionStructure *region; // Only regions can be simplified // if (!(region = str->asRegion())) return 0; TR_RegionStructure::Cursor it(*region); for (TR_StructureSubGraphNode *node = it.getCurrent(); node != 0; node = it.getNext()) { // Too strict /* if ((node->getPredecessors().size() == 1)) { TR::CFGEdge *edge = node->getPredecessors().front(); TR_StructureSubGraphNode *pred = toStructureSubGraphNode(edge->getFrom()); TR_BlockStructure *b = pred->getStructure()->asBlock(); if (b && pred->getSuccessors().size() == 1)) perform(node->getStructure()); } */ perform(node->getStructure()); } // debug only // /* if (region->isNaturalLoop() && (region->getParent() && !region->getParent()->asRegion()->isCanonicalizedLoop())) { traceMsg(comp(), "Loop not canonicalized %x\n", region); } */ TR::Block *entryBlock = region->getEntryBlock(); if (region->isNaturalLoop() && !entryBlock->isCold() && (region->getParent() /* && region->getParent()->asRegion()->isCanonicalizedLoop() */)) { if (trace()) traceMsg(comp(), "Found candidate non cold loop %p for expression elimination\n", region); findAndSimplifyInvariantLoopExpressions(region); } return 1; // Need to specify the cost }