From 14e396bbad6657569854c52f3c193f8d630d44f4 Mon Sep 17 00:00:00 2001 From: amylaar Date: Wed, 18 Nov 1998 14:15:03 +0000 Subject: [PATCH] * expr.c (store_expr): Don't generate load-store pair if TEMP is identical (according to ==) with TARGET. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23696 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bb0fe6b..59cb657 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Nov 18 22:13:00 1998 J"orn Rennecke + + * expr.c (store_expr): Don't generate load-store pair + if TEMP is identical (according to ==) with TARGET. + Tue Nov 17 22:25:16 1998 J"orn Rennecke * reload1.c (reload_reg_free_for_value_p): When considered reload diff --git a/gcc/expr.c b/gcc/expr.c index 1dd7cb7..3d46dea 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -3676,10 +3676,21 @@ store_expr (exp, target, want_value) /* If value was not generated in the target, store it there. Convert the value to TARGET's type first if nec. */ + /* If TEMP and TARGET compare equal according to rtx_equal_p, but + one or both of them are volatile memory refs, we have to distinguish + two cases: + - expand_expr has used TARGET. In this case, we must not generate + another copy. This can be detected by TARGET being equal according + to == . + - expand_expr has not used TARGET - that means that the source just + happens to have the same RTX form. Since temp will have been created + by expand_expr, it will compare unequal according to == . + We must generate a copy in this case, to reach the correct number + of volatile memory references. */ if ((! rtx_equal_p (temp, target) - || side_effects_p (temp) - || side_effects_p (target)) + || (temp != target && (side_effects_p (temp) + || side_effects_p (target)))) && TREE_CODE (exp) != ERROR_MARK) { target = protect_from_queue (target, 1); -- 2.7.4