aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>2000-04-12 23:47:06 +0000
committerRichard Henderson <rth@gcc.gnu.org>2000-04-12 16:47:06 -0700
commit4fa48eaefa5e78fbecb27a73d4f622ea238a3628 (patch)
tree3e9531941b584cf074efa635b43ce94f684623ba
parentaea0083a2d142590d6468a02a03c0f5c43e75973 (diff)
downloadgcc-4fa48eaefa5e78fbecb27a73d4f622ea238a3628.zip
gcc-4fa48eaefa5e78fbecb27a73d4f622ea238a3628.tar.gz
gcc-4fa48eaefa5e78fbecb27a73d4f622ea238a3628.tar.bz2
Jeffrey A Law (law@cygnus.com)
* function.c (purge_addressof): Unshare any shared rtl created by purge_addressof and its children. From-SVN: r33133
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/function.c14
2 files changed, 19 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3f69496..6131937 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 <mark@codesourcery.com>
* function.c (aggregate_value_p): VOID_TYPE nodes are never
diff --git a/gcc/function.c b/gcc/function.c
index f31e20d..4b6f5ff 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