re PR tree-optimization/87609 (miscompilation with restrict and loop)
authorRichard Biener <rguenther@suse.de>
Fri, 22 Feb 2019 08:36:30 +0000 (08:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 22 Feb 2019 08:36:30 +0000 (08:36 +0000)
2019-02-22  Richard Biener  <rguenther@suse.de>

PR tree-optimization/87609
* tree-core.h (tree_base): Document special clique values.
* tree-inline.c (remap_dependence_clique): Do not use the
special clique value of one.
(maybe_set_dependence_info): Use clique one.
(clear_dependence_clique): New callback.
(compute_dependence_clique): Clear clique one from all refs
before assigning it (again).

From-SVN: r269097

gcc/ChangeLog
gcc/tree-core.h
gcc/tree-inline.c
gcc/tree-ssa-structalias.c

index c8cecb35de073380d5995cfad1cbcbbbc1166da9..a35b0aa1a5197157b14521ccf2c74df7a0706e5e 100644 (file)
@@ -1,3 +1,14 @@
+2019-02-22  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87609
+       * tree-core.h (tree_base): Document special clique values.
+       * tree-inline.c (remap_dependence_clique): Do not use the
+       special clique value of one.
+       (maybe_set_dependence_info): Use clique one.
+       (clear_dependence_clique): New callback.
+       (compute_dependence_clique): Clear clique one from all refs
+       before assigning it (again).
+
 2019-02-21  Martin Sebor  <msebor@redhat.com>
 
        * doc/extend.texi (__clear_cache): Correct signature.
index 4541c955403870c3966b8131a96499d287ceb6a5..552196b1b4264b167dc87bd8f545002126f31da6 100644 (file)
@@ -1032,7 +1032,9 @@ struct GTY(()) tree_base {
        expression trees and specify known data non-dependences.  For
        two memory references in a function they are known to not
        alias if dependence_info.clique are equal and dependence_info.base
-       are distinct.  */
+       are distinct.  Clique number zero means there is no information,
+       clique number one is populated from function global information
+       and thus needs no remapping on transforms like loop unrolling.  */
     struct {
       unsigned short clique;
       unsigned short base;
index 98cfbe31b8299390566f82514183ea9868f32f0e..9017da878b147c6edb3c91cb176a32a8fc063b75 100644 (file)
@@ -911,7 +911,12 @@ remap_dependence_clique (copy_body_data *id, unsigned short clique)
   bool existed;
   unsigned short &newc = id->dependence_map->get_or_insert (clique, &existed);
   if (!existed)
-    newc = ++cfun->last_clique;
+    {
+      /* Clique 1 is reserved for local ones set by PTA.  */
+      if (cfun->last_clique == 0)
+       cfun->last_clique = 1;
+      newc = ++cfun->last_clique;
+    }
   return newc;
 }
 
index f930d87840c2e75de2f0b140ff01d7a0f504238d..15f0872a2af4375bac61ea95609ea3546338cf4f 100644 (file)
@@ -7495,7 +7495,11 @@ maybe_set_dependence_info (gimple *, tree base, tree, void *data)
       if (MR_DEPENDENCE_CLIQUE (base) == 0)
        {
          if (clique == 0)
-           clique = ++cfun->last_clique;
+           {
+             if (cfun->last_clique == 0)
+               cfun->last_clique = 1;
+             clique = 1;
+           }
          if (restrict_var->ruid == 0)
            restrict_var->ruid = ++last_ruid;
          MR_DEPENDENCE_CLIQUE (base) = clique;
@@ -7506,12 +7510,42 @@ maybe_set_dependence_info (gimple *, tree base, tree, void *data)
   return false;
 }
 
+/* Clear dependence info for the clique DATA.  */
+
+static bool
+clear_dependence_clique (gimple *, tree base, tree, void *data)
+{
+  unsigned short clique = (uintptr_t)data;
+  if ((TREE_CODE (base) == MEM_REF
+       || TREE_CODE (base) == TARGET_MEM_REF)
+      && MR_DEPENDENCE_CLIQUE (base) == clique)
+    {
+      MR_DEPENDENCE_CLIQUE (base) = 0;
+      MR_DEPENDENCE_BASE (base) = 0;
+    }
+
+  return false;
+}
+
 /* Compute the set of independend memory references based on restrict
    tags and their conservative propagation to the points-to sets.  */
 
 static void
 compute_dependence_clique (void)
 {
+  /* First clear the special "local" clique.  */
+  basic_block bb;
+  if (cfun->last_clique != 0)
+    FOR_EACH_BB_FN (bb, cfun)
+      for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
+          !gsi_end_p (gsi); gsi_next (&gsi))
+       {
+         gimple *stmt = gsi_stmt (gsi);
+         walk_stmt_load_store_ops (stmt, (void *)(uintptr_t) 1,
+                                   clear_dependence_clique,
+                                   clear_dependence_clique);
+       }
+
   unsigned short clique = 0;
   unsigned short last_ruid = 0;
   bitmap rvars = BITMAP_ALLOC (NULL);