aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-04-05 19:05:23 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-04-05 19:05:23 +0200
commit268a0ec4edd31182a527d02f47fab50d60ad845d (patch)
tree52989561542f7e2f21d718297c1e222a7eb64b4d
parent02a49e4f9f81edfd3da44295a163f5029fcfef78 (diff)
downloadgcc-268a0ec4edd31182a527d02f47fab50d60ad845d.zip
gcc-268a0ec4edd31182a527d02f47fab50d60ad845d.tar.gz
gcc-268a0ec4edd31182a527d02f47fab50d60ad845d.tar.bz2
re PR rtl-optimization/70542 (Wrong code with -O3 -mavx2.)
PR rtl-optimization/70542 * ree.c (add_removable_extension): For VECTOR_MODE_P punt if there are any uses other than insn or debug insns. * gcc.dg/torture/pr70542.c: New test. * gcc.target/i386/avx2-pr70542.c: New test. From-SVN: r234756
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ree.c20
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70542.c31
-rw-r--r--gcc/testsuite/gcc.target/i386/avx2-pr70542.c16
5 files changed, 65 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de21dde..df63cc5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-04-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/70542
+ * ree.c (add_removable_extension): For VECTOR_MODE_P punt
+ if there are any uses other than insn or debug insns.
+
2016-04-05 Marc Glisse <marc.glisse@inria.fr>
Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/ree.c b/gcc/ree.c
index 13a7a05..4627b4f 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -1025,11 +1025,11 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
return;
}
/* For vector mode extensions, ensure that all uses of the
- XEXP (src, 0) register are the same extension (both code
- and to which mode), as unlike integral extensions lowpart
- subreg of the sign/zero extended register are not equal
- to the original register, so we have to change all uses or
- none. */
+ XEXP (src, 0) register are in insn or debug insns, as unlike
+ integral extensions lowpart subreg of the sign/zero extended
+ register are not equal to the original register, so we have
+ to change all uses or none and the current code isn't able
+ to change them all at once in one transaction. */
else if (VECTOR_MODE_P (GET_MODE (XEXP (src, 0))))
{
if (idx == 0)
@@ -1046,15 +1046,7 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
break;
}
rtx_insn *use_insn = DF_REF_INSN (ref_link->ref);
- const_rtx use_set;
- if (use_insn == insn || DEBUG_INSN_P (use_insn))
- continue;
- if (!(use_set = single_set (use_insn))
- || !REG_P (SET_DEST (use_set))
- || GET_MODE (SET_DEST (use_set)) != GET_MODE (dest)
- || GET_CODE (SET_SRC (use_set)) != code
- || !rtx_equal_p (XEXP (SET_SRC (use_set), 0),
- XEXP (src, 0)))
+ if (use_insn != insn && !DEBUG_INSN_P (use_insn))
{
idx = -1U;
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 92ea4a5..ab6935c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-04-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/70542
+ * gcc.dg/torture/pr70542.c: New test.
+ * gcc.target/i386/avx2-pr70542.c: New test.
+
2016-04-05 Zdenek Sojka <zsojka@seznam.cz>
PR tree-optimization/70509
diff --git a/gcc/testsuite/gcc.dg/torture/pr70542.c b/gcc/testsuite/gcc.dg/torture/pr70542.c
new file mode 100644
index 0000000..ed7ab9d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr70542.c
@@ -0,0 +1,31 @@
+/* PR rtl-optimization/70542 */
+/* { dg-do run } */
+
+int a[113], d[113];
+short b[113], c[113], e[113];
+
+int
+main ()
+{
+ int i;
+ long j;
+ for (i = 0; i < 113; ++i)
+ {
+ a[i] = -636544305;
+ b[i] = -31804;
+ }
+ for (j = 1; j <= 112; ++j)
+ {
+ c[j] = b[j] >> ((a[j] & 1587842570) - 1510214139);
+ if (a[j])
+ d[j] = j;
+ e[j] = 7 << ((2312631697 - b[j]) - 2312663500);
+ }
+ asm volatile ("" : : : "memory");
+ if (c[0] || d[0] || e[0])
+ __builtin_abort ();
+ for (i = 1; i <= 112; ++i)
+ if (c[i] != -1 || d[i] != i || e[i] != 14)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx2-pr70542.c b/gcc/testsuite/gcc.target/i386/avx2-pr70542.c
new file mode 100644
index 0000000..2a95c5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx2-pr70542.c
@@ -0,0 +1,16 @@
+/* PR tree-optimization/70542 */
+/* { dg-do run } */
+/* { dg-options "-O3 -mavx2" } */
+/* { dg-require-effective-target avx2 } */
+
+#include "avx2-check.h"
+
+#define main() do_main ()
+
+#include "../../gcc.dg/torture/pr70542.c"
+
+static void
+avx2_test (void)
+{
+ do_main ();
+}