diff options
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 21 |
1 files changed, 17 insertions, 4 deletions
@@ -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 |