aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-04-18 13:09:53 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-04-18 13:09:53 +0000
commit8270b82dd6523937110a2488194d8692a09299f5 (patch)
tree35411861d0db9d20d53a3e9bc3c8a371c01a86ec /gcc
parentbe0355585f0b4ce41cf72300f3a30008a0b4ff3d (diff)
downloadgcc-8270b82dd6523937110a2488194d8692a09299f5.zip
gcc-8270b82dd6523937110a2488194d8692a09299f5.tar.gz
gcc-8270b82dd6523937110a2488194d8692a09299f5.tar.bz2
re PR tree-optimization/43434 (Missed vectorization: "not vectorized: data ref analysis": pointer incremented by a parameter)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog14
-rw-r--r--gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c5
-rw-r--r--gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c5
-rw-r--r--gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c2
-rw-r--r--gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c2
-rw-r--r--gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c2
-rw-r--r--gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c2
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr68640.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr43434.c27
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f952
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f952
-rw-r--r--gcc/tree-ssa-structalias.c76
13 files changed, 110 insertions, 39 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0f1933e..19c40f7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 32dc4cd..a9b4658 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c
index 0eda7e1..6989c1c 100644
--- a/gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c
@@ -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" } } */
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c
index 037901f..d41802c 100644
--- a/gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c
@@ -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" } } */
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c
index 69cd3fb..6fefe18 100644
--- a/gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c
@@ -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" } } */
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c
index 6ebce15..908e1ca 100644
--- a/gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c
@@ -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" } } */
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c
index 40eb235..923d002 100644
--- a/gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c
@@ -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" } } */
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c
index 0b93e35..3b91acd 100644
--- a/gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c
+++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/pr68640.c b/gcc/testsuite/gcc.dg/gomp/pr68640.c
index f333db0..d2b1b47 100644
--- a/gcc/testsuite/gcc.dg/gomp/pr68640.c
+++ b/gcc/testsuite/gcc.dg/gomp/pr68640.c
@@ -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
index 0000000..caa63aa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr43434.c
@@ -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 } } } } } */
diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f95
index 56f3d59..07dc8d6 100644
--- a/gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f95
@@ -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" } }
diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95
index e65253b..36f7f65 100644
--- a/gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95
@@ -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" } }
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index e88869f..3fdde84 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -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