diff options
author | Ira Rosen <irar@il.ibm.com> | 2008-05-14 12:28:53 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2008-05-14 12:28:53 +0000 |
commit | 2b8775f335a64ac0c7a4d32b38ee50463862d6fb (patch) | |
tree | c7ff13c57cdad9e84c367b272fa1e312faad8a01 | |
parent | d70dcf2945e7e09446f3a03f1b12ced3543f9d33 (diff) | |
download | gcc-2b8775f335a64ac0c7a4d32b38ee50463862d6fb.zip gcc-2b8775f335a64ac0c7a4d32b38ee50463862d6fb.tar.gz gcc-2b8775f335a64ac0c7a4d32b38ee50463862d6fb.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/O3-pr36098.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect.exp | 2 | ||||
-rw-r--r-- | gcc/tree-vect-analyze.c | 32 |
5 files changed, 58 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 223fe39..9e151ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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> * doc/rtl.texi: Removed reference to REG_NO_CONFLICT notes. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05a2d25..bd147b4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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> * gnat.dg/old_errors.ads, gnat.dg/old_errors.adb: New. diff --git a/gcc/testsuite/gcc.dg/vect/O3-pr36098.c b/gcc/testsuite/gcc.dg/vect/O3-pr36098.c new file mode 100644 index 0000000..1c445be --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/O3-pr36098.c @@ -0,0 +1,22 @@ +/* { 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" } } */ + diff --git a/gcc/testsuite/gcc.dg/vect/vect.exp b/gcc/testsuite/gcc.dg/vect/vect.exp index 1887709..2fb14b1 100644 --- a/gcc/testsuite/gcc.dg/vect/vect.exp +++ b/gcc/testsuite/gcc.dg/vect/vect.exp @@ -245,7 +245,7 @@ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/Os-vect-*.\[cS\]]] \ # With -O3 set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS 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 # With -O1 diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c index 0ef7f9c..1e2012f 100644 --- a/gcc/tree-vect-analyze.c +++ b/gcc/tree-vect-analyze.c @@ -2230,7 +2230,13 @@ vect_analyze_group_access (struct data_reference *dr) if (dr_step != count_in_bytes) { 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 { if (vect_print_dump_info (REPORT_DETAILS)) @@ -2644,7 +2650,7 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node, enum machine_mode vec_mode; tree first_stmt_const_oprnd = NULL_TREE; struct data_reference *first_dr; - + /* For every stmt in NODE find its def stmt/s. */ 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, if (i == 0) { /* First stmt of the SLP group should be the first load of - the interleaving loop if data permutation is not - allowed. */ - if (DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt)) != stmt) + the interleaving loop if data permutation is not allowed. + Check that there is no gap between the loads. */ + 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)) { fprintf (vect_dump, "Build SLP failed: strided " - " loads need permutation "); + " loads need permutation or have gaps "); print_generic_expr (vect_dump, stmt, TDF_SLIM); } @@ -2811,13 +2819,17 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, slp_tree *node, } 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)) { fprintf (vect_dump, "Build SLP failed: strided " - " loads need permutation "); + " loads need permutation or have gaps "); print_generic_expr (vect_dump, stmt, TDF_SLIM); } return false; |