Commit 436d948e by Kazu Hirata Committed by Kazu Hirata

expr.c (store_expr): Remove code that is run when want_value & 1 is nonzero.

	* expr.c (store_expr): Remove code that is run when
	want_value & 1 is nonzero.

From-SVN: r89340
parent b235bd44
2004-10-20 Kazu Hirata <kazu@cs.umass.edu>
* expr.c (store_expr): Remove code that is run when
want_value & 1 is nonzero.
2004-10-20 Mark Mitchell <mark@codesourcery.com> 2004-10-20 Mark Mitchell <mark@codesourcery.com>
* gthr-posix.h (__gthread_active_p): Use __extension__ around cast * gthr-posix.h (__gthread_active_p): Use __extension__ around cast
......
...@@ -3738,14 +3738,6 @@ expand_assignment (tree to, tree from) ...@@ -3738,14 +3738,6 @@ expand_assignment (tree to, tree from)
/* Generate code for computing expression EXP, /* Generate code for computing expression EXP,
and storing the value into TARGET. and storing the value into TARGET.
If WANT_VALUE & 1 is nonzero, return a copy of the value
not in TARGET, so that we can be sure to use the proper
value in a containing expression even if TARGET has something
else stored in it. If possible, we copy the value through a pseudo
and return that pseudo. Or, if the value is constant, we try to
return the constant. In some cases, we return a pseudo
copied *from* TARGET.
If the mode is BLKmode then we may return TARGET itself. If the mode is BLKmode then we may return TARGET itself.
It turns out that in BLKmode it doesn't cause a problem. It turns out that in BLKmode it doesn't cause a problem.
because C has no operators that could combine two different because C has no operators that could combine two different
...@@ -3753,10 +3745,6 @@ expand_assignment (tree to, tree from) ...@@ -3753,10 +3745,6 @@ expand_assignment (tree to, tree from)
with no sequence point. Will other languages need this to with no sequence point. Will other languages need this to
be more thorough? be more thorough?
If WANT_VALUE & 1 is 0, we return NULL, to make sure
to catch quickly any cases where the caller uses the value
and fails to set WANT_VALUE.
If WANT_VALUE & 2 is set, this is a store into a call param on the If WANT_VALUE & 2 is set, this is a store into a call param on the
stack, and block moves may need to be treated specially. */ stack, and block moves may need to be treated specially. */
...@@ -3768,6 +3756,10 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -3768,6 +3756,10 @@ store_expr (tree exp, rtx target, int want_value)
int dont_return_target = 0; int dont_return_target = 0;
int dont_store_target = 0; int dont_store_target = 0;
/* The bit 0 of WANT_VALUE used to be used to request a value of the
expression. This feature has been removed. */
gcc_assert ((want_value & 1) == 0);
if (VOID_TYPE_P (TREE_TYPE (exp))) if (VOID_TYPE_P (TREE_TYPE (exp)))
{ {
/* C++ can generate ?: expressions with a throw expression in one /* C++ can generate ?: expressions with a throw expression in one
...@@ -3805,32 +3797,7 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -3805,32 +3797,7 @@ store_expr (tree exp, rtx target, int want_value)
emit_label (lab2); emit_label (lab2);
OK_DEFER_POP; OK_DEFER_POP;
return want_value & 1 ? target : NULL_RTX; return NULL_RTX;
}
else if ((want_value & 1) != 0
&& MEM_P (target)
&& ! 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, target, GET_MODE (target),
want_value & 2 ? EXPAND_STACK_PARM : EXPAND_NORMAL);
if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode)
{
/* 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)) else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
/* If this is a scalar in a register that is stored in a wider mode /* If this is a scalar in a register that is stored in a wider mode
...@@ -3840,14 +3807,13 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -3840,14 +3807,13 @@ store_expr (tree exp, rtx target, int want_value)
{ {
rtx inner_target = 0; rtx inner_target = 0;
/* If we don't want a value, we can do the conversion inside EXP, /* We can do the conversion inside EXP, which will often result
which will often result in some optimizations. Do the conversion in some optimizations. Do the conversion in two steps: first
in two steps: first change the signedness, if needed, then change the signedness, if needed, then the extend. But don't
the extend. But don't do this if the type of EXP is a subtype do this if the type of EXP is a subtype of something else
of something else since then the conversion might involve since then the conversion might involve more than just
more than just converting modes. */ converting modes. */
if ((want_value & 1) == 0 if (INTEGRAL_TYPE_P (TREE_TYPE (exp))
&& INTEGRAL_TYPE_P (TREE_TYPE (exp))
&& TREE_TYPE (TREE_TYPE (exp)) == 0 && TREE_TYPE (TREE_TYPE (exp)) == 0
&& (!lang_hooks.reduce_bit_field_operations && (!lang_hooks.reduce_bit_field_operations
|| (GET_MODE_PRECISION (GET_MODE (target)) || (GET_MODE_PRECISION (GET_MODE (target))
...@@ -3870,14 +3836,6 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -3870,14 +3836,6 @@ store_expr (tree exp, rtx target, int want_value)
temp = expand_expr (exp, inner_target, VOIDmode, temp = expand_expr (exp, inner_target, VOIDmode,
want_value & 2 ? EXPAND_STACK_PARM : EXPAND_NORMAL); want_value & 2 ? EXPAND_STACK_PARM : EXPAND_NORMAL);
/* If TEMP is a MEM and we want a result value, make the access
now so it gets done only once. Strictly speaking, this is
only necessary if the MEM is volatile, or if the address
overlaps TARGET. But not performing the load twice also
reduces the amount of rtl we generate and then have to CSE. */
if (MEM_P (temp) && (want_value & 1) != 0)
temp = copy_to_reg (temp);
/* If TEMP is a VOIDmode constant, use convert_modes to make /* If TEMP is a VOIDmode constant, use convert_modes to make
sure that we properly convert it. */ sure that we properly convert it. */
if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode) if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
...@@ -3892,26 +3850,7 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -3892,26 +3850,7 @@ store_expr (tree exp, rtx target, int want_value)
convert_move (SUBREG_REG (target), temp, convert_move (SUBREG_REG (target), temp,
SUBREG_PROMOTED_UNSIGNED_P (target)); SUBREG_PROMOTED_UNSIGNED_P (target));
/* If we promoted a constant, change the mode back down to match return NULL_RTX;
target. Otherwise, the caller might get confused by a result whose
mode is larger than expected. */
if ((want_value & 1) != 0 && GET_MODE (temp) != GET_MODE (target))
{
if (GET_MODE (temp) != VOIDmode)
{
temp = gen_lowpart_SUBREG (GET_MODE (target), temp);
SUBREG_PROMOTED_VAR_P (temp) = 1;
SUBREG_PROMOTED_UNSIGNED_SET (temp,
SUBREG_PROMOTED_UNSIGNED_P (target));
}
else
temp = convert_modes (GET_MODE (target),
GET_MODE (SUBREG_REG (target)),
temp, SUBREG_PROMOTED_UNSIGNED_P (target));
}
return want_value & 1 ? temp : NULL_RTX;
} }
else else
{ {
...@@ -3930,7 +3869,7 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -3930,7 +3869,7 @@ store_expr (tree exp, rtx target, int want_value)
&& REGNO (target) < FIRST_PSEUDO_REGISTER) && REGNO (target) < FIRST_PSEUDO_REGISTER)
&& !(MEM_P (target) && MEM_VOLATILE_P (target)) && !(MEM_P (target) && MEM_VOLATILE_P (target))
&& ! rtx_equal_p (temp, target) && ! rtx_equal_p (temp, target)
&& (CONSTANT_P (temp) || (want_value & 1) != 0)) && CONSTANT_P (temp))
dont_return_target = 1; dont_return_target = 1;
} }
...@@ -4077,24 +4016,7 @@ store_expr (tree exp, rtx target, int want_value) ...@@ -4077,24 +4016,7 @@ store_expr (tree exp, rtx target, int want_value)
} }
} }
/* If we don't want a value, return NULL_RTX. */
if ((want_value & 1) == 0)
return NULL_RTX; return NULL_RTX;
/* If we are supposed to return TEMP, do so as long as it isn't a MEM.
??? The latter test doesn't seem to make sense. */
else if (dont_return_target && !MEM_P (temp))
return temp;
/* Return TARGET itself if it is a hard register. */
else if ((want_value & 1) != 0
&& GET_MODE (target) != BLKmode
&& ! (REG_P (target)
&& REGNO (target) < FIRST_PSEUDO_REGISTER))
return copy_to_reg (target);
else
return target;
} }
/* Examine CTOR. Discover how many scalar fields are set to nonzero /* Examine CTOR. Discover how many scalar fields are set to nonzero
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment