Commit 2b8775f3 by Ira Rosen Committed by Ira Rosen

re PR tree-optimization/36098 (435.gromacs miscompares at -O3)

	PR tree-optimization/36098
	* tree-vect-analyze.c (vect_analyze_group_access): Set the gap
	value for the first load in the group in case of a gap.
	(vect_build_slp_tree): Check that there are no gaps in loads.

From-SVN: r135290
parent d70dcf29
2008-05-14 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/36098
* tree-vect-analyze.c (vect_analyze_group_access): Set the gap
value for the first load in the group in case of a gap.
(vect_build_slp_tree): Check that there are no gaps in loads.
2008-05-14 Kenneth Zadeck <zadeck@naturalbridge.com> 2008-05-14 Kenneth Zadeck <zadeck@naturalbridge.com>
* doc/rtl.texi: Removed reference to REG_NO_CONFLICT notes. * doc/rtl.texi: Removed reference to REG_NO_CONFLICT notes.
......
2008-05-14 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/36098
* gcc.dg/vect/vect.exp: Compile with -O3 all the tests named "O3-*".
* gcc.dg/vect/O3-pr36098.c: New test.
2008-05-14 Samuel Tardieu <sam@rfc1149.net> 2008-05-14 Samuel Tardieu <sam@rfc1149.net>
* gnat.dg/old_errors.ads, gnat.dg/old_errors.adb: New. * gnat.dg/old_errors.ads, gnat.dg/old_errors.adb: New.
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
typedef struct {
int iatom[3];
int blocknr;
} t_sortblock;
#define DIM 3
void foo (int ncons, t_sortblock *sb, int *iatom)
{
int i, m;
for(i=0; (i<ncons); i++,iatom+=3)
for(m=0; (m<DIM); m++)
iatom[m]=sb[i].iatom[m];
}
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
...@@ -245,7 +245,7 @@ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/Os-vect-*.\[cS\]]] \ ...@@ -245,7 +245,7 @@ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/Os-vect-*.\[cS\]]] \
# With -O3 # With -O3
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-O3" lappend DEFAULT_VECTCFLAGS "-O3"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/O3-vect-*.\[cS\]]] \ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/O3-*.\[cS\]]] \
"" $DEFAULT_VECTCFLAGS "" $DEFAULT_VECTCFLAGS
# With -O1 # With -O1
......
...@@ -2230,7 +2230,13 @@ vect_analyze_group_access (struct data_reference *dr) ...@@ -2230,7 +2230,13 @@ vect_analyze_group_access (struct data_reference *dr)
if (dr_step != count_in_bytes) if (dr_step != count_in_bytes)
{ {
if (DR_IS_READ (dr)) if (DR_IS_READ (dr))
slp_impossible = true; {
slp_impossible = true;
/* There is a gap after the last load in the group. This gap is a
difference between the stride and the number of elements. When
there is no gap, this difference should be 0. */
DR_GROUP_GAP (vinfo_for_stmt (stmt)) = stride - count;
}
else else
{ {
if (vect_print_dump_info (REPORT_DETAILS)) if (vect_print_dump_info (REPORT_DETAILS))
...@@ -2644,7 +2650,7 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node, ...@@ -2644,7 +2650,7 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node,
enum machine_mode vec_mode; enum machine_mode vec_mode;
tree first_stmt_const_oprnd = NULL_TREE; tree first_stmt_const_oprnd = NULL_TREE;
struct data_reference *first_dr; struct data_reference *first_dr;
/* For every stmt in NODE find its def stmt/s. */ /* For every stmt in NODE find its def stmt/s. */
for (i = 0; VEC_iterate (tree, stmts, i, stmt); i++) for (i = 0; VEC_iterate (tree, stmts, i, stmt); i++)
{ {
...@@ -2776,15 +2782,17 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node, ...@@ -2776,15 +2782,17 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node,
if (i == 0) if (i == 0)
{ {
/* First stmt of the SLP group should be the first load of /* First stmt of the SLP group should be the first load of
the interleaving loop if data permutation is not the interleaving loop if data permutation is not allowed.
allowed. */ Check that there is no gap between the loads. */
if (DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt)) != stmt) if (DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt)) != stmt
|| DR_GROUP_GAP (vinfo_for_stmt (stmt)) != 0)
{ {
/* FORNOW: data permutations are not supported. */ /* FORNOW: data permutations and gaps in loads are not
supported. */
if (vect_print_dump_info (REPORT_SLP)) if (vect_print_dump_info (REPORT_SLP))
{ {
fprintf (vect_dump, "Build SLP failed: strided " fprintf (vect_dump, "Build SLP failed: strided "
" loads need permutation "); " loads need permutation or have gaps ");
print_generic_expr (vect_dump, stmt, TDF_SLIM); print_generic_expr (vect_dump, stmt, TDF_SLIM);
} }
...@@ -2811,13 +2819,17 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node, ...@@ -2811,13 +2819,17 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node,
} }
else else
{ {
if (DR_GROUP_NEXT_DR (vinfo_for_stmt (prev_stmt)) != stmt) /* Check that we have consecutive loads from interleaving
chain and that there is no gap between the loads. */
if (DR_GROUP_NEXT_DR (vinfo_for_stmt (prev_stmt)) != stmt
|| DR_GROUP_GAP (vinfo_for_stmt (stmt)) != 1)
{ {
/* FORNOW: data permutations are not supported. */ /* FORNOW: data permutations and gaps in loads are not
supported. */
if (vect_print_dump_info (REPORT_SLP)) if (vect_print_dump_info (REPORT_SLP))
{ {
fprintf (vect_dump, "Build SLP failed: strided " fprintf (vect_dump, "Build SLP failed: strided "
" loads need permutation "); " loads need permutation or have gaps ");
print_generic_expr (vect_dump, stmt, TDF_SLIM); print_generic_expr (vect_dump, stmt, TDF_SLIM);
} }
return false; return false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment