diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1998-11-18 14:15:03 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1998-11-18 14:15:03 +0000 |
commit | f3f2255a8ce7120d21a2b7616ea53d45004dddea (patch) | |
tree | 8921dc600627277c943d30827bee035beec4e997 /gcc/expr.c | |
parent | 59e76fc6ba25be94f98194ec5e4accdac8a50315 (diff) | |
download | gcc-f3f2255a8ce7120d21a2b7616ea53d45004dddea.zip gcc-f3f2255a8ce7120d21a2b7616ea53d45004dddea.tar.gz gcc-f3f2255a8ce7120d21a2b7616ea53d45004dddea.tar.bz2 |
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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -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); |