void build_sese_loop_nests (sese region) { unsigned i; basic_block bb; struct loop *loop0, *loop1; FOR_EACH_BB_FN (bb, cfun) if (bb_in_sese_p (bb, region)) { struct loop *loop = bb->loop_father; /* Only add loops if they are completely contained in the SCoP. */ if (loop->header == bb && bb_in_sese_p (loop->latch, region)) sese_record_loop (region, loop); } /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It can be the case that an inner loop is inserted before an outer loop. To avoid this, semi-sort once. */ FOR_EACH_VEC_ELT (SESE_LOOP_NEST (region), i, loop0) { if (SESE_LOOP_NEST (region).length () == i + 1) break; loop1 = SESE_LOOP_NEST (region)[i + 1]; if (loop0->num > loop1->num) { SESE_LOOP_NEST (region)[i] = loop1; SESE_LOOP_NEST (region)[i + 1] = loop0; } } }
static bool sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb, tree use) { unsigned ver; basic_block def_bb; if (TREE_CODE (use) != SSA_NAME) return false; ver = SSA_NAME_VERSION (use); /* If it's in liveouts, the variable will get a new PHI node, and the debug use will be properly adjusted. */ if (bitmap_bit_p (liveouts, ver)) return false; def_bb = gimple_bb (SSA_NAME_DEF_STMT (use)); if (!def_bb || !bb_in_sese_p (def_bb, region) || bb_in_sese_p (bb, region)) return false; return true; }
static void print_graphite_scop_statistics (FILE* file, scop_p scop) { long n_bbs = 0; long n_loops = 0; long n_stmts = 0; long n_conditions = 0; long n_p_bbs = 0; long n_p_loops = 0; long n_p_stmts = 0; long n_p_conditions = 0; basic_block bb; FOR_ALL_BB (bb) { gimple_stmt_iterator psi; loop_p loop = bb->loop_father; if (!bb_in_sese_p (bb, SCOP_REGION (scop))) continue; n_bbs++; n_p_bbs += bb->count; if (EDGE_COUNT (bb->succs) > 1) { n_conditions++; n_p_conditions += bb->count; } for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi)) { n_stmts++; n_p_stmts += bb->count; } if (loop->header == bb && loop_in_sese_p (loop, SCOP_REGION (scop))) { n_loops++; n_p_loops += bb->count; } } fprintf (file, "\nSCoP statistics ("); fprintf (file, "BBS:%ld, ", n_bbs); fprintf (file, "LOOPS:%ld, ", n_loops); fprintf (file, "CONDITIONS:%ld, ", n_conditions); fprintf (file, "STMTS:%ld)\n", n_stmts); fprintf (file, "\nSCoP profiling statistics ("); fprintf (file, "BBS:%ld, ", n_p_bbs); fprintf (file, "LOOPS:%ld, ", n_p_loops); fprintf (file, "CONDITIONS:%ld, ", n_p_conditions); fprintf (file, "STMTS:%ld)\n", n_p_stmts); }
static void sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb, tree use) { unsigned ver; basic_block def_bb; if (TREE_CODE (use) != SSA_NAME) return; ver = SSA_NAME_VERSION (use); def_bb = gimple_bb (SSA_NAME_DEF_STMT (use)); if (!def_bb || !bb_in_sese_p (def_bb, region) || bb_in_sese_p (bb, region)) return; bitmap_set_bit (liveouts, ver); }
static void dot_all_scops_1 (FILE *file, vec<scop_p> scops) { basic_block bb; edge e; edge_iterator ei; scop_p scop; const char *color; int i; /* Disable debugging while printing graph. */ int tmp_dump_flags = dump_flags; dump_flags = 0; fprintf (file, "digraph all {\n"); FOR_ALL_BB_FN (bb, cfun) { int part_of_scop = false; /* Use HTML for every bb label. So we are able to print bbs which are part of two different SCoPs, with two different background colors. */ fprintf (file, "%d [label=<\n <TABLE BORDER=\"0\" CELLBORDER=\"1\" ", bb->index); fprintf (file, "CELLSPACING=\"0\">\n"); /* Select color for SCoP. */ FOR_EACH_VEC_ELT (scops, i, scop) { sese_l region = scop->scop_info->region; if (bb_in_sese_p (bb, region) || (region.exit->dest == bb) || (region.entry->dest == bb)) { switch (i % 17) { case 0: /* red */ color = "#e41a1c"; break; case 1: /* blue */ color = "#377eb8"; break; case 2: /* green */ color = "#4daf4a"; break; case 3: /* purple */ color = "#984ea3"; break; case 4: /* orange */ color = "#ff7f00"; break; case 5: /* yellow */ color = "#ffff33"; break; case 6: /* brown */ color = "#a65628"; break; case 7: /* rose */ color = "#f781bf"; break; case 8: color = "#8dd3c7"; break; case 9: color = "#ffffb3"; break; case 10: color = "#bebada"; break; case 11: color = "#fb8072"; break; case 12: color = "#80b1d3"; break; case 13: color = "#fdb462"; break; case 14: color = "#b3de69"; break; case 15: color = "#fccde5"; break; case 16: color = "#bc80bd"; break; default: /* gray */ color = "#999999"; } fprintf (file, " <TR><TD WIDTH=\"50\" BGCOLOR=\"%s\">", color); if (!bb_in_sese_p (bb, region)) fprintf (file, " ("); if (bb == region.entry->dest && bb == region.exit->dest) fprintf (file, " %d*# ", bb->index); else if (bb == region.entry->dest) fprintf (file, " %d* ", bb->index); else if (bb == region.exit->dest) fprintf (file, " %d# ", bb->index); else fprintf (file, " %d ", bb->index); fprintf (file, "{lp_%d}", bb->loop_father->num); if (!bb_in_sese_p (bb, region)) fprintf (file, ")"); fprintf (file, "</TD></TR>\n"); part_of_scop = true; } }