From: Richard Biener Date: Fri, 9 Jun 2017 09:36:06 +0000 (+0000) Subject: re PR tree-optimization/79483 ([graphite] ICE: verify_ssa failed (error: definition... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6d1115c545d673a55f481425049ab263b58311eb;p=gcc.git re PR tree-optimization/79483 ([graphite] ICE: verify_ssa failed (error: definition in block 31 does not dominate use in block 28)) 2017-06-09 Richard Biener PR tree-optimization/79483 * graphite-scop-detection.c (order): New global. (get_order): Compute bb to order mapping that satisfies code generation constraints. (cmp_pbbs): New helper. (build_scops): Start domwalk at entry block, sort generated pbbs. * gcc.dg/graphite/pr79483.c: New testcase. From-SVN: r249052 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39902009ade..e40383303dc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-06-09 Richard Biener + + PR tree-optimization/79483 + * graphite-scop-detection.c (order): New global. + (get_order): Compute bb to order mapping that satisfies code + generation constraints. + (cmp_pbbs): New helper. + (build_scops): Start domwalk at entry block, sort generated + pbbs. + 2017-06-09 Richard Biener PR middle-end/81007 diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 2b7604e2e73..e17d58a26fc 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -1999,6 +1999,46 @@ gather_bbs::after_dom_children (basic_block bb) } } + +/* Compute sth like an execution order, dominator order with first executing + edges that stay inside the current loop, delaying processing exit edges. */ + +static vec order; + +static void +get_order (scop_p scop, basic_block bb, vec *order, unsigned *dfs_num) +{ + if (! bb_in_sese_p (bb, scop->scop_info->region)) + return; + + (*order)[bb->index] = (*dfs_num)++; + for (basic_block son = first_dom_son (CDI_DOMINATORS, bb); + son; + son = next_dom_son (CDI_DOMINATORS, son)) + if (flow_bb_inside_loop_p (bb->loop_father, son)) + get_order (scop, son, order, dfs_num); + for (basic_block son = first_dom_son (CDI_DOMINATORS, bb); + son; + son = next_dom_son (CDI_DOMINATORS, son)) + if (! flow_bb_inside_loop_p (bb->loop_father, son)) + get_order (scop, son, order, dfs_num); +} + +/* Helper for qsort, sorting after order above. */ + +static int +cmp_pbbs (const void *pa, const void *pb) +{ + poly_bb_p bb1 = *((const poly_bb_p *)pa); + poly_bb_p bb2 = *((const poly_bb_p *)pb); + if (order[bb1->black_box->bb->index] < order[bb2->black_box->bb->index]) + return -1; + else if (order[bb1->black_box->bb->index] > order[bb2->black_box->bb->index]) + return 1; + else + return 0; +} + /* Find Static Control Parts (SCoP) in the current function and pushes them to SCOPS. */ @@ -2022,7 +2062,18 @@ build_scops (vec *scops) scop_p scop = new_scop (s->entry, s->exit); /* Record all basic blocks and their conditions in REGION. */ - gather_bbs (CDI_DOMINATORS, scop).walk (cfun->cfg->x_entry_block_ptr); + gather_bbs (CDI_DOMINATORS, scop).walk (s->entry->dest); + + /* domwalk does not fulfil our code-generations constraints on the + order of pbb which is to produce sth like execution order, delaying + exection of loop exit edges. So compute such order and sort after + that. */ + order.create (last_basic_block_for_fn (cfun)); + order.quick_grow (last_basic_block_for_fn (cfun)); + unsigned dfs_num = 0; + get_order (scop, s->entry->dest, &order, &dfs_num); + scop->pbbs.qsort (cmp_pbbs); + order.release (); build_alias_set (scop); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c661a145128..967ca018d71 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-09 Richard Biener + + PR tree-optimization/79483 + * gcc.dg/graphite/pr79483.c: New testcase. + 2017-06-09 Richard Biener PR middle-end/81007 diff --git a/gcc/testsuite/gcc.dg/graphite/pr79483.c b/gcc/testsuite/gcc.dg/graphite/pr79483.c new file mode 100644 index 00000000000..097273fed71 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr79483.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fgraphite-identity" } */ + +int *a; +extern int b[]; +int c; +void d () +{ + double e[2][3] = {0.0, 0.0, 1.0}; + for (int f = 0; f < 2; ++f) + for (int g = 0; g < 6; ++g) + b[0] = a[g] * e[f][2]; + c = b[0]; +}