aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-09-05 13:23:28 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-09-05 13:23:28 +0000
commit5a4c9a493153f6f579cd81905d0ab743dd88a33d (patch)
tree74df7584708383ed16be9de9238146fe383d781b /gcc
parentb101938436936b04ea3913c44cea7b58204a9765 (diff)
downloadgcc-5a4c9a493153f6f579cd81905d0ab743dd88a33d.zip
gcc-5a4c9a493153f6f579cd81905d0ab743dd88a33d.tar.gz
gcc-5a4c9a493153f6f579cd81905d0ab743dd88a33d.tar.bz2
re PR rtl-optimization/91656 (wrong code with -fgcse-after-reload)
2019-09-05 Richard Biener <rguenther@suse.de> PR rtl-optimization/91656 * postreload-gcse.c (record_last_mem_set_info): Revert addition of early out. * gcc.dg/torture/pr91656-1.c: New testcase. * gcc.dg/torture/pr91656-2.c: Likewise. * gcc.dg/torture/pr91656-3.c: Likewise. From-SVN: r275406
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/postreload-gcse.c3
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr91656-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr91656-2.c27
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr91656-3.c25
6 files changed, 89 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4f3d288..1de9622 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2019-09-05 Richard Biener <rguenther@suse.de>
+ PR rtl-optimization/91656
+ * postreload-gcse.c (record_last_mem_set_info): Revert addition
+ of early out.
+
+2019-09-05 Richard Biener <rguenther@suse.de>
+
PR middle-end/90501
* tree-inline.c (declare_return_variable): Mark the return
slot as addressable after building an address of it.
diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c
index 786678c..c62aee9 100644
--- a/gcc/postreload-gcse.c
+++ b/gcc/postreload-gcse.c
@@ -696,9 +696,6 @@ record_last_reg_set_info_regno (rtx_insn *insn, int regno)
static void
record_last_mem_set_info (rtx_insn *insn)
{
- if (!transp)
- return;
-
struct modifies_mem *list_entry;
list_entry = (struct modifies_mem *) obstack_alloc (&modifies_mem_obstack,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cdaa270..1d48a80 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2019-09-05 Richard Biener <rguenther@suse.de>
+
+ PR rtl-optimization/91656
+ * gcc.dg/torture/pr91656-1.c: New testcase.
+ * gcc.dg/torture/pr91656-2.c: Likewise.
+ * gcc.dg/torture/pr91656-3.c: Likewise.
+
2019-09-05 Nathan Sidwell <nathan@acm.org>
PR preprocessor/91639
diff --git a/gcc/testsuite/gcc.dg/torture/pr91656-1.c b/gcc/testsuite/gcc.dg/torture/pr91656-1.c
new file mode 100644
index 0000000..6c1e73c7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr91656-1.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fgcse-after-reload" } */
+
+int a, b, c, d, e;
+
+static __attribute__ ((__noipa__))
+int foo (int i)
+{
+ __builtin_memmove (&i, &e, 1);
+ if (a > 0)
+ i /= e;
+ e /= 5;
+ b = 0;
+ return i + c + d + 5;
+}
+
+int
+main (void)
+{
+ int x = foo (4);
+ if (x != 5)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr91656-2.c b/gcc/testsuite/gcc.dg/torture/pr91656-2.c
new file mode 100644
index 0000000..90374be
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr91656-2.c
@@ -0,0 +1,27 @@
+/* { dg-do run { target int128 } } */
+/* { dg-additional-options "-fgcse-after-reload" } */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef unsigned long long u64;
+int a, b, c;
+__int128 e;
+int
+d (u16 g)
+{
+ u64 f = __builtin_bswap64 (c);
+ f = g == a;
+ __builtin_memmove (&f, &e, 1);
+ e >>= b;
+ return a + f;
+}
+
+int
+main (void)
+{
+ __int128 x = d (0);
+ if (x != 0)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr91656-3.c b/gcc/testsuite/gcc.dg/torture/pr91656-3.c
new file mode 100644
index 0000000..8e65d24
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr91656-3.c
@@ -0,0 +1,25 @@
+/* { dg-do run { target int128 } } */
+/* { dg-additional-options "-fgcse-after-reload" } */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef unsigned long long u64;
+int a, b, c;
+int
+d (u16 e, u64 f)
+{
+ b |= e;
+ __builtin_memset (&f, e, 2);
+ a = (u16) - e >= 2 ? : __builtin_popcountll (f);
+ return a + c;
+}
+
+int
+main (void)
+{
+ __int128 x = d (~0, 0);
+ if (x != 16)
+ __builtin_abort ();
+ return 0;
+}