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
This commit is contained in:
Richard Biener 2016-04-18 13:09:53 +00:00 committed by Richard Biener
parent be0355585f
commit 8270b82dd6
13 changed files with 110 additions and 39 deletions

View 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

View 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

View 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" } } */

View 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" } } */

View 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" } } */

View 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" } } */

View 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" } } */

View 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" } } */

View 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" } } */

View File

@ -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 } } } } } */

View 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" } }

View 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" } }

View 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