aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/vshift-3.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-10-31 17:52:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-10-31 17:52:19 +0100
commitaa9480274fb3ad710e1afc6558c09e1ab0e7d468 (patch)
tree021f641e722e04eb77cf47f6a52a9de1f42432ef /gcc/testsuite/gcc.dg/vshift-3.c
parent08810e5257936014e242527cdbb2de6beddf24e8 (diff)
downloadgcc-aa9480274fb3ad710e1afc6558c09e1ab0e7d468.zip
gcc-aa9480274fb3ad710e1afc6558c09e1ab0e7d468.tar.gz
gcc-aa9480274fb3ad710e1afc6558c09e1ab0e7d468.tar.bz2
tree-vect-stmts.c (vectorizable_shift): If op1 is vect_external_def in a loop and has different type from op0...
* tree-vect-stmts.c (vectorizable_shift): If op1 is vect_external_def in a loop and has different type from op0, cast it to op0's type before the loop first. For slp give up. Don't crash if op1_vectype is NULL. * gcc.dg/vshift-3.c: New test. * gcc.dg/vshift-4.c: New test. * gcc.dg/vshift-5.c: New test. From-SVN: r180704
Diffstat (limited to 'gcc/testsuite/gcc.dg/vshift-3.c')
-rw-r--r--gcc/testsuite/gcc.dg/vshift-3.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vshift-3.c b/gcc/testsuite/gcc.dg/vshift-3.c
new file mode 100644
index 0000000..e62c76b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vshift-3.c
@@ -0,0 +1,136 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+#include <stdlib.h>
+
+#define N 64
+
+#ifndef TYPE1
+#define TYPE1 int
+#define TYPE2 long long
+#endif
+
+signed TYPE1 a[N], b, g[N];
+unsigned TYPE1 c[N], h[N];
+signed TYPE2 d[N], e, j[N];
+unsigned TYPE2 f[N], k[N];
+
+#ifndef S
+#define S(x) x
+#endif
+
+__attribute__((noinline)) void
+f1 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ g[i] = a[i] << S (b);
+}
+
+__attribute__((noinline)) void
+f2 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ g[i] = a[i] >> S (b);
+}
+
+__attribute__((noinline)) void
+f3 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ h[i] = c[i] >> S (b);
+}
+
+__attribute__((noinline)) void
+f4 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ j[i] = d[i] << S (e);
+}
+
+__attribute__((noinline)) void
+f5 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ j[i] = d[i] >> S (e);
+}
+
+__attribute__((noinline)) void
+f6 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ k[i] = f[i] >> S (e);
+}
+
+__attribute__((noinline)) void
+f7 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ j[i] = d[i] << S (b);
+}
+
+__attribute__((noinline)) void
+f8 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ j[i] = d[i] >> S (b);
+}
+
+__attribute__((noinline)) void
+f9 (void)
+{
+ int i;
+ for (i = 0; i < N; i++)
+ k[i] = f[i] >> S (b);
+}
+
+int
+main ()
+{
+ int i;
+ b = 7;
+ e = 12;
+ for (i = 0; i < N; i++)
+ {
+ asm ("");
+ c[i] = (random () << 1) | (random () & 1);
+ a[i] = c[i];
+ d[i] = (random () << 1) | (random () & 1);
+ d[i] |= (unsigned long long) c[i] << 32;
+ f[i] = d[i];
+ }
+ f1 ();
+ f3 ();
+ f4 ();
+ f6 ();
+ for (i = 0; i < N; i++)
+ if (g[i] != (signed TYPE1) (a[i] << S (b))
+ || h[i] != (unsigned TYPE1) (c[i] >> S (b))
+ || j[i] != (signed TYPE2) (d[i] << S (e))
+ || k[i] != (unsigned TYPE2) (f[i] >> S (e)))
+ abort ();
+ f2 ();
+ f5 ();
+ f9 ();
+ for (i = 0; i < N; i++)
+ if (g[i] != (signed TYPE1) (a[i] >> S (b))
+ || j[i] != (signed TYPE2) (d[i] >> S (e))
+ || k[i] != (unsigned TYPE2) (f[i] >> S (b)))
+ abort ();
+ f7 ();
+ for (i = 0; i < N; i++)
+ if (j[i] != (signed TYPE2) (d[i] << S (b)))
+ abort ();
+ f8 ();
+ for (i = 0; i < N; i++)
+ if (j[i] != (signed TYPE2) (d[i] >> S (b)))
+ abort ();
+ return 0;
+}