The following fixes dependence handling in GRAPHITE which currently
cannot cope with DRs that may alias but are not compatible so to be
handled solely by looking at their DR_ACCESS_FNs.  This includes
pointer vs. array accesses for example.

Bootstrapped and tested on x86_64-unknown-linux-gnu, approved by
Sebastian in the PR, applied to trunk.

Richard.

PS: we may eventually do better in build_alias_set by using
full dependence analysis rather than only dr_may_alias_p to
get at the recently added cases disambiguating component arrays.

PPS: I checked tramp3d now works but I don't have a self-contained
testcase, so no testcase.

2017-09-15  Richard Biener  <rguent...@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.

Index: gcc/graphite-scop-detection.c
===================================================================
--- gcc/graphite-scop-detection.c       (revision 252756)
+++ gcc/graphite-scop-detection.c       (working copy)
@@ -1855,7 +1857,7 @@ try_generate_gimple_bb (scop_p scop, bas
 
 /* 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 +1870,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 +1897,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 +2090,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.  */

Reply via email to