// Print the cluster of the subregions. This groups the single basic blocks // and adds a different background color for each group. static void printRegionCluster(const Region *R, GraphWriter<RegionInfo*> &GW, unsigned depth = 0) { raw_ostream &O = GW.getOStream(); O.indent(2 * depth) << "subgraph cluster_" << static_cast<const void*>(R) << " {\n"; O.indent(2 * (depth + 1)) << "label = \"\";\n"; if (!onlySimpleRegions || R->isSimple()) { O.indent(2 * (depth + 1)) << "style = filled;\n"; O.indent(2 * (depth + 1)) << "color = " << ((R->getDepth() * 2 % 12) + 1) << "\n"; } else { O.indent(2 * (depth + 1)) << "style = solid;\n"; O.indent(2 * (depth + 1)) << "color = " << ((R->getDepth() * 2 % 12) + 2) << "\n"; } for (Region::const_iterator RI = R->begin(), RE = R->end(); RI != RE; ++RI) printRegionCluster(*RI, GW, depth + 1); RegionInfo *RI = R->getRegionInfo(); for (Region::const_block_iterator BI = R->block_begin(), BE = R->block_end(); BI != BE; ++BI) if (RI->getRegionFor(*BI) == R) O.indent(2 * (depth + 1)) << "Node" << static_cast<const void*>(RI->getTopLevelRegion()->getBBNode(*BI)) << ";\n"; O.indent(2 * depth) << "}\n"; }
// Print the cluster of the subregions. This groups the single basic blocks // and adds a different background color for each group. static void printRegionCluster(const ScopDetection *SD, const Region *R, raw_ostream &O, unsigned depth = 0) { O.indent(2 * depth) << "subgraph cluster_" << static_cast<const void *>(R) << " {\n"; unsigned LineBegin, LineEnd; std::string FileName; getDebugLocation(R, LineBegin, LineEnd, FileName); std::string Location; if (LineBegin != (unsigned)-1) { Location = escapeString(FileName + ":" + std::to_string(LineBegin) + "-" + std::to_string(LineEnd) + "\n"); } std::string ErrorMessage = SD->regionIsInvalidBecause(R); ErrorMessage = escapeString(ErrorMessage); O.indent(2 * (depth + 1)) << "label = \"" << Location << ErrorMessage << "\";\n"; if (SD->isMaxRegionInScop(*R)) { O.indent(2 * (depth + 1)) << "style = filled;\n"; // Set color to green. O.indent(2 * (depth + 1)) << "color = 3"; } else { O.indent(2 * (depth + 1)) << "style = solid;\n"; int color = (R->getDepth() * 2 % 12) + 1; // We do not want green again. if (color == 3) color = 6; O.indent(2 * (depth + 1)) << "color = " << color << "\n"; } for (const auto &SubRegion : *R) printRegionCluster(SD, SubRegion.get(), O, depth + 1); RegionInfo *RI = R->getRegionInfo(); for (const auto &BB : R->blocks()) if (RI->getRegionFor(BB) == R) O.indent(2 * (depth + 1)) << "Node" << static_cast<void *>(RI->getTopLevelRegion()->getBBNode(BB)) << ";\n"; O.indent(2 * depth) << "}\n"; }
void JSEdgeRemovalPass::padExitBlocks(RegionInfo& ri) { Region* top = ri.getTopLevelRegion(); if(top != 0) { padExitBlocks(ri, top); } }