diff options
author | Richard Biener <rguenther@suse.de> | 2019-09-05 13:23:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-09-05 13:23:28 +0000 |
commit | 5a4c9a493153f6f579cd81905d0ab743dd88a33d (patch) | |
tree | 74df7584708383ed16be9de9238146fe383d781b /gcc | |
parent | b101938436936b04ea3913c44cea7b58204a9765 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/postreload-gcse.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr91656-1.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr91656-2.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr91656-3.c | 25 |
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; +} |