From: Jakub Jelinek Date: Tue, 13 Mar 2001 12:09:31 +0000 (+0100) Subject: expr.c (store_expr): Add dont_store_target. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e5408e52405a113827a7558f2847dc5acb0bb710;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e3fa88eed7..6bde0bc234f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-03-13 Jakub Jelinek + + * 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. + 2001-03-12 Neil Booth * cppinternals.texi: Update for file handling. diff --git a/gcc/expr.c b/gcc/expr.c index ff3f5bf354d..382bb234916 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)