From: Richard Henderson Date: Mon, 7 Apr 2003 22:05:49 +0000 (-0700) Subject: re PR rtl-optimization/8634 (incorrect code for inlining of memcpy under -O2) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c5a1e3d69af23fefe755f18ece4d76542766aa46;p=gcc.git re PR rtl-optimization/8634 (incorrect code for inlining of memcpy under -O2) PR opt/8634 * function.c (purge_addressof_1): Don't try arithmetics for unchanging memories. From-SVN: r65351 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 841d6ad4b71..b3cf6563425 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-04-07 Richard Henderson + + PR opt/8634 + * function.c (purge_addressof_1): Don't try arithmetics for + unchanging memories. + 2003-04-07 Janis Johnson * doc/sourcebuild.texi (Test Suites): Document testing support for diff --git a/gcc/function.c b/gcc/function.c index 40186b04a99..0b4f93fa627 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -3140,10 +3140,16 @@ purge_addressof_1 (loc, insn, force, store, ht) size_x = GET_MODE_BITSIZE (GET_MODE (x)); size_sub = GET_MODE_BITSIZE (GET_MODE (sub)); + /* Do not frob unchanging MEMs. If a later reference forces the + pseudo to the stack, we can wind up with multiple writes to + an unchanging memory, which is invalid. */ + if (RTX_UNCHANGING_P (x) && size_x != size_sub) + ; + /* Don't even consider working with paradoxical subregs, or the moral equivalent seen here. */ - if (size_x <= size_sub - && int_mode_for_mode (GET_MODE (sub)) != BLKmode) + else if (size_x <= size_sub + && int_mode_for_mode (GET_MODE (sub)) != BLKmode) { /* Do a bitfield insertion to mirror what would happen in memory. */