a scalar depending on vdefs in the current region is not invariant
authorAditya Kumar <aditya.k7@samsung.com>
Wed, 21 Oct 2015 21:18:27 +0000 (21:18 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Wed, 21 Oct 2015 21:18:27 +0000 (21:18 +0000)
When a scalar is defined in function of an array reference in the current scop,
it does variate.  Graphite cannot represent the condition in scop-11.c, as a[*]
variates in the current region, and it is not an affine condition:

  for (j = 0; j <= 20; j++)
    a[j] = b + i;

  if (a[12] == 23)
    b = 3;
  else
    b = 1;

  for (j = 0; j <= 20; j++)
    a[j] = b + i;

* graphite-scop-detection.c (parameter_index_in_region): Update call to
invariant_in_sese_p_rec.
* graphite-sese-to-poly.c (extract_affine): Same.
* sese.c (invariant_in_sese_p_rec): Pass in an extra parameter has_vdefs.
(scalar_evolution_in_region): Return chrec_dont_know when the scalar variable
depends on virtual definitions in the current region.
* sese.h (invariant_in_sese_p_rec): Update declaration.

testsuite/
* gcc.dg/graphite/scop-11.c: Update pattern.

Co-Authored-By: Sebastian Pop <s.pop@samsung.com>
From-SVN: r229151

gcc/ChangeLog
gcc/graphite-scop-detection.c
gcc/graphite-sese-to-poly.c
gcc/sese.c
gcc/sese.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/graphite/scop-11.c

index 2c5af316d9e315cf26b43333ec8be661f39d520f..c49cd6fd448207fa4da702811f74a570f97660c2 100644 (file)
@@ -1,3 +1,14 @@
+2015-10-21  Aditya Kumar  <aditya.k7@samsung.com>
+           Sebastian Pop  <s.pop@samsung.com>
+
+       * graphite-scop-detection.c (parameter_index_in_region): Update call to
+       invariant_in_sese_p_rec.
+       * graphite-sese-to-poly.c (extract_affine): Same.
+       * sese.c (invariant_in_sese_p_rec): Pass in an extra parameter has_vdefs.
+       (scalar_evolution_in_region): Return chrec_dont_know when the scalar variable
+       depends on virtual definitions in the current region.
+       * sese.h (invariant_in_sese_p_rec): Update declaration.
+
 2015-10-21  Aditya Kumar  <aditya.k7@samsung.com>
            Sebastian Pop  <s.pop@samsung.com>
 
index 08c7b3abd83eeabc177b3cd6a520a970d3108941..a95ec576d425969d825ec834d9c12e45cdfdbe87 100644 (file)
@@ -1521,7 +1521,7 @@ parameter_index_in_region (tree name, sese_info_p region)
   if (TREE_CODE (TREE_TYPE (name)) != INTEGER_TYPE)
     return -1;
 
-  if (!invariant_in_sese_p_rec (name, region->region))
+  if (!invariant_in_sese_p_rec (name, region->region, NULL))
     return -1;
 
   i = parameter_index_in_region_1 (name, region);
index d1eae9036ecdc35f975e7b694a1784307c610880..c06d9debf555e8c2a67d4dd7d516b0b143943058 100644 (file)
@@ -540,7 +540,7 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space)
 
     case SSA_NAME:
       gcc_assert (-1 != parameter_index_in_region_1 (e, s->scop_info)
-                 || !invariant_in_sese_p_rec (e, s->scop_info->region));
+                 || !invariant_in_sese_p_rec (e, s->scop_info->region, NULL));
       res = extract_affine_name (s, e, space);
       break;
 
index aa19c6873ed7ea801e9bd2e750ace5209d76d243..797dea5f35e8fb4f7958aed5cc0cc038ab1e102d 100644 (file)
@@ -787,10 +787,11 @@ set_ifsese_condition (ifsese if_region, tree condition)
 }
 
 /* Return true when T is defined outside REGION or when no definitions are
-   variant in REGION.  */
+   variant in REGION.  When HAS_VDEFS is a valid pointer, sets HAS_VDEFS to true
+   when T depends on memory that may change in REGION.  */
 
 bool
-invariant_in_sese_p_rec (tree t, sese_l &region)
+invariant_in_sese_p_rec (tree t, sese_l &region, bool *has_vdefs)
 {
   ssa_op_iter iter;
   use_operand_p use_p;
@@ -805,11 +806,15 @@ invariant_in_sese_p_rec (tree t, sese_l &region)
 
   /* VDEF is variant when it is in the region.  */
   if (gimple_vdef (stmt))
-    return false;
+    {
+      if (has_vdefs)
+       *has_vdefs = true;
+      return false;
+    }
 
   /* A VUSE may or may not be variant following the VDEFs.  */
   if (tree vuse = gimple_vuse (stmt))
-    return invariant_in_sese_p_rec (vuse, region);
+    return invariant_in_sese_p_rec (vuse, region, has_vdefs);
 
   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
     {
@@ -818,7 +823,7 @@ invariant_in_sese_p_rec (tree t, sese_l &region)
       if (!defined_in_sese_p (use, region))
        continue;
 
-      if (!invariant_in_sese_p_rec (use, region))
+      if (!invariant_in_sese_p_rec (use, region, has_vdefs))
        return false;
     }
 
@@ -856,8 +861,13 @@ scalar_evolution_in_region (sese_l &region, loop_p loop, tree t)
       return t;
     }
 
-  if (invariant_in_sese_p_rec (t, region))
+  bool has_vdefs = false;
+  if (invariant_in_sese_p_rec (t, region, &has_vdefs))
     return t;
 
+  /* T variates in REGION.  */
+  if (has_vdefs)
+    return chrec_dont_know;
+
   return instantiate_scev (before, loop, t);
 }
index 6b6b904495cd08bd6b6b5bd09a343e2d70055320..d2ad9bde04b88145f5a329c0bd79f2d3d87cbfce 100644 (file)
@@ -84,7 +84,7 @@ extern edge copy_bb_and_scalar_dependences (basic_block, sese_info_p, edge,
                                            vec<tree> , bool *);
 extern struct loop *outermost_loop_in_sese (sese_l &, basic_block);
 extern tree scalar_evolution_in_region (sese_l &, loop_p, tree);
-extern bool invariant_in_sese_p_rec (tree, sese_l &);
+extern bool invariant_in_sese_p_rec (tree, sese_l &, bool *);
 
 /* Check that SESE contains LOOP.  */
 
index d2a7da62e8ca598e59dd0eb1d131cacae0ca4c80..cda024d8b27213f521efef2390493fceca266536 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-21  Aditya Kumar  <aditya.k7@samsung.com>
+           Sebastian Pop  <s.pop@samsung.com>
+
+       * gcc.dg/graphite/scop-11.c: Update pattern.
+
 2015-10-11  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/67056
index 801e54f996151fb52667e4668a0f102debc0c8fb..6362003bc308ab75e68f9d39a85e0b59b56cfc2e 100644 (file)
@@ -19,4 +19,4 @@ int toto (int i, int b)
   return a[b];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 0" 1 "graphite"} } */