expr.c (store_expr): Don't generate load-store pair if TEMP is identical (according to ==) with TARGET.
* expr.c (store_expr): Don't generate load-store pair if TEMP is identical (according to ==) with TARGET. From-SVN: r23696
This commit is contained in:
parent
59e76fc6ba
commit
f3f2255a8c
@ -1,3 +1,8 @@
|
||||
Wed Nov 18 22:13:00 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
|
||||
|
||||
* 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 <amylaar@cygnus.co.uk>
|
||||
|
||||
* reload1.c (reload_reg_free_for_value_p): When considered reload
|
||||
|
15
gcc/expr.c
15
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);
|
||||
|
Loading…
Reference in New Issue
Block a user