diff options
author | Richard Biener <rguenther@suse.de> | 2016-04-18 13:09:53 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-04-18 13:09:53 +0000 |
commit | 8270b82dd6523937110a2488194d8692a09299f5 (patch) | |
tree | 35411861d0db9d20d53a3e9bc3c8a371c01a86ec /gcc | |
parent | be0355585f0b4ce41cf72300f3a30008a0b4ff3d (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/kernels-alias-3.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/kernels-alias-4.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/kernels-alias-5.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/kernels-alias-6.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/kernels-alias-7.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/kernels-alias-8.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/pr68640.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr43434.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/goacc/kernels-alias-3.f95 | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95 | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 76 |
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 |