Hi,

The commit r11-3230 brings a nice improvement to use full
vectors instead of partial vectors when available.  But
it caused some vector with length test cases to fail on
Power.

The failure on gcc.target/powerpc/p9-vec-length-epil-7.c
exposed one issue that: we call function 
vect_need_peeling_or_partial_vectors_p in function
vect_analyze_loop_2, since it's in analysis phase, for
the epilogue loop, we could get the wrong information like
LOOP_VINFO_INT_NITERS (loop_vinfo), further get the wrong
answer for vect_need_peeling_or_partial_vectors_p.
For the epilogue loop in this failure specific, the niter
that we get is 58 (should be 1), vf is 2.

For epilogue loop with partial vectors, it would use the
same VF as the main loop, so it won't be able to use full
vector, this patch is to exclude epilogue loop for the
check vect_need_peeling_or_partial_vectors_p in
vect_analyze_loop_2.

The failure on gcc.target/powerpc/p9-vec-length-full-6.c
is just a test issue, the 64bit/32bit pairs are able to
use full vector, fixed in the patch accordingly.

Bootstrapped/regtested on powerpc64le-linux-gnu P9.

Is it OK for trunk?

BR,
Kewen
-----
gcc/ChangeLog:

        * tree-vect-loop.c (vect_analyze_loop_2): Don't check
        vect_need_peeling_or_partial_vectors_p for the epilogue loop.

gcc/testsuite/ChangeLog:

        * gcc.target/powerpc/p9-vec-length-full-6.c: Adjust.
diff --git a/gcc/testsuite/gcc.target/powerpc/p9-vec-length-full-6.c 
b/gcc/testsuite/gcc.target/powerpc/p9-vec-length-full-6.c
index cfae9bbc927..5d2357aabfa 100644
--- a/gcc/testsuite/gcc.target/powerpc/p9-vec-length-full-6.c
+++ b/gcc/testsuite/gcc.target/powerpc/p9-vec-length-full-6.c
@@ -9,8 +9,7 @@
 #include "p9-vec-length-6.h"
 
 /* It can use normal vector load for constant vector load.  */
-/* { dg-final { scan-assembler-not   {\mstxv\M} } } */
-/* { dg-final { scan-assembler-not   {\mlxvx\M} } } */
-/* { dg-final { scan-assembler-not   {\mstxvx\M} } } */
-/* { dg-final { scan-assembler-times {\mlxvl\M} 16 } } */
-/* { dg-final { scan-assembler-times {\mstxvl\M} 16 } } */
+/* { dg-final { scan-assembler-times {\mstxvx?\M} 6 } } */
+/* 64bit/32bit pairs won't use partial vectors.  */
+/* { dg-final { scan-assembler-times {\mlxvl\M} 10 } } */
+/* { dg-final { scan-assembler-times {\mstxvl\M} 10 } } */
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index ab627fbf029..7273e998a99 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -2278,7 +2278,8 @@ start_over:
     {
       /* Don't use partial vectors if we don't need to peel the loop.  */
       if (param_vect_partial_vector_usage == 0
-         || !vect_need_peeling_or_partial_vectors_p (loop_vinfo))
+         || (!LOOP_VINFO_EPILOGUE_P (loop_vinfo)
+             && !vect_need_peeling_or_partial_vectors_p (loop_vinfo)))
        LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo) = false;
       else if (vect_verify_full_masking (loop_vinfo)
               || vect_verify_loop_lens (loop_vinfo))

Reply via email to