aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2018-12-05 15:53:03 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-12-05 15:53:03 +0000
commita1ff7f142078df785548469fe000608c28a8c479 (patch)
tree7d45b3f40f7f93cfdd99b2f8c29863d603d74206 /gcc/testsuite
parentd1cf20b6fc16268a54fd217844af93e644fdaced (diff)
downloadgcc-a1ff7f142078df785548469fe000608c28a8c479.zip
gcc-a1ff7f142078df785548469fe000608c28a8c479.tar.gz
gcc-a1ff7f142078df785548469fe000608c28a8c479.tar.bz2
Use unsigned arithmetic for demoted vector plus/minus/mult (PR 88064)
As Jakub pointed out, if we narrow a plus, minus or mult operation based on the number of bits that consumers need, we have to convert a signed operation to an unsigned one in order to avoid new undefined behaviour. This patch does that and generalises vect_convert_input and vect_recog_over_widening_pattern to cope with the extra casts. (The changes to both functions are covered by existing tests.) 2018-12-03 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR tree-optimization/88064 * tree-vect-patterns.c (vect_convert_input): Convert the result of an existing cast if it has the right width but the wrong sign. Do not test the signedness of the required result when considering whether to split an existing cast; instead split to a type with the same signedness as the source of the cast, then convert it to the opposite signedness where necessary. (vect_recog_over_widening_pattern): Handle sign changes between the final PLUS_EXPR and the RSHIFT_EXPR. (vect_recog_average_pattern): Use an unsigned operation when truncating an addition, subtraction or multiplication. Cast the result back to the "real" signedness before promoting. gcc/testsuite/ PR tree-optimization/88064 * gcc.dg/vect/vect-over-widen-23.c: New test. From-SVN: r266829
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-over-widen-23.c31
2 files changed, 36 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 812567e..77dbe74 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/88064
+ * gcc.dg/vect/vect-over-widen-23.c: New test.
+
2018-12-05 David Malcolm <dmalcolm@redhat.com>
* lib/gcc-dg.exp (process-message): Change verbosity level of
diff --git a/gcc/testsuite/gcc.dg/vect/vect-over-widen-23.c b/gcc/testsuite/gcc.dg/vect/vect-over-widen-23.c
new file mode 100644
index 0000000..a6c4883
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-over-widen-23.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-forwprop -fno-tree-vrp" }
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+
+#if VECTOR_BITS > 128
+#define N (VECTOR_BITS / 2)
+#else
+#define N 64
+#endif
+
+int a[N], b[N], c[N];
+
+void
+foo ()
+{
+ int i;
+ for (i = 0; i < N; i++)
+ {
+ long long d = a[i];
+ long long e = b[i];
+ d += e;
+ c[i] = d;
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_shift_pattern: detected" 2 "vect" { target vect_widen_shift } } } */
+/* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* \+} "vect" } } */
+/* { dg-final { scan-tree-dump {VIEW_CONVERT_EXPR<vector[^ ]* unsigned} "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */