From: Jakub Jelinek Date: Wed, 7 May 2014 16:04:44 +0000 (+0200) Subject: backport: re PR rtl-optimization/58365 (likely wrong code bug) X-Git-Tag: releases/gcc-4.7.4~103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd5422383c749efd33b1e112a74a5b0ccb043f59;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/58365 (likely wrong code bug) Backported from mainline 2013-09-10 Jakub Jelinek PR rtl-optimization/58365 * cfgcleanup.c (merge_memattrs): Also clear MEM_READONLY_P resp. MEM_NOTRAP_P if they differ, or set MEM_VOLATILE_P if it differs. * gcc.c-torture/execute/pr58365.c: New test. From-SVN: r210173 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 04f46d76a402..139a579103a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-09-10 Jakub Jelinek + + PR rtl-optimization/58365 + * cfgcleanup.c (merge_memattrs): Also clear MEM_READONLY_P + resp. MEM_NOTRAP_P if they differ, or set MEM_VOLATILE_P if + it differs. + 2013-08-30 Jakub Jelinek PR tree-optimization/58277 diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 6ff161425fe7..fae3aa656e57 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -922,6 +922,24 @@ merge_memattrs (rtx x, rtx y) set_mem_align (y, MEM_ALIGN (x)); } } + if (code == MEM) + { + if (MEM_READONLY_P (x) != MEM_READONLY_P (y)) + { + MEM_READONLY_P (x) = 0; + MEM_READONLY_P (y) = 0; + } + if (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)) + { + MEM_NOTRAP_P (x) = 0; + MEM_NOTRAP_P (y) = 0; + } + if (MEM_VOLATILE_P (x) != MEM_VOLATILE_P (y)) + { + MEM_VOLATILE_P (x) = 1; + MEM_VOLATILE_P (y) = 1; + } + } fmt = GET_RTX_FORMAT (code); for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b93701aa74f5..362317863b61 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-09-10 Jakub Jelinek + + PR rtl-optimization/58365 + * gcc.c-torture/execute/pr58365.c: New test. + 2013-09-09 Jakub Jelinek PR c++/58325 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58365.c b/gcc/testsuite/gcc.c-torture/execute/pr58365.c new file mode 100644 index 000000000000..1e6079d8429a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58365.c @@ -0,0 +1,35 @@ +/* PR rtl-optimization/58365 */ + +extern void abort (void); + +struct S +{ + volatile int a; + int b, c, d, e; +} f; +static struct S g, h; +int i = 1; + +char +foo (void) +{ + return i; +} + +static struct S +bar (void) +{ + if (foo ()) + return f; + return g; +} + +int +main () +{ + h = bar (); + f.b = 1; + if (h.b != 0) + abort (); + return 0; +}