/** * Add to sets coveredNodes and coveredArcs the cfg arcs that are now * covered given the new region containing the translations in * selectedVec. */ static void markCovered(const TransCFG& cfg, const RegionDescPtr region, const TransIDVec& selectedVec, const TransIDSet heads, TransIDSet& coveredNodes, TransCFG::ArcPtrSet& coveredArcs) { assert(selectedVec.size() > 0); TransID newHead = selectedVec[0]; assert(!region->empty()); assert(newHead == getTransId(region->entry()->id())); // Mark all region's nodes as covered. coveredNodes.insert(selectedVec.begin(), selectedVec.end()); // Mark all incoming arcs into newHead from covered nodes as covered. for (auto arc : cfg.inArcs(newHead)) { TransID src = arc->src(); if (coveredNodes.count(src)) { coveredArcs.insert(arc); } } // Mark all CFG arcs within the region as covered. region->forEachArc([&](RegionDesc::BlockId src, RegionDesc::BlockId dst) { if (!hasTransId(src) || !hasTransId(dst)) return; TransID srcTid = getTransId(src); TransID dstTid = getTransId(dst); assert(cfg.hasArc(srcTid, dstTid)); bool foundArc = false; for (auto arc : cfg.outArcs(srcTid)) { if (arc->dst() == dstTid) { coveredArcs.insert(arc); foundArc = true; } } always_assert(foundArc); }); // Mark all outgoing arcs from the region to a head node as covered. for (auto node : selectedVec) { for (auto arc : cfg.outArcs(node)) { if (heads.count(arc->dst())) { coveredArcs.insert(arc); } } } }
/** * Add to sets coveredNodes and coveredArcs the cfg arcs that are now * covered given the new region containing the translations in * selectedVec. */ static void markCovered(const TransCFG& cfg, const TransIDVec selectedVec, const TransIDSet heads, TransIDSet& coveredNodes, TransCFG::ArcPtrSet& coveredArcs) { assert(selectedVec.size() > 0); TransID newHead = selectedVec[0]; // Mark all region's nodes as covered. coveredNodes.insert(selectedVec.begin(), selectedVec.end()); // Mark all incoming arcs into newHead from covered nodes as covered. for (auto arc : cfg.inArcs(newHead)) { TransID src = arc->src(); if (coveredNodes.count(src)) { coveredArcs.insert(arc); } } // Mark all arcs between consecutive region nodes as covered. for (size_t i = 0; i < selectedVec.size() - 1; i++) { TransID node = selectedVec[i]; TransID next = selectedVec[i + 1]; bool foundArc = false; for (auto arc : cfg.outArcs(node)) { if (arc->dst() == next) { coveredArcs.insert(arc); foundArc = true; } } always_assert(foundArc); } // Mark all outgoing arcs from the region to a head node as covered. for (auto node : selectedVec) { for (auto arc : cfg.outArcs(node)) { if (heads.count(arc->dst())) { coveredArcs.insert(arc); } } } }