diff options
author | Richard Biener <rguenther@suse.de> | 2017-09-15 07:03:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-09-15 07:03:02 +0000 |
commit | b6ab6ef81c11e2353f7ef7b771e4aca774f1be68 (patch) | |
tree | 9e2b8734f0c5eb99451354e6773cf50410049d68 /gcc/graphite-scop-detection.c | |
parent | 29d326425c0ac7b5cbacf7621c7ffbffc3b33ade (diff) |
re PR tree-optimization/68823 ([graphite] tramp3d-v4 compiled with -floop-nest-optimize crashes)
2017-09-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/68823
* graphite-scop-detection.c (build_alias_set): If we have a
possible dependence check whether we can handle them by just
looking at the DRs DR_ACCESS_FNs.
(build_scops): If build_alias_set fails, fail the SCOP.
From-SVN: r252780
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r-- | gcc/graphite-scop-detection.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index e17d58a26fc..bc66dfdac12 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -1855,7 +1855,7 @@ try_generate_gimple_bb (scop_p scop, basic_block bb) /* Compute alias-sets for all data references in DRS. */ -static void +static bool build_alias_set (scop_p scop) { int num_vertices = scop->drs.length (); @@ -1868,6 +1868,18 @@ build_alias_set (scop_p scop) for (j = i+1; scop->drs.iterate (j, &dr2); j++) if (dr_may_alias_p (dr1->dr, dr2->dr, true)) { + /* Dependences in the same alias set need to be handled + by just looking at DR_ACCESS_FNs. */ + if (DR_NUM_DIMENSIONS (dr1->dr) != DR_NUM_DIMENSIONS (dr2->dr) + || ! operand_equal_p (DR_BASE_OBJECT (dr1->dr), + DR_BASE_OBJECT (dr2->dr), + OEP_ADDRESS_OF) + || ! types_compatible_p (TREE_TYPE (DR_BASE_OBJECT (dr1->dr)), + TREE_TYPE (DR_BASE_OBJECT (dr2->dr)))) + { + free_graph (g); + return false; + } add_edge (g, i, j); add_edge (g, j, i); } @@ -1883,6 +1895,7 @@ build_alias_set (scop_p scop) scop->drs[i].alias_set = g->vertices[i].component + 1; free_graph (g); + return true; } /* Gather BBs and conditions for a SCOP. */ @@ -2075,7 +2088,12 @@ build_scops (vec<scop_p> *scops) scop->pbbs.qsort (cmp_pbbs); order.release (); - build_alias_set (scop); + if (! build_alias_set (scop)) + { + DEBUG_PRINT (dp << "[scop-detection-fail] cannot handle dependences\n"); + free_scop (scop); + continue; + } /* Do not optimize a scop containing only PBBs that do not belong to any loops. */ |