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
This commit is contained in:
parent
b3fa7e9f2a
commit
12f06d174c
30
gcc/expr.c
30
gcc/expr.c
@ -3528,21 +3528,6 @@ store_expr (exp, target, want_value)
|
|||||||
|
|
||||||
return want_value ? target : NULL_RTX;
|
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))
|
else if (queued_subexp_p (target))
|
||||||
/* If target contains a postincrement, let's not risk
|
/* If target contains a postincrement, let's not risk
|
||||||
using it as the place to generate the rhs. */
|
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)
|
if (! MEM_VOLATILE_P (target) && want_value)
|
||||||
dont_return_target = 1;
|
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))
|
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
|
/* 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
|
than the declared mode, compute the result into its declared mode
|
||||||
|
Loading…
Reference in New Issue
Block a user