void OMR::CodeGenPhase::performInstructionSelectionPhase(TR::CodeGenerator * cg, TR::CodeGenPhase * phase) { TR::Compilation* comp = cg->comp(); phase->reportPhase(InstructionSelectionPhase); if (comp->getOption(TR_TraceCG) || comp->getOption(TR_TraceTrees) || comp->getOptions()->getTraceCGOption(TR_TraceCGPreInstructionSelection)) comp->dumpMethodTrees("Pre Instruction Selection Trees"); TR::LexicalMemProfiler mp(phase->getName(), comp->phaseMemProfiler()); LexicalTimer pt(phase->getName(), comp->phaseTimer()); cg->doInstructionSelection(); if (comp->getOption(TR_TraceCG) || comp->getOptions()->getTraceCGOption(TR_TraceCGPostInstructionSelection)) comp->getDebug()->dumpMethodInstrs(comp->getOutFile(), "Post Instruction Selection Instructions", false, true); // check reference counts #if defined(DEBUG) || defined(PROD_WITH_ASSUMES) for (int r=0; r<NumRegisterKinds; r++) { if (TO_KIND_MASK(r) & cg->getSupportedLiveRegisterKinds()) { cg->checkForLiveRegisters(cg->getLiveRegisters((TR_RegisterKinds)r)); } } #endif // check interrupt if (comp->compilationShouldBeInterrupted(AFTER_INSTRUCTION_SELECTION_CONTEXT)) { comp->failCompilation<TR::CompilationInterrupted>("interrupted after instruction selection"); } }
void OMR::CodeGenPhase::performRegisterAssigningPhase(TR::CodeGenerator * cg, TR::CodeGenPhase * phase) { TR::Compilation* comp = cg->comp(); phase->reportPhase(RegisterAssigningPhase); if (cg->getDebug()) cg->getDebug()->roundAddressEnumerationCounters(); { TR::LexicalMemProfiler mp("RA", comp->phaseMemProfiler()); LexicalTimer pt("RA", comp->phaseTimer()); TR_RegisterKinds colourableKindsToAssign; TR_RegisterKinds nonColourableKindsToAssign = cg->prepareRegistersForAssignment(); cg->jettisonAllSpills(); // Spill temps used before now may lead to conflicts if also used by register assignment // Do local register assignment for non-colourable registers. // if(cg->getTraceRAOption(TR_TraceRAListing)) if(cg->getDebug()) cg->getDebug()->dumpMethodInstrs(comp->getOutFile(),"Before Local RA",false); cg->doRegisterAssignment(nonColourableKindsToAssign); if (comp->compilationShouldBeInterrupted(AFTER_REGISTER_ASSIGNMENT_CONTEXT)) { comp->failCompilation<TR::CompilationInterrupted>("interrupted after RA"); } } if (comp->getOption(TR_TraceCG) || comp->getOptions()->getTraceCGOption(TR_TraceCGPostRegisterAssignment)) comp->getDebug()->dumpMethodInstrs(comp->getOutFile(), "Post Register Assignment Instructions", false, true); }