diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/vect/pr69882.f90 | 41 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 20 |
4 files changed, 67 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83c6a67..a352259 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-02-22 Richard Biener <rguenther@suse.de> + + PR tree-optimization/69882 + * tree-vect-slp.c (vect_attempt_slp_rearrange_stmts): Properly + preserve permutations present because of gaps. + (vect_supported_load_permutation_p): Always continue checking + permutations after vect_attempt_slp_rearrange_stmts. + 2016-02-22 Bin Cheng <bin.cheng@arm.com> * tree-vect-loop.c (vect_estimate_min_profitable_iters): Dump diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0b82dae..02a3b3e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-22 Richard Biener <rguenther@suse.de> + + PR tree-optimization/69882 + * gfortran.dg/vect/pr69882.f90: New testcase. + 2016-02-22 Jakub Jelinek <jakub@redhat.com> PR target/69885 diff --git a/gcc/testsuite/gfortran.dg/vect/pr69882.f90 b/gcc/testsuite/gfortran.dg/vect/pr69882.f90 new file mode 100644 index 0000000..f77e33f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/pr69882.f90 @@ -0,0 +1,41 @@ +! { dg-additional-options "-Ofast" } +! { dg-additional-options "-mavx" { target avx_runtime } } + +subroutine foo(a, x) + implicit none + + integer, parameter :: XX=4, YY=26 + integer, intent(in) :: x + real *8, intent(in) :: a(XX,YY) + real *8 :: c(XX) + + integer i, k + + c = 0 + + do k=x,YY + do i=1,2 + c(i) = max(c(i), a(i,k)) + end do + end do + + PRINT *, "c=", c + + IF (c(1) .gt. 0.0) THEN + CALL ABORT + END IF + + IF (c(2) .gt. 0.0) THEN + CALL ABORT + END IF +end subroutine foo + +PROGRAM MAIN + real *8 a(4, 26) + + a = 0 + a(3,1) = 100.0 + a(4,1) = 100.0 + + CALL FOO(a, 1) +END PROGRAM diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 660b14c..988ec10 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -1332,8 +1332,19 @@ vect_attempt_slp_rearrange_stmts (slp_instance slp_instn) node->load_permutation); /* We are done, no actual permutations need to be generated. */ + unsigned int unrolling_factor = SLP_INSTANCE_UNROLLING_FACTOR (slp_instn); FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (slp_instn), i, node) - SLP_TREE_LOAD_PERMUTATION (node).release (); + { + gimple *first_stmt = SLP_TREE_SCALAR_STMTS (node)[0]; + first_stmt = GROUP_FIRST_ELEMENT (vinfo_for_stmt (first_stmt)); + /* But we have to keep those permutations that are required because + of handling of gaps. */ + if (unrolling_factor == 1 + || (group_size == GROUP_SIZE (vinfo_for_stmt (first_stmt)) + && GROUP_GAP (vinfo_for_stmt (first_stmt)) == 0)) + SLP_TREE_LOAD_PERMUTATION (node).release (); + } + return true; } @@ -1381,12 +1392,7 @@ vect_supported_load_permutation_p (slp_instance slp_instn) In reduction chain the order of the loads is not important. */ if (!STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt)) && !GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt))) - { - if (vect_attempt_slp_rearrange_stmts (slp_instn)) - return true; - - /* Fallthru to general load permutation handling. */ - } + vect_attempt_slp_rearrange_stmts (slp_instn); /* In basic block vectorization we allow any subchain of an interleaving chain. |