TR_DominatorVerifier::TR_DominatorVerifier(TR_Dominators &findDominators) : _compilation(findDominators.comp()) { TR::StackMemoryRegion stackMemoryRegion(*trMemory()); _dominators = &findDominators; TR::CFG *cfg = comp()->getFlowGraph(); _visitCount = comp()->incVisitCount(); _numBlocks = cfg->getNumberOfNodes()+1; if (debug("traceVER")) { dumpOptDetails(comp(), "Printing out the TreeTops from DominatorVerifier\n"); TR::TreeTop *currentTree = comp()->getStartTree(); while (!(currentTree == NULL)) { comp()->getDebug()->print(comp()->getOutFile(), currentTree); currentTree = currentTree->getNextTreeTop(); } dumpOptDetails(comp(), "Printing out the CFG from DominatorVerifier\n"); if (cfg != NULL) comp()->getDebug()->print(comp()->getOutFile(), cfg); } TR_DominatorsChk expensiveAlgorithm(comp()); expensiveAlgorithmCorrect = isExpensiveAlgorithmCorrect(expensiveAlgorithm); if (expensiveAlgorithmCorrect) { if (debug("traceVER")) dumpOptDetails(comp(), "Dominators computed by the expensive algorithm are correct\n"); } else { if (debug("traceVER")) dumpOptDetails(comp(), "Dominators computed by the expensive algorithm are NOT correct\n"); TR_ASSERT(0, "Dominators computed by the expensive algorithm are NOT correct\n"); } bothImplementationsConsistent = areBothImplementationsConsistent(expensiveAlgorithm, findDominators); if (bothImplementationsConsistent) { if (debug("traceVER")) dumpOptDetails(comp(), "Dominators computed by the two implementations are consistent\n"); } else { if (debug("traceVER")) dumpOptDetails(comp(), "Dominators computed by the two implementations are NOT consistent\n"); TR_ASSERT(0, "Dominators computed by the two implementations are NOT consistent\n"); } }
void TR_ReachabilityAnalysis::perform(TR_BitVector *result) { TR::CFG *cfg = comp()->getFlowGraph(); int32_t numBlockIndexes = cfg->getNextNodeNumber(); int32_t numBlocks = cfg->getNumberOfNodes(); _blocks = cfg->createArrayOfBlocks(); blocknum_t *stack = (blocknum_t*)comp()->trMemory()->allocateStackMemory(numBlockIndexes * sizeof(stack[0])); blocknum_t *depthMap = (blocknum_t*)comp()->trMemory()->allocateStackMemory(numBlockIndexes * sizeof(depthMap[0])); memset(depthMap, 0, numBlockIndexes * sizeof(depthMap[0])); bool trace = comp()->getOption(TR_TraceReachability); if (trace) traceMsg(comp(), "BEGIN REACHABILITY: %d blocks\n", numBlocks); for (TR::Block *block = comp()->getStartBlock(); block; block = block->getNextBlock()) { blocknum_t blockNum = block->getNumber(); if (trace) traceMsg(comp(), "Visit block_%d\n", blockNum); if (depthMap[blockNum] == 0) traverse(blockNum, 0, stack, depthMap, result); else traceMsg(comp(), " depth is already %d; skip\n", depthMap[blockNum]); } if (comp()->getOption(TR_TraceReachability)) { traceMsg(comp(), "END REACHABILITY. Result:\n"); result->print(comp(), comp()->getOutFile()); traceMsg(comp(), "\n"); } }