re PR tree-optimization/43434 (Missed vectorization: "not vectorized: data ref analys...
authorRichard Biener <rguenther@suse.de>
Mon, 18 Apr 2016 13:09:53 +0000 (13:09 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Apr 2016 13:09:53 +0000 (13:09 +0000)
2016-04-18  Richard Biener  <rguenther@suse.de>

PR tree-optimization/43434
* tree-ssa-structalias.c (struct vls_data): New.
(visit_loadstore): Handle all pointer-based accesses.
(compute_dependence_clique): Compute a bitmap of restrict tags
assigned bases and pass it to visit_loadstore.

* gcc.dg/vect/pr43434.c: New testcase.
* c-c++-common/goacc/kernels-alias-3.c: Adjust.
* c-c++-common/goacc/kernels-alias-4.c: Likewise.
* c-c++-common/goacc/kernels-alias-5.c: Likewise.
* c-c++-common/goacc/kernels-alias-6.c: Likewise.
* c-c++-common/goacc/kernels-alias-7.c: Likewise.
* c-c++-common/goacc/kernels-alias-8.c: Likewise.
* gcc.dg/gomp/pr68640.c: Likewise.
* gfortran.dg/goacc/kernels-alias-3.f95: Likewise.
* gfortran.dg/goacc/kernels-alias-4.f95: Likewise.

From-SVN: r235147

13 files changed:
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c
gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c
gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c
gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c
gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c
gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c
gcc/testsuite/gcc.dg/gomp/pr68640.c
gcc/testsuite/gcc.dg/vect/pr43434.c [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f95
gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95
gcc/tree-ssa-structalias.c

index 0f1933e..19c40f7 100644 (file)
@@ -1,3 +1,11 @@
+2016-04-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/43434
+       * tree-ssa-structalias.c (struct vls_data): New.
+       (visit_loadstore): Handle all pointer-based accesses.
+       (compute_dependence_clique): Compute a bitmap of restrict tags
+       assigned bases and pass it to visit_loadstore.
+
 2016-04-18  Matthew Wahab  <matthew.wahab@arm.com>
 
        PR target/70711
index 32dc4cd..a9b4658 100644 (file)
@@ -1,5 +1,19 @@
 2016-04-18  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/43434
+       * gcc.dg/vect/pr43434.c: New testcase.
+       * c-c++-common/goacc/kernels-alias-3.c: Adjust.
+       * c-c++-common/goacc/kernels-alias-4.c: Likewise.
+       * c-c++-common/goacc/kernels-alias-5.c: Likewise.
+       * c-c++-common/goacc/kernels-alias-6.c: Likewise.
+       * c-c++-common/goacc/kernels-alias-7.c: Likewise.
+       * c-c++-common/goacc/kernels-alias-8.c: Likewise.
+       * gcc.dg/gomp/pr68640.c: Likewise.
+       * gfortran.dg/goacc/kernels-alias-3.f95: Likewise.
+       * gfortran.dg/goacc/kernels-alias-4.f95: Likewise.
+
+2016-04-18  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/70701
        * gcc.dg/tree-ssa/ssa-fre-53.c: New testcase.
 
index 0eda7e1..6989c1c 100644 (file)
@@ -14,7 +14,8 @@ foo (void)
   }
 }
 
-/* Only the omp_data_i related loads should be annotated with cliques.  */
+/* Only the omp_data_i related loads should be annotated with
+   non-base 0 cliques.  */
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 3 "ealias" } } */
 
index 037901f..d41802c 100644 (file)
@@ -16,7 +16,8 @@ foo (void)
   }
 }
 
-/* Only the omp_data_i related loads should be annotated with cliques.  */
+/* Only the omp_data_i related loads should be annotated with
+   non-base 0 cliques.  */
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 3 "ealias" } } */
 
index 69cd3fb..6fefe18 100644 (file)
@@ -15,5 +15,5 @@ foo (int *a)
 
 /* Only the omp_data_i related loads should be annotated with cliques.  */
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 4 "ealias" } } */
 
index 6ebce15..908e1ca 100644 (file)
@@ -19,5 +19,5 @@ foo (void)
 
 /* Only the omp_data_i related loads should be annotated with cliques.  */
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 3 "ealias" } } */
 
index 40eb235..923d002 100644 (file)
@@ -21,5 +21,5 @@ foo (void)
 
 /* Only the omp_data_i related loads should be annotated with cliques.  */
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 3 "ealias" } } */
 
index 0b93e35..3b91acd 100644 (file)
@@ -18,5 +18,5 @@ foo (int *a, size_t n)
 
 /* Only the omp_data_i related loads should be annotated with cliques.  */
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 3 "ealias" } } */
 
index f333db0..d2b1b47 100644 (file)
@@ -13,4 +13,4 @@ foo (int *__restrict__ ap)
 }
 
 /* { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } } */
