]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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 0f1933edf44186ce271a5f5179bba321075d2ca6..19c40f7a4bbc3638c4e1cac27d8458eade51ebfd 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 32dc4cdc1db3b93498c6fff1e198b11c6aa760aa..a9b46586c42129b2eb54c68d0bf1b6581a6f453a 100644 (file)
@@ -1,3 +1,17 @@
+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
index 0eda7e17c3b9c65239bd727965ebc4f69c76e709..6989c1c1b6d1ac79afb967158848512d9a515b36 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 037901fcffb3d2c53522aaaf8db30b3708de2545..d41802c00db76e43c90d98748f3de903a82cc662 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 69cd3fb94491c91001c4d04dfd3d20b063a9edad..6fefe183203687d31bce5ec8acb93bb0f2ff19dd 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 6ebce15f5e2e17e906261bbddf55f620b2a8ead2..908e1cafd71915bf300b593492950577213b6f75 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 40eb235d6019be7b6437024ffc2c1a29d6e18601..923d00239a2abf7322a91ccbeb709a26efabfec7 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 0b93e35909b79db95ebfab778ff551b0c64b1b31..3b91acd27f57d419d2d017eeeaa7fa27f6809414 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 f333db0923a40f317853289b24487bbbc8ed85dc..d2b1b472140a1064dcc58396d9bed3cb7d30d1fe 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 56f3d598d667b522012529d3158df2c55d142989..07dc8d6c641973af7fb9aa011a3b186f93e49ce8 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 e65253b1844851aa6a6d69f756c907621a02ddb7..36f7f65fbacee0804604dfe387fab757136127e5 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 e88869f0b4318247dd7ecf567aa07d74dcf28208..3fdde846d0dabc88aebbbe0f00c0815aa918acf2 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