// A critical edge is an edge which is neither its successor's only predecessor // nor its predecessor's only successor. Critical edges must be split to // prevent copy-insertion and code motion from affecting other edges. bool ion::SplitCriticalEdges(MIRGraph &graph) { for (MBasicBlockIterator block(graph.begin()); block != graph.end(); block++) { if (block->numSuccessors() < 2) continue; for (size_t i = 0; i < block->numSuccessors(); i++) { MBasicBlock *target = block->getSuccessor(i); if (target->numPredecessors() < 2) continue; // Create a new block inheriting from the predecessor. MBasicBlock *split = MBasicBlock::NewSplitEdge(graph, block->info(), *block); split->setLoopDepth(block->loopDepth()); graph.insertBlockAfter(*block, split); split->end(MGoto::New(target)); block->replaceSuccessor(i, split); target->replacePredecessor(*block, split); } } return true; }