/* * Splits the critical edges in `unit', if any. * Returns true iff the unit was modified. */ bool splitCriticalEdges(Vunit& unit) { jit::vector<unsigned> preds(unit.blocks.size()); jit::flat_set<size_t> catch_blocks; for (size_t b = 0; b < unit.blocks.size(); b++) { auto succlist = succs(unit.blocks[b]); for (auto succ : succlist) { preds[succ]++; } } auto changed = false; for (size_t pred = 0; pred < unit.blocks.size(); pred++) { auto succlist = succs(unit.blocks[pred]); if (succlist.size() <= 1) continue; for (auto& succ : succlist) { if (preds[succ] <= 1) continue; // split the critical edge. auto middle = unit.makeBlock(unit.blocks[succ].area); forwardJmp(unit, catch_blocks, middle, succ); succ = middle; changed = true; } } // Remove any landingpad{} instructions that were hoisted to split edges. for (auto block : catch_blocks) { auto& code = unit.blocks[block].code; assertx(code.front().op == Vinstr::landingpad); code.front() = nop{}; } return changed; }
/* * Splits the critical edges in `unit', if any. * Returns true iff the unit was modified. */ bool splitCriticalEdges(Vunit& unit) { jit::vector<unsigned> preds(unit.blocks.size()); for (size_t b = 0; b < unit.blocks.size(); b++) { auto succlist = succs(unit.blocks[b]); for (auto succ : succlist) { preds[succ]++; } } auto changed = false; for (size_t pred = 0; pred < unit.blocks.size(); pred++) { auto succlist = succs(unit.blocks[pred]); if (succlist.size() <= 1) continue; for (auto& succ : succlist) { if (preds[succ] <= 1) continue; // split the critical edge. auto middle = unit.makeBlock(unit.blocks[succ].area); forwardJmp(unit, middle, succ); succ = middle; changed = true; } } return changed; }