diff options
author | Jakub Jelinek <jakub@redhat.com> | 2001-03-13 13:09:31 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2001-03-13 13:09:31 +0100 |
commit | e5408e52405a113827a7558f2847dc5acb0bb710 (patch) | |
tree | 2eec962143d9f07ec03d7ae379aa9ee15d891eee /gcc | |
parent | f76a40c8dcf99fac9a9633a08e9049f470d23a73 (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expr.c | 14 |
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e3fa88..6bde0bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-03-13 Jakub Jelinek <jakub@redhat.com> + + * 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 <neil@daikokuya.demon.co.uk> * cppinternals.texi: Update for file handling. @@ -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) |