diff options
author | Charles M. Hannum <root@ihack.net> | 1999-01-05 18:28:56 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1999-01-05 18:28:56 -0700 |
commit | 12f06d174c8ce495b31b4e64f399c1eeb2e83672 (patch) | |
tree | b7c9a0b5e5732c3e2352370cd06bdd08df1ce5df /gcc/expr.c | |
parent | b3fa7e9f2a52018d7d0a5b566d8fd1d11178e295 (diff) | |
download | gcc-12f06d174c8ce495b31b4e64f399c1eeb2e83672.tar.gz |
expr.c (store_expr): If the lhs is a memory location pointed to be a postincremented (or...
�
* expr.c (store_expr): If the lhs is a memory location pointed
to be a postincremented (or postdecremented) pointer, always
force the rhs to be evaluated into a pseudo.
From-SVN: r24507
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index 09a7eb1f16a..496764244ec 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -3528,21 +3528,6 @@ store_expr (exp, target, want_value) return want_value ? target : NULL_RTX; } - else if (want_value && GET_CODE (target) == MEM && ! MEM_VOLATILE_P (target) - && GET_MODE (target) != BLKmode) - /* If target is in memory and caller wants value in a register instead, - arrange that. Pass TARGET as target for expand_expr so that, - if EXP is another assignment, WANT_VALUE will be nonzero for it. - We know expand_expr will not use the target in that case. - Don't do this if TARGET is volatile because we are supposed - to write it and then read it. */ - { - temp = expand_expr (exp, cse_not_expected ? NULL_RTX : target, - GET_MODE (target), 0); - if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode) - temp = copy_to_reg (temp); - dont_return_target = 1; - } else if (queued_subexp_p (target)) /* If target contains a postincrement, let's not risk using it as the place to generate the rhs. */ @@ -3562,6 +3547,21 @@ store_expr (exp, target, want_value) if (! MEM_VOLATILE_P (target) && want_value) dont_return_target = 1; } + else if (want_value && GET_CODE (target) == MEM && ! MEM_VOLATILE_P (target) + && GET_MODE (target) != BLKmode) + /* If target is in memory and caller wants value in a register instead, + arrange that. Pass TARGET as target for expand_expr so that, + if EXP is another assignment, WANT_VALUE will be nonzero for it. + We know expand_expr will not use the target in that case. + Don't do this if TARGET is volatile because we are supposed + to write it and then read it. */ + { + temp = expand_expr (exp, cse_not_expected ? NULL_RTX : target, + GET_MODE (target), 0); + if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode) + temp = copy_to_reg (temp); + dont_return_target = 1; + } else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target)) /* If this is an scalar in a register that is stored in a wider mode than the declared mode, compute the result into its declared mode |