aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Kaplansky <victork@il.ibm.com>2006-02-16 09:59:00 +0000
committerVictor Kaplansky <victork@il.ibm.com>2006-02-16 09:59:00 +0000
commite4ccbd7afbe1d159aaa474db58d555437b4b576e (patch)
tree44a3f54f258481f114ae568861977eccc840c348
parent4fd4c8bde79c6fcbe62a31c24cb580d9ec76bfdb (diff)
testsuite/
2006-02-16 Victor Kaplansky <victork@il.ibm.com> PR tree-opt/25918 * lib/target-supports.exp (check_effective_target_vect_short_mult): New. (check_effective_target_vect_char_mult): New. (check_effective_target_vect_widen_sum_qi_to_si): New. (check_effective_target_vect_widen_sum_qi_to_hi): New. (check_effective_target_vect_widen_sum_hi_to_si): New. * gcc.dg/vect/vect-reduc-dot-s16.c: Remove, split into vect-reduc-dot-s16a.c and vect-reduc-dot-s16b.c * vect-reduc-dot-s16a.c: New, split from vect-reduc-dot-s16.c. * vect-reduc-dot-s16b.c: New, split from vect-reduc-dot-s16.c. * gcc.dg/vect/vect-reduc-pattern-2.c: Remove, split into vect-reduc-pattern-2a.c, vect-reduc-pattern-2b.c and vect-reduc-pattern-2c.c * gcc.dg/vect/vect-reduc-pattern-1.c: Remove, split into vect-reduc-pattern-1a.c, vect-reduc-pattern-1b.c and vect-reduc-pattern-1c.c git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@111135 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/testsuite/ChangeLog20
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16a.c (renamed from gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16.c)56
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16b.c56
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1.c60
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1a.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1b.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1c.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2.c67
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2a.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2b.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c48
-rwxr-xr-xgcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2.c59
-rw-r--r--gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2c.c41
-rw-r--r--gcc/testsuite/lib/target-supports.exp101
14 files changed, 486 insertions, 222 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7f464ab7188..2ef471615b2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,23 @@
+2006-02-16 Victor Kaplansky <victork@il.ibm.com>
+
+ PR tree-opt/25918
+ * lib/target-supports.exp
+ (check_effective_target_vect_short_mult): New.
+ (check_effective_target_vect_char_mult): New.
+ (check_effective_target_vect_widen_sum_qi_to_si): New.
+ (check_effective_target_vect_widen_sum_qi_to_hi): New.
+ (check_effective_target_vect_widen_sum_hi_to_si): New.
+ * gcc.dg/vect/vect-reduc-dot-s16.c: Remove, split into
+ vect-reduc-dot-s16a.c and vect-reduc-dot-s16b.c
+ * vect-reduc-dot-s16a.c: New, split from vect-reduc-dot-s16.c.
+ * vect-reduc-dot-s16b.c: New, split from vect-reduc-dot-s16.c.
+ * gcc.dg/vect/vect-reduc-pattern-2.c: Remove, split into
+ vect-reduc-pattern-2a.c, vect-reduc-pattern-2b.c and
+ vect-reduc-pattern-2c.c
+ * gcc.dg/vect/vect-reduc-pattern-1.c: Remove, split into
+ vect-reduc-pattern-1a.c, vect-reduc-pattern-1b.c and
+ vect-reduc-pattern-1c.c
+
2005-02-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/24557
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16a.c
index ddffc109d35..d92511fcdfc 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16a.c
@@ -4,61 +4,45 @@
#include "tree-vect.h"
#define N 64
-
-#define DOT1 43680
-#define DOT2 43680
+#define DOT 43680
signed short X[N] __attribute__ ((__aligned__(16)));
signed short Y[N] __attribute__ ((__aligned__(16)));
-/* short->short->int dot product.
- Not detected as a dot-product pattern.
- Currently fails to be vectorized due to presence of type conversions. */
-int
-foo1(int len) {
- int i;
- int result = 0;
- short prod;
-
- for (i=0; i<len; i++) {
- prod = X[i] * Y[i];
- result += prod;
- }
- return result;
-}
-
/* short->int->int dot product.
Detected as a dot-product pattern.
- Vectorized on targets that support dot-product for signed shorts. */
+ Vectorized on targets that support dot-product for signed shorts. */
+
int
-foo2(int len) {
+foo (int len)
+{
int i;
int result = 0;
- for (i=0; i<len; i++) {
- result += (X[i] * Y[i]);
- }
+ for (i = 0; i < len; i++)
+ {
+ result += (X[i] * Y[i]);
+ }
return result;
}
-int main (void)
+int
+main (void)
{
- int i, dot1, dot2;
+ int i;
+ int dot;
check_vect ();
- for (i=0; i<N; i++) {
- X[i] = i;
- Y[i] = 64-i;
- }
-
- dot1 = foo1 (N);
- if (dot1 != DOT1)
- abort ();
+ for (i = 0; i < N; i++)
+ {
+ X[i] = i;
+ Y[i] = N - i;
+ }
- dot2 = foo2 (N);
- if (dot2 != DOT2)
+ dot = foo (N);
+ if (dot != DOT)
abort ();
return 0;
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16b.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16b.c
new file mode 100644
index 00000000000..feb7df03149
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16b.c
@@ -0,0 +1,56 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 64
+
+#define DOT 43680
+
+signed short X[N] __attribute__ ((__aligned__(16)));
+signed short Y[N] __attribute__ ((__aligned__(16)));
+
+/* short->short->int dot product. Should be vectorized on architectures
+ supporting vectorized multiplication of two short args with short result,
+ e.g "mulv4hi3" and widenning sum */
+int
+foo (int len)
+{
+ int i;
+ int result = 0;
+ short prod;
+
+ for (i = 0; i < len; i++)
+ {
+ prod = X[i] * Y[i];
+ result += prod;
+ }
+ return result;
+}
+
+int
+main (void)
+{
+ int i, dot;
+
+ check_vect ();
+
+ for (i = 0; i < N; i++)
+ {
+ X[i] = i;
+ Y[i] = 64 - i;
+ }
+
+ dot = foo (N);
+ if (dot != DOT)
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { vect_short_mult && vect_widen_sum_hi_to_si } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_short_mult } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_hi_to_si } } } } */
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1.c
deleted file mode 100644
index 61f1da19d6e..00000000000
--- a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* { dg-require-effective-target vect_int } */
-
-#include <stdarg.h>
-#include "tree-vect.h"
-
-#define N 16
-#define SH_SUM 210
-#define CH_SUM 120
-
-int main1 ()
-{
- int i;
- unsigned short udata_sh[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28};
- unsigned char udata_ch[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- unsigned int intsum = 0;
- unsigned short shortsum = 0;
-
- /* widenning sum: sum shorts into int. */
- for (i = 0; i < N; i++){
- intsum += udata_sh[i];
- }
-
- /* check results: */
- if (intsum != SH_SUM)
- abort ();
-
- /* widenning sum: sum chars into int. */
- intsum = 0;
- for (i = 0; i < N; i++){
- intsum += udata_ch[i];
- }
-
- /* check results: */
- if (intsum != CH_SUM)
- abort ();
-
- /* widenning sum: sum chars into short.
- pattern detected, but not vectorized yet. */
- for (i = 0; i < N; i++){
- shortsum += udata_ch[i];
- }
-
- /* check results: */
- if (shortsum != CH_SUM)
- abort ();
-
- return 0;
-}
-
-int main (void)
-{
- check_vect ();
-
- return main1 ();
-}
-
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 3 "vect" } } */
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_widen_sum } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1a.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1a.c
new file mode 100644
index 00000000000..ca578a48306
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1a.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+unsigned short udata_sh[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ unsigned int intsum = 0;
+
+ /* widenning sum: sum shorts into int. */
+ for (i = 0; i < N; i++)
+ {
+ intsum += udata_sh[i];
+ }
+
+ /* check results: */
+ if (intsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_hi_to_si } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_hi_to_si } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1b.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1b.c
new file mode 100644
index 00000000000..443ec931916
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1b.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+unsigned char udata_ch[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ unsigned int intsum = 0;
+
+ /* widenning sum: sum chars into int. */
+ for (i = 0; i < N; i++)
+ {
+ intsum += udata_ch[i];
+ }
+
+ /* check results: */
+ if (intsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_si } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_si } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1c.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1c.c
new file mode 100644
index 00000000000..39eb48e720b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-1c.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+unsigned char udata_ch[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ unsigned short shortsum = 0;
+
+ /* widenning sum: sum chars into short. */
+ for (i = 0; i < N; i++)
+ {
+ shortsum += udata_ch[i];
+ }
+
+ /* check results: */
+ if (shortsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_hi } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2.c
deleted file mode 100644
index 5423c4376d9..00000000000
--- a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* { dg-require-effective-target vect_int } */
-
-#include <stdarg.h>
-#include "tree-vect.h"
-
-#define N 16
-#define SH_SUM 210
-#define CH_SUM 120
-
-int main1 ()
-{
- int i;
- signed short data_sh[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28};
- signed char data_ch[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- signed int intsum = 0;
- signed short shortsum = 0;
-
- /* widenning sum: sum shorts into int. */
- for (i = 0; i < N; i++){
- intsum += data_sh[i];
- }
-
- /* check results: */
- if (intsum != SH_SUM)
- abort ();
-
- /* widenning sum: sum chars into int. */
- intsum = 0;
- for (i = 0; i < N; i++){
- intsum += data_ch[i];
- }
-
- /* check results: */
- if (intsum != CH_SUM)
- abort ();
-
- /* widenning sum: sum chars into short.
- The widening-summation pattern is currently not detected because of this
- patch:
-
- 2005-12-26 Kazu Hirata <kazu@codesourcery.com>
-
- PR tree-optimization/25125
- */
- for (i = 0; i < N; i++){
- shortsum += data_ch[i];
- }
-
- /* check results: */
- if (shortsum != CH_SUM)
- abort ();
-
- return 0;
-}
-
-int main (void)
-{
- check_vect ();
-
- return main1 ();
-}
-
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 3 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 2 "vect" } } */
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_widen_sum } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2a.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2a.c
new file mode 100644
index 00000000000..a5030c65920
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2a.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+signed short data_sh[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ signed int intsum = 0;
+
+ /* widenning sum: sum shorts into int. */
+ for (i = 0; i < N; i++)
+ {
+ intsum += data_sh[i];
+ }
+
+ /* check results: */
+ if (intsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_hi_to_si } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_hi_to_si } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2b.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2b.c
new file mode 100644
index 00000000000..5ca5185628a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2b.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+signed char data_ch[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ signed int intsum = 0;
+
+ /* widenning sum: sum chars into int. */
+ for (i = 0; i < N; i++)
+ {
+ intsum += data_ch[i];
+ }
+
+ /* check results: */
+ if (intsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_si } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_si } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c
new file mode 100644
index 00000000000..7444ac737e5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-2c.c
@@ -0,0 +1,48 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+signed char data_ch[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ signed short shortsum = 0;
+
+ /* widenning sum: sum chars into short.
+ The widening-summation pattern is currently not detected because of this
+ patch:
+
+ 2005-12-26 Kazu Hirata <kazu@codesourcery.com>
+
+ PR tree-optimization/25125
+ */
+
+ for (i = 0; i < N; i++)
+ {
+ shortsum += data_ch[i];
+ }
+
+ /* check results: */
+ if (shortsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2.c b/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2.c
deleted file mode 100755
index 6c844eac38e..00000000000
--- a/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* { dg-require-effective-target vect_int } */
-
-#include <stdarg.h>
-#include "tree-vect.h"
-
-#define N 16
-#define SH_SUM 210
-#define CH_SUM 120
-
-int main1 ()
-{
- int i;
- signed short data_sh[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28};
- signed char data_ch[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- signed int intsum = 0;
- signed short shortsum = 0;
-
- /* widenning sum: sum shorts into int. */
- for (i = 0; i < N; i++){
- intsum += data_sh[i];
- }
-
- /* check results: */
- if (intsum != SH_SUM)
- abort ();
-
- /* widenning sum: sum chars into int. */
- intsum = 0;
- for (i = 0; i < N; i++){
- intsum += data_ch[i];
- }
-
- /* check results: */
- if (intsum != CH_SUM)
- abort ();
-
- /* widenning sum: sum chars into short. */
- for (i = 0; i < N; i++){
- shortsum += data_ch[i];
- }
-
- /* check results: */
- if (shortsum != CH_SUM)
- abort ();
-
- return 0;
-}
-
-int main (void)
-{
- check_vect ();
-
- return main1 ();
-}
-
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 3 "vect" } } */
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_widen_sum } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2c.c b/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2c.c
new file mode 100644
index 00000000000..9296098d73f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-pattern-2c.c
@@ -0,0 +1,41 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+signed char data_ch[N] =
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
+#define SUM 210
+
+int
+foo ()
+{
+ int i;
+ signed short shortsum = 0;
+
+ /* widenning sum: sum chars into short. */
+
+ for (i = 0; i < N; i++)
+ {
+ shortsum += data_ch[i];
+ }
+
+ /* check results: */
+ if (shortsum != SUM)
+ abort ();
+
+ return 0;
+}
+
+int
+main (void)
+{
+ check_vect ();
+ return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_hi } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 88794a3cb98..49264b6eef6 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -1435,6 +1435,67 @@ proc check_effective_target_vect_no_bitwise { } {
}
# Return 1 if the target plus current options supports a vector
+# widening summation of *short* args into *int* result, 0 otherwise.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_vect_widen_sum_hi_to_si { } {
+ global et_vect_widen_sum_hi_to_si
+
+ if [info exists et_vect_widen_sum_hi_to_si_saved] {
+ verbose "check_effective_target_vect_widen_sum_hi_to_si: using cached result" 2
+ } else {
+ set et_vect_widen_sum_hi_to_si_saved 0
+ if { [istarget powerpc*-*-*]
+ || [istarget ia64-*-*] } {
+ set et_vect_widen_sum_hi_to_si_saved 1
+ }
+ }
+ verbose "check_effective_target_vect_widen_sum_hi_to_si: returning $et_vect_widen_sum_hi_to_si_saved" 2
+ return $et_vect_widen_sum_hi_to_si_saved
+}
+
+# Return 1 if the target plus current options supports a vector
+# widening summation of *char* args into *short* result, 0 otherwise.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_vect_widen_sum_qi_to_hi { } {
+ global et_vect_widen_sum_qi_to_hi
+
+ if [info exists et_vect_widen_sum_qi_to_hi_saved] {
+ verbose "check_effective_target_vect_widen_sum_qi_to_hi: using cached result" 2
+ } else {
+ set et_vect_widen_sum_qi_to_hi_saved 0
+ if { [istarget ia64-*-*] } {
+ set et_vect_widen_sum_qi_to_hi_saved 1
+ }
+ }
+ verbose "check_effective_target_vect_widen_sum_qi_to_hi: returning $et_vect_widen_sum_qi_to_hi_saved" 2
+ return $et_vect_widen_sum_qi_to_hi_saved
+}
+
+# Return 1 if the target plus current options supports a vector
+# widening summation of *char* args into *int* result, 0 otherwise.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_vect_widen_sum_qi_to_si { } {
+ global et_vect_widen_sum_qi_to_si
+
+ if [info exists et_vect_widen_sum_qi_to_si_saved] {
+ verbose "check_effective_target_vect_widen_sum_qi_to_si: using cached result" 2
+ } else {
+ set et_vect_widen_sum_qi_to_si_saved 0
+ if { [istarget powerpc*-*-*] } {
+ set et_vect_widen_sum_qi_to_si_saved 1
+ }
+ }
+ verbose "check_effective_target_vect_widen_sum_qi_to_si: returning $et_vect_widen_sum_qi_to_si_saved" 2
+ return $et_vect_widen_sum_qi_to_si_saved
+}
+
+# Return 1 if the target plus current options supports a vector
# widening summation, 0 otherwise.
#
# This won't change for different subtargets so cache the result.
@@ -1583,6 +1644,46 @@ proc check_effective_target_vect_condition { } {
return $et_vect_cond_saved
}
+# Return 1 if the target supports vector char multiplication, 0 otherwise.
+
+proc check_effective_target_vect_char_mult { } {
+ global et_vect_char_mult_saved
+
+ if [info exists et_vect_char_mult_saved] {
+ verbose "check_effective_target_vect_char_mult: using cached result" 2
+ } else {
+ set et_vect_char_mult_saved 0
+ if { [istarget ia64-*-*]
+ || [istarget i?86-*-*]
+ || [istarget x86_64-*-*] } {
+ set et_vect_char_mult_saved 1
+ }
+ }
+
+ verbose "check_effective_target_vect_char_mult: returning $et_vect_char_mult_saved" 2
+ return $et_vect_char_mult_saved
+}
+
+# Return 1 if the target supports vector short multiplication, 0 otherwise.
+
+proc check_effective_target_vect_short_mult { } {
+ global et_vect_short_mult_saved
+
+ if [info exists et_vect_short_mult_saved] {
+ verbose "check_effective_target_vect_short_mult: using cached result" 2
+ } else {
+ set et_vect_short_mult_saved 0
+ if { [istarget ia64-*-*]
+ || [istarget i?86-*-*]
+ || [istarget x86_64-*-*] } {
+ set et_vect_short_mult_saved 1
+ }
+ }
+
+ verbose "check_effective_target_vect_short_mult: returning $et_vect_short_mult_saved" 2
+ return $et_vect_short_mult_saved
+}
+
# Return 1 if the target supports vector int multiplication, 0 otherwise.
proc check_effective_target_vect_int_mult { } {