fwprop.c (forward_propagate_and_simplify): After checking reg/subreg combinations, check whether the modes are the same.

gcc/
	* fwprop.c (forward_propagate_and_simplify): After checking
	reg/subreg combinations, check whether the modes are the same.

From-SVN: r179287
This commit is contained in:
Richard Sandiford 2011-09-27 17:24:03 +00:00 committed by Richard Sandiford
parent a744996112
commit 8e8af9b74d
2 changed files with 17 additions and 9 deletions

View File

@ -1,3 +1,8 @@
2011-09-27 Richard Sandiford <rdsandiford@googlemail.com>
* fwprop.c (forward_propagate_and_simplify): After checking
reg/subreg combinations, check whether the modes are the same.
2011-09-27 Bernd Schmidt <bernds@codesourcery.com>
Richard Sandiford <rdsandiford@googlemail.com>

View File

@ -1232,21 +1232,24 @@ forward_propagate_and_simplify (df_ref use, rtx def_insn, rtx def_set)
/* If def and use are subreg, check if they match. */
reg = DF_REF_REG (use);
if (GET_CODE (reg) == SUBREG
&& GET_CODE (SET_DEST (def_set)) == SUBREG
&& (SUBREG_BYTE (SET_DEST (def_set)) != SUBREG_BYTE (reg)
|| GET_MODE (SET_DEST (def_set)) != GET_MODE (reg)))
return false;
if (GET_CODE (reg) == SUBREG && GET_CODE (SET_DEST (def_set)) == SUBREG)
{
if (SUBREG_BYTE (SET_DEST (def_set)) != SUBREG_BYTE (reg))
return false;
}
/* Check if the def had a subreg, but the use has the whole reg. */
if (REG_P (reg) && GET_CODE (SET_DEST (def_set)) == SUBREG)
else if (REG_P (reg) && GET_CODE (SET_DEST (def_set)) == SUBREG)
return false;
/* Check if the use has a subreg, but the def had the whole reg. Unlike the
previous case, the optimization is possible and often useful indeed. */
if (GET_CODE (reg) == SUBREG && REG_P (SET_DEST (def_set)))
else if (GET_CODE (reg) == SUBREG && REG_P (SET_DEST (def_set)))
reg = SUBREG_REG (reg);
/* Make sure that we can treat REG as having the same mode as the
source of DEF_SET. */
if (GET_MODE (SET_DEST (def_set)) != GET_MODE (reg))
return false;
/* Check if the substitution is valid (last, because it's the most
expensive check!). */
src = SET_SRC (def_set);