From c5a1e3d69af23fefe755f18ece4d76542766aa46 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 7 Apr 2003 15:05:49 -0700 Subject: 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 --- gcc/function.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'gcc/function.c') diff --git a/gcc/function.c b/gcc/function.c index 40186b0..0b4f93f 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. */ -- cgit v1.1