From: Bernd Schmidt Date: Mon, 18 Dec 2000 14:37:37 +0000 (+0000) Subject: Backport a fix that restricts sharing of some MEMs. X-Git-Tag: prereleases/gcc-2.95.3-test1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=860480e60ce6201847bcfc13b23bc374c5f035b8;p=thirdparty%2Fgcc.git Backport a fix that restricts sharing of some MEMs. From-SVN: r38350 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ced870d7e60..7334ad2af7de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2000-12-18 Bernd Schmidt + Mon Aug 30 01:02:09 1999 Jeffrey A Law (law@cygnus.com) + * emit-rtl.c (copy_rtx_if_shared): A MEM which references + virtual_stack_vars_rtx or virtual_incoming_args_rtx can not + be shared. + 2000-03-24 Geoff Keating * flow.c (propagate_block): When we delete an ADDR_VEC, also delete the BARRIER following it if there is one. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 222a1a937f09..54cee163738a 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1847,25 +1847,17 @@ copy_rtx_if_shared (orig) return x; case MEM: - /* A MEM is allowed to be shared if its address is constant - or is a constant plus one of the special registers. */ - if (CONSTANT_ADDRESS_P (XEXP (x, 0)) - || XEXP (x, 0) == virtual_stack_vars_rtx - || XEXP (x, 0) == virtual_incoming_args_rtx) + /* A MEM is allowed to be shared if its address is constant. + + We used to allow sharing of MEMs which referenced + virtual_stack_vars_rtx or virtual_incoming_args_rtx, but + that can lose. instantiate_virtual_regs will not unshare + the MEMs, and combine may change the structure of the address + because it looks safe and profitable in one context, but + in some other context it creates unrecognizable RTL. */ + if (CONSTANT_ADDRESS_P (XEXP (x, 0))) return x; - if (GET_CODE (XEXP (x, 0)) == PLUS - && (XEXP (XEXP (x, 0), 0) == virtual_stack_vars_rtx - || XEXP (XEXP (x, 0), 0) == virtual_incoming_args_rtx) - && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1))) - { - /* This MEM can appear in more than one place, - but its address better not be shared with anything else. */ - if (! x->used) - XEXP (x, 0) = copy_rtx_if_shared (XEXP (x, 0)); - x->used = 1; - return x; - } break; default: