aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-11-21 10:23:26 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-11-21 10:23:26 +0100
commit0daaf8aa4d32fee71136021003bca60cc350a04e (patch)
treec141776a8a4f214038516aab8ddb8c6373b349c0 /gcc
parentccfe424ac5205471ceb888b31d2fa4b74c54640f (diff)
downloadgcc-0daaf8aa4d32fee71136021003bca60cc350a04e.zip
gcc-0daaf8aa4d32fee71136021003bca60cc350a04e.tar.gz
gcc-0daaf8aa4d32fee71136021003bca60cc350a04e.tar.bz2
re PR target/63910 (ICE: simplify_immed_subreg, at simplify-rtx.c:5519 with -mstringop-strategy=vector_loop -mavx512f)
PR target/63910 * simplify-rtx.c (simplify_immed_subreg): Return NULL for integer modes wider than MAX_BITSIZE_MODE_ANY_INT. If not using CONST_WIDE_INT, make sure r fits into CONST_DOUBLE. * gcc.target/i386/pr63910.c: New test. From-SVN: r217908
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/simplify-rtx.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr63910.c12
4 files changed, 31 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bf03c81..9f03c0f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/63910
+ * simplify-rtx.c (simplify_immed_subreg): Return NULL for integer
+ modes wider than MAX_BITSIZE_MODE_ANY_INT. If not using
+ CONST_WIDE_INT, make sure r fits into CONST_DOUBLE.
+
2014-11-21 Markus Trippelsdorf <markus@trippelsdorf.de>
* config/rs6000/rs6000.c (includes_rldic_lshift_p): Use
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 022e36f..98d4ceb 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -5504,6 +5504,8 @@ simplify_immed_subreg (machine_mode outermode, rtx op,
HOST_WIDE_INT tmp[MAX_BITSIZE_MODE_ANY_INT / HOST_BITS_PER_WIDE_INT];
wide_int r;
+ if (GET_MODE_PRECISION (outer_submode) > MAX_BITSIZE_MODE_ANY_INT)
+ return NULL_RTX;
for (u = 0; u < units; u++)
{
unsigned HOST_WIDE_INT buf = 0;
@@ -5515,10 +5517,13 @@ simplify_immed_subreg (machine_mode outermode, rtx op,
tmp[u] = buf;
base += HOST_BITS_PER_WIDE_INT;
}
- gcc_assert (GET_MODE_PRECISION (outer_submode)
- <= MAX_BITSIZE_MODE_ANY_INT);
r = wide_int::from_array (tmp, units,
GET_MODE_PRECISION (outer_submode));
+#if TARGET_SUPPORTS_WIDE_INT == 0
+ /* Make sure r will fit into CONST_INT or CONST_DOUBLE. */
+ if (wi::min_precision (r, SIGNED) > HOST_BITS_PER_DOUBLE_INT)
+ return NULL_RTX;
+#endif
elems[elem] = immed_wide_int_const (r, outer_submode);
}
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9e0c6b8..f065cc2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/63910
+ * gcc.target/i386/pr63910.c: New test.
+
2014-11-21 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR lto/63998
diff --git a/gcc/testsuite/gcc.target/i386/pr63910.c b/gcc/testsuite/gcc.target/i386/pr63910.c
new file mode 100644
index 0000000..2d5b3b8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr63910.c
@@ -0,0 +1,12 @@
+/* PR target/63910 */
+/* { dg-do compile } */
+/* { dg-options "-O -mstringop-strategy=vector_loop -mavx512f" } */
+
+extern void bar (float *c);
+
+void
+foo (void)
+{
+ float c[1024] = { };
+ bar (c);
+}