void Procedure::deleteOrphans() { IndexSet<Value> valuesInBlocks; for (BasicBlock* block : *this) valuesInBlocks.addAll(*block); // Since this method is not on any hot path, we do it conservatively: first a pass to // identify the values to be removed, and then a second pass to remove them. This avoids any // risk of the value iteration being broken by removals. Vector<Value*, 16> toRemove; for (Value* value : values()) { if (!valuesInBlocks.contains(value)) toRemove.append(value); } for (Value* value : toRemove) deleteValue(value); }
void Procedure::dump(PrintStream& out) const { IndexSet<Value> valuesInBlocks; for (BasicBlock* block : *this) { out.print(deepDump(*this, block)); valuesInBlocks.addAll(*block); } bool didPrint = false; for (Value* value : values()) { if (valuesInBlocks.contains(value)) continue; if (!didPrint) { dataLog("Orphaned values:\n"); didPrint = true; } dataLog(" ", deepDump(*this, value), "\n"); } if (m_byproducts->count()) out.print(*m_byproducts); }
void Procedure::setBlockOrderImpl(Vector<BasicBlock*>& blocks) { IndexSet<BasicBlock> blocksSet; blocksSet.addAll(blocks); for (BasicBlock* block : *this) { if (!blocksSet.contains(block)) blocks.append(block); } // Place blocks into this's block list by first leaking all of the blocks and then readopting // them. for (auto& entry : m_blocks) entry.release(); m_blocks.resize(blocks.size()); for (unsigned i = 0; i < blocks.size(); ++i) { BasicBlock* block = blocks[i]; block->m_index = i; m_blocks[i] = std::unique_ptr<BasicBlock>(block); } }