diff mbox series

[GRAPHITE] Fix PR68823

Message ID alpine.LSU.2.20.1709150856240.26836@zhemvz.fhfr.qr
State New
Headers show
Series [GRAPHITE] Fix PR68823 | expand

Commit Message

Richard Biener Sept. 15, 2017, 7:01 a.m. UTC
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  <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.
diff mbox series

Patch

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.  */