This patch adds a target selector for variable-length vectors. Initially it's always false, but the SVE patch provides a case in which it's true.
2017-11-03 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * doc/sourcebuild.texi (vect_variable_length): Document. gcc/testsuite/ * lib/target-supports.exp (check_effective_target_vect_variable_length): New proc. * gcc.dg/vect/pr60482.c: XFAIL test for no epilog loop if vect_variable_length. * gcc.dg/vect/slp-reduc-6.c: XFAIL two-operation SLP if vect_variable_length. * gcc.dg/vect/vect-alias-check-5.c: XFAIL alias optimization if vect_variable_length. * gfortran.dg/vect/fast-math-mgrid-resid.f: XFAIL predictive commoning optimization if vect_variable_length. Index: gcc/doc/sourcebuild.texi =================================================================== --- gcc/doc/sourcebuild.texi 2017-11-03 16:06:26.237889385 +0000 +++ gcc/doc/sourcebuild.texi 2017-11-03 16:06:52.929591350 +0000 @@ -1486,6 +1486,9 @@ Target prefers vectors to have an alignm alignment, but also allows unaligned vector accesses in some circumstances. +@item vect_variable_length +Target has variable-length vectors. + @item vect_widen_sum_hi_to_si Target supports a vector widening summation of @code{short} operands into @code{int} results, or can promote (unpack) from @code{short} Index: gcc/testsuite/lib/target-supports.exp =================================================================== --- gcc/testsuite/lib/target-supports.exp 2017-11-03 16:06:26.241888136 +0000 +++ gcc/testsuite/lib/target-supports.exp 2017-11-03 16:06:52.930591737 +0000 @@ -6714,6 +6714,12 @@ proc check_effective_target_vect_multipl return [expr { [llength [available_vector_sizes]] > 1 }] } +# Return true if variable-length vectors are supported. + +proc check_effective_target_vect_variable_length { } { + return [expr { [lindex [available_vector_sizes] 0] == 0 }] +} + # Return 1 if the target supports vectors of 64 bits. proc check_effective_target_vect64 { } { Index: gcc/testsuite/gcc.dg/vect/pr60482.c =================================================================== --- gcc/testsuite/gcc.dg/vect/pr60482.c 2015-06-02 23:53:38.000000000 +0100 +++ gcc/testsuite/gcc.dg/vect/pr60482.c 2017-11-03 16:06:52.929591350 +0000 @@ -16,4 +16,6 @@ foo (double *x, int n) return p; } -/* { dg-final { scan-tree-dump-not "epilog loop required" "vect" } } */ +/* Until fully-masked loops are supported, we always need an epilog + loop for variable-length vectors. */ +/* { dg-final { scan-tree-dump-not "epilog loop required" "vect" { xfail vect_variable_length } } } */ Index: gcc/testsuite/gcc.dg/vect/slp-reduc-6.c =================================================================== --- gcc/testsuite/gcc.dg/vect/slp-reduc-6.c 2015-06-02 23:53:35.000000000 +0100 +++ gcc/testsuite/gcc.dg/vect/slp-reduc-6.c 2017-11-03 16:06:52.929591350 +0000 @@ -44,5 +44,5 @@ int main (void) /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { vect_no_int_add || { ! { vect_unpack || vect_strided2 } } } } } } */ /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" } } */ -/* { dg-final { scan-tree-dump-times "different interleaving chains in one node" 1 "vect" { target { ! vect_no_int_add } } } } */ +/* { dg-final { scan-tree-dump-times "different interleaving chains in one node" 1 "vect" { target { ! vect_no_int_add } xfail vect_variable_length } } } */ Index: gcc/testsuite/gcc.dg/vect/vect-alias-check-5.c =================================================================== --- gcc/testsuite/gcc.dg/vect/vect-alias-check-5.c 2017-08-04 11:39:37.910284386 +0100 +++ gcc/testsuite/gcc.dg/vect/vect-alias-check-5.c 2017-11-03 16:06:52.929591350 +0000 @@ -15,5 +15,5 @@ f1 (struct s *a, struct s *b) } /* { dg-final { scan-tree-dump-times "consider run-time aliasing" 1 "vect" } } */ -/* { dg-final { scan-tree-dump-times "improved number of alias checks from 1 to 0" 1 "vect" } } */ +/* { dg-final { scan-tree-dump-times "improved number of alias checks from 1 to 0" 1 "vect" { xfail vect_variable_length } } } */ /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 1 "vect" } } */ Index: gcc/testsuite/gfortran.dg/vect/fast-math-mgrid-resid.f =================================================================== --- gcc/testsuite/gfortran.dg/vect/fast-math-mgrid-resid.f 2017-10-04 16:25:39.620051123 +0100 +++ gcc/testsuite/gfortran.dg/vect/fast-math-mgrid-resid.f 2017-11-03 16:06:52.929591350 +0000 @@ -42,5 +42,5 @@ C ! vectorized loop. If vector factor is 2, the vectorized loop can ! be predictive commoned, we check if predictive commoning PHI node ! is created with vector(2) type. -! { dg-final { scan-tree-dump "Executing predictive commoning without unrolling" "pcom" } } -! { dg-final { scan-tree-dump "vectp_u.*__lsm.* = PHI <.*vectp_u.*__lsm" "pcom" } } +! { dg-final { scan-tree-dump "Executing predictive commoning without unrolling" "pcom" { xfail vect_variable_length } } } +! { dg-final { scan-tree-dump "vectp_u.*__lsm.* = PHI <.*vectp_u.*__lsm" "pcom" { xfail vect_variable_length } } }