-/* { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } } */
+/* { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 2 "ealias" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/pr43434.c b/gcc/testsuite/gcc.dg/vect/pr43434.c
new file mode 100644 (file)
index 0000000..caa63aa
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+typedef short DCTELEM;
+typedef unsigned char uint8_t;
+
+void diff_pixels_c(DCTELEM *__restrict__ block, const uint8_t *s1,
+                  const uint8_t *s2, int stride)
+{
+  int i;
+
+  for(i=0;i<8;i++)
+    {
+      block[0] = s1[0] - s2[0];
+      block[1] = s1[1] - s2[1];
+      block[2] = s1[2] - s2[2];
+      block[3] = s1[3] - s2[3];
+      block[4] = s1[4] - s2[4];
+      block[5] = s1[5] - s2[5];
+      block[6] = s1[6] - s2[6];
+      block[7] = s1[7] - s2[7];
+      s1 += stride;
+      s2 += stride;
+      block += 8;
+    }
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target { vect_int && { vect_unpack && vect_hw_misalign } } } } } */
index 56f3d59..07dc8d6 100644 (file)
@@ -16,4 +16,4 @@ end program main
 
 ! Only the omp_data_i related loads should be annotated with cliques.
 ! { dg-final { scan-tree-dump-times "clique 1 base 1" 2 "ealias" } }
-! { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } }
+! { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 3 "ealias" } }
index e65253b..36f7f65 100644 (file)
@@ -17,4 +17,4 @@ end program main
 
 ! Only the omp_data_i related loads should be annotated with cliques.
 ! { dg-final { scan-tree-dump-times "clique 1 base 1" 3 "ealias" } }
-! { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 3 "ealias" } }
+! { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 4 "ealias" } }
index e88869f..3fdde84 100644 (file)
@@ -7182,13 +7182,20 @@ delete_points_to_sets (void)
   obstack_free (&final_solutions_obstack, NULL);
 }
 
+struct vls_data
+{
+  unsigned short clique;
+  bitmap rvars;
+};
+
 /* Mark "other" loads and stores as belonging to CLIQUE and with
    base zero.  */
 
 static bool
-visit_loadstore (gimple *, tree base, tree ref, void *clique_)
+visit_loadstore (gimple *, tree base, tree ref, void *data)
 {
-  unsigned short clique = (uintptr_t)clique_;
+  unsigned short clique = ((vls_data *) data)->clique;
+  bitmap rvars = ((vls_data *) data)->rvars;
   if (TREE_CODE (base) == MEM_REF
       || TREE_CODE (base) == TARGET_MEM_REF)
     {
@@ -7196,12 +7203,16 @@ visit_loadstore (gimple *, tree base, tree ref, void *clique_)
       if (TREE_CODE (ptr) == SSA_NAME
          && ! SSA_NAME_IS_DEFAULT_DEF (ptr))
        {
-         /* ???  We need to make sure 'ptr' doesn't include any of
+         /* We need to make sure 'ptr' doesn't include any of
             the restrict tags we added bases for in its points-to set.  */
-         return false;
-       }
+         varinfo_t vi = lookup_vi_for_tree (ptr);
+         if (! vi)
+           return false;
 
-      /* For now let decls through.  */
+         vi = get_varinfo (find (vi->id));
+         if (bitmap_intersect_p (rvars, vi->solution))
+           return false;
+       }
 
       /* Do not overwrite existing cliques (that includes clique, base
          pairs we just set).  */
@@ -7275,6 +7286,7 @@ compute_dependence_clique (void)
 {
   unsigned short clique = 0;
   unsigned short last_ruid = 0;
+  bitmap rvars = BITMAP_ALLOC (NULL);
   for (unsigned i = 0; i < num_ssa_names; ++i)
     {
       tree ptr = ssa_name (i);
@@ -7330,38 +7342,46 @@ compute_dependence_clique (void)
          /* Now look at possible dereferences of ptr.  */
          imm_use_iterator ui;
          gimple *use_stmt;
+         bool used = false;
          FOR_EACH_IMM_USE_STMT (use_stmt, ui, ptr)
            {
              /* ???  Calls and asms.  */
              if (!gimple_assign_single_p (use_stmt))
                continue;
-             maybe_set_dependence_info (gimple_assign_lhs (use_stmt), ptr,
-                                        clique, restrict_var, last_ruid);
-             maybe_set_dependence_info (gimple_assign_rhs1 (use_stmt), ptr,
-                                        clique, restrict_var, last_ruid);
+             used |= maybe_set_dependence_info (gimple_assign_lhs (use_stmt),
+                                                ptr, clique, restrict_var,
+                                                last_ruid);
+             used |= maybe_set_dependence_info (gimple_assign_rhs1 (use_stmt),
+                                                ptr, clique, restrict_var,
+                                                last_ruid);
            }
+         if (used)
+           bitmap_set_bit (rvars, restrict_var->id);
        }
     }
 
-  if (clique == 0)
-    return;
+  if (clique != 0)
+    {
+      /* Assign the BASE id zero to all accesses not based on a restrict
+        pointer.  That way they get disambiguated against restrict
+        accesses but not against each other.  */
+      /* ???  For restricts derived from globals (thus not incoming
+        parameters) we can't restrict scoping properly thus the following
+        is too aggressive there.  For now we have excluded those globals from
+        getting into the MR_DEPENDENCE machinery.  */
+      vls_data data = { clique, rvars };
+      basic_block bb;
+      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, &data,
+                                     visit_loadstore, visit_loadstore);
+         }
+    }
 
-  /* Assign the BASE id zero to all accesses not based on a restrict
-     pointer.  That way they get disabiguated against restrict
-     accesses but not against each other.  */
-  /* ???  For restricts derived from globals (thus not incoming
-     parameters) we can't restrict scoping properly thus the following
-     is too aggressive there.  For now we have excluded those globals from
-     getting into the MR_DEPENDENCE machinery.  */
-  basic_block bb;
-  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)clique,
-                                 visit_loadstore, visit_loadstore);
-      }
+  BITMAP_FREE (rvars);
 }
 
 /* Compute points-to information for every SSA_NAME pointer in the