aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@superh.com>2002-04-24 23:52:16 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2002-04-25 00:52:16 +0100
commitfcae219ac449243231ebbe73eefddde824d7354b (patch)
tree1fd83762c98ea87999142b9608c409960384d4f7
parent0df9cfc799b0ff8a62f076bac4725a961f88ada2 (diff)
downloadgcc-fcae219ac449243231ebbe73eefddde824d7354b.zip
gcc-fcae219ac449243231ebbe73eefddde824d7354b.tar.gz
gcc-fcae219ac449243231ebbe73eefddde824d7354b.tar.bz2
loop.c (load_mems): Don't change the interface of called functions.
* loop.c (load_mems): Don't change the interface of called functions. * calls.c (expand_call): Take current_function_pretend_args_size into account when setting argblock for sibcalls. From-SVN: r52745
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/calls.c6
-rw-r--r--gcc/loop.c21
3 files changed, 30 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a090b49..37e68d7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Wed Apr 24 23:45:37 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * loop.c (load_mems): Don't change the interface of called functions.
+
+ * calls.c (expand_call): Take current_function_pretend_args_size
+ into account when setting argblock for sibcalls.
+
2002-04-24 Matt Hiller <hiller@redhat.com>
* cpplex.c: Remove conditional #undef of MULTIBYTE_CHARS.
diff --git a/gcc/calls.c b/gcc/calls.c
index a6c622c..6a95686 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -2709,6 +2709,12 @@ expand_call (exp, target, ignore)
if (pass == 0)
{
argblock = virtual_incoming_args_rtx;
+ argblock
+#ifdef STACK_GROWS_DOWNWARD
+ = plus_constant (argblock, current_function_pretend_args_size);
+#else
+ = plus_constant (argblock, -current_function_pretend_args_size);
+#endif
stored_args_map = sbitmap_alloc (args_size.constant);
sbitmap_zero (stored_args_map);
}
diff --git a/gcc/loop.c b/gcc/loop.c
index b9997da..5f18773 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -9784,9 +9784,20 @@ load_mems (loop)
&& rtx_equal_p (SET_DEST (set), mem))
SET_REGNO_REG_SET (&store_copies, REGNO (SET_SRC (set)));
- /* Replace the memory reference with the shadow register. */
- replace_loop_mems (p, loop_info->mems[i].mem,
- loop_info->mems[i].reg);
+ /* If this is a call which uses / clobbers this memory
+ location, we must not change the interface here. */
+ if (GET_CODE (p) == CALL_INSN
+ && reg_mentioned_p (loop_info->mems[i].mem,
+ CALL_INSN_FUNCTION_USAGE (p)))
+ {
+ cancel_changes (0);
+ loop_info->mems[i].optimize = 0;
+ break;
+ }
+ else
+ /* Replace the memory reference with the shadow register. */
+ replace_loop_mems (p, loop_info->mems[i].mem,
+ loop_info->mems[i].reg);
}
if (GET_CODE (p) == CODE_LABEL
@@ -9794,7 +9805,9 @@ load_mems (loop)
maybe_never = 1;
}
- if (! apply_change_group ())
+ if (! loop_info->mems[i].optimize)
+ ; /* We found we couldn't do the replacement, so do nothing. */
+ else if (! apply_change_group ())
/* We couldn't replace all occurrences of the MEM. */
loop_info->mems[i].optimize = 0;
else