From c50c91a9a33d9ade766a509c1fd3d6f9b66d19e7 Mon Sep 17 00:00:00 2001 From: Alan Lawrence Date: Mon, 22 Sep 2014 16:33:05 +0000 Subject: [PATCH] [Testsuite] Add tests of reductions using whole-vector-shifts (multiplication) * lib/target-supports.exp (check_effective_target_whole_vector_shift): New. * gcc.dg/vect/vect-reduc-mul_1.c: New test. * gcc.dg/vect/vect-reduc-mul_2.c: New test. From-SVN: r215473 --- gcc/testsuite/ChangeLog | 8 +++++ gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c | 36 ++++++++++++++++++++ gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c | 32 +++++++++++++++++ gcc/testsuite/lib/target-supports.exp | 16 +++++++++ 4 files changed, 92 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c create mode 100644 gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9e7330b4a98..92efa6efddd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-09-22 Alan Lawrence + + * lib/target-supports.exp (check_effective_target_whole_vector_shift): + New. + + * gcc.dg/vect/vect-reduc-mul_1.c: New test. + * gcc.dg/vect/vect-reduc-mul_2.c: New test. + 2014-09-22 Jakub Jelinek PR debug/63328 diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c new file mode 100644 index 00000000000..44f026ff9b5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_1.c @@ -0,0 +1,36 @@ +/* { dg-require-effective-target vect_int_mult } */ +/* { dg-require-effective-target whole_vector_shift } */ + +/* Write a reduction loop to be reduced using vector shifts. */ + +extern void abort(void); + +unsigned char in[16]; + +int +main (unsigned char argc, char **argv) +{ + unsigned char i = 0; + unsigned char sum = 1; + + for (i = 0; i < 16; i++) + in[i] = i + i + 1; + + /* Prevent constant propagation of the entire loop below. */ + asm volatile ("" : : : "memory"); + + for (i = 0; i < 16; i++) + sum *= in[i]; + + if (sum != 33) + { + __builtin_printf("Failed %d\n", sum); + abort(); + } + + return 0; +} + +/* { dg-final { scan-tree-dump "Reduce using vector shifts" "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c new file mode 100644 index 00000000000..414fba7a5c9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-mul_2.c @@ -0,0 +1,32 @@ +/* { dg-require-effective-target vect_int_mult } */ +/* { dg-require-effective-target whole_vector_shift } */ + +/* Write a reduction loop to be reduced using vector shifts and folded. */ + +extern void abort(void); + +int +main (unsigned char argc, char **argv) +{ + unsigned char in[16]; + unsigned char i = 0; + unsigned char sum = 1; + + for (i = 0; i < 16; i++) + in[i] = i + i + 1; + + for (i = 0; i < 16; i++) + sum *= in[i]; + + if (sum != 33) + { + __builtin_printf("Failed %d\n", sum); + abort(); + } + + return 0; +} + +/* { dg-final { scan-tree-dump "Reduce using vector shifts" "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 52929b92081..a916ca503bb 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -3324,6 +3324,22 @@ proc check_effective_target_vect_shift { } { return $et_vect_shift_saved } +proc check_effective_target_whole_vector_shift { } { + if { [istarget x86_64-*-*] + || [istarget ia64-*-*] + || ([check_effective_target_arm32] + && [check_effective_target_arm_little_endian]) + || ([istarget mips*-*-*] + && [check_effective_target_mips_loongson]) } { + set answer 1 + } else { + set answer 0 + } + + verbose "check_effective_target_vect_long: returning $answer" 2 + return $answer +} + # Return 1 if the target supports vector bswap operations. proc check_effective_target_vect_bswap { } {