re PR tree-optimization/68823 ([graphite] tramp3d-v4 compiled with -floop-nest-optimi...
authorRichard Biener <rguenther@suse.de>
Fri, 15 Sep 2017 07:03:02 +0000 (07:03 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 15 Sep 2017 07:03:02 +0000 (07:03 +0000)
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

gcc/ChangeLog
gcc/graphite-scop-detection.c

index 861616b..4ff9f79 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2017-09-14  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000-builtin.def (BU_FLOAT128_1_HW): New macros
index e17d58a..bc66dfd 100644 (file)
@@ -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.  */