Block createBlockWithLabel(std::string label = "") { if (not label.empty()) return Block{label, {}}; else return Block{labelPrefix + std::to_string(getNextLabel()), {}}; }
int cs6300::Expression::getLabel() const { if (label == -1) { label = getNextLabel(); } return label; }
void CBasicBlocksBuilder::SortBlocks() { assert( blocks.size() > 0 ); std::vector<bool> used( blocks.size(), false ); CBasicBlock currBlock = blocks[labelToBlock[firstLabel->label]]; used[labelToBlock[firstLabel->label]] = true; sortedBlocks.push_back( currBlock ); const IIRStm* jump = currBlock.Last(); size_t numOfFreeBlocks = used.size() - 1; while( numOfFreeBlocks > 0 ) { if( IsInstanceOf<CIRJump>( const_cast< IIRStm* >( jump ) ) ) { // За ним просто должен идти блок с меткой, куда прыгаем const Temp::CLabel* nextLabel = getNextLabel( jump ); if( nextLabel->Name() == "done_label" || used[labelToBlock[nextLabel]] ) { // Если блок конца фрейма, или же след ведет в посещенный блок // Значит нужно взять непосещенный и с ним строить след int position = 0; if( getNextFreeBlock( used, currBlock, position ) ) { sortedBlocks.push_back( currBlock ); used[position] = true; --numOfFreeBlocks; jump = currBlock.Last(); continue; } else { // Свободных блоков не осталось break; } } currBlock = blocks[labelToBlock[nextLabel]]; sortedBlocks.push_back( currBlock ); used[labelToBlock[nextLabel]] = true; --numOfFreeBlocks; } else if( IsInstanceOf<CIRCJump>( const_cast< IIRStm* >( jump ) ) ) { // За ним должен идти блок с меткой на false const Temp::CLabel* nextLabel = getNextConditionalLabel( jump ); if( nextLabel->Name() == "done_label" || used[labelToBlock[nextLabel]] ) { int position = 0; if( getNextFreeBlock( used, currBlock, position ) ) { sortedBlocks.push_back( currBlock ); used[position] = true; --numOfFreeBlocks; jump = currBlock.Last(); continue; } else { // Свободных блоков не осталось break; } } currBlock = blocks[labelToBlock[nextLabel]]; sortedBlocks.push_back( currBlock ); used[labelToBlock[nextLabel]] = true; --numOfFreeBlocks; } else { assert( false ); } jump = currBlock.Last(); } }