From 4fa48eaefa5e78fbecb27a73d4f622ea238a3628 Mon Sep 17 00:00:00 2001 From: Jeffrey A Law Date: Wed, 12 Apr 2000 23:47:06 +0000 Subject: [PATCH] Jeffrey A Law (law@cygnus.com) * function.c (purge_addressof): Unshare any shared rtl created by purge_addressof and its children. From-SVN: r33133 --- gcc/ChangeLog | 5 +++++ gcc/function.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f6949651c1..6131937a3c6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-04-12 Jeffrey A Law (law@cygnus.com) + + * function.c (purge_addressof): Unshare any shared rtl created by + purge_addressof and its children. + 2000-04-12 Mark Mitchell * function.c (aggregate_value_p): VOID_TYPE nodes are never diff --git a/gcc/function.c b/gcc/function.c index f31e20da448..4b6f5ff1753 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -3330,6 +3330,20 @@ purge_addressof (insns) hash_table_free (&ht); purge_bitfield_addressof_replacements = 0; purge_addressof_replacements = 0; + + /* REGs are shared. purge_addressof will destructively replace a REG + with a MEM, which creates shared MEMs. + + Unfortunately, the children of put_reg_into_stack assume that MEMs + referring to the same stack slot are shared (fixup_var_refs and + the associated hash table code). + + So, we have to do another unsharing pass after we have flushed any + REGs that had their address taken into the stack. + + It may be worth tracking whether or not we converted any REGs into + MEMs to avoid this overhead when it is not needed. */ + unshare_all_rtl_again (get_insns ()); } /* Pass through the INSNS of function FNDECL and convert virtual register -- 2.30.2