aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-03-13 13:09:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2001-03-13 13:09:31 +0100
commite5408e52405a113827a7558f2847dc5acb0bb710 (patch)
tree2eec962143d9f07ec03d7ae379aa9ee15d891eee /gcc/expr.c
parentf76a40c8dcf99fac9a9633a08e9049f470d23a73 (diff)
downloadgcc-e5408e52405a113827a7558f2847dc5acb0bb710.zip
gcc-e5408e52405a113827a7558f2847dc5acb0bb710.tar.gz
gcc-e5408e52405a113827a7558f2847dc5acb0bb710.tar.bz2
expr.c (store_expr): Add dont_store_target.
* expr.c (store_expr): Add dont_store_target. If temp is already in target before copying to reg, don't store it into target again. From-SVN: r40437
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index ff3f5bf..382bb23 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -3905,6 +3905,7 @@ store_expr (exp, target, want_value)
{
register rtx temp;
int dont_return_target = 0;
+ int dont_store_target = 0;
if (TREE_CODE (exp) == COMPOUND_EXPR)
{
@@ -3975,7 +3976,15 @@ store_expr (exp, target, want_value)
{
temp = expand_expr (exp, target, GET_MODE (target), 0);
if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode)
- temp = copy_to_reg (temp);
+ {
+ /* If TEMP is already in the desired TARGET, only copy it from
+ memory and don't store it there again. */
+ if (temp == target
+ || (rtx_equal_p (temp, target)
+ && ! side_effects_p (temp) && ! side_effects_p (target)))
+ dont_store_target = 1;
+ temp = copy_to_reg (temp);
+ }
dont_return_target = 1;
}
else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
@@ -4105,7 +4114,8 @@ store_expr (exp, target, want_value)
if ((! rtx_equal_p (temp, target)
|| (temp != target && (side_effects_p (temp)
|| side_effects_p (target))))
- && TREE_CODE (exp) != ERROR_MARK)
+ && TREE_CODE (exp) != ERROR_MARK
+ && ! dont_store_target)
{
target = protect_from_queue (target, 1);
if (GET_MODE (temp) != GET_MODE (target)