aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/vect/pr69882.f9041
-rw-r--r--gcc/tree-vect-slp.c20
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.