tree-ssa-math-opts.c (convert_plusminus_to_widen): Restrict handling of signedness differences to integer types.

gcc/
	* tree-ssa-math-opts.c (convert_plusminus_to_widen): Restrict
	handling of signedness differences to integer types.  Only build
	a new optype if type1 isn't correct.

From-SVN: r182554
This commit is contained in:
Richard Sandiford 2011-12-20 21:33:48 +00:00 committed by Richard Sandiford
parent 9d19c7329c
commit 3752b2ab7c
2 changed files with 11 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2011-12-20 Richard Sandiford <rdsandiford@googlemail.com>
* tree-ssa-math-opts.c (convert_plusminus_to_widen): Restrict
handling of signedness differences to integer types. Only build
a new optype if type1 isn't correct.
2011-12-20 Vladimir Makarov <vmakarov@redhat.com>
PR target/49865

View File

@ -2304,10 +2304,13 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
from_mode = TYPE_MODE (type1);
from_unsigned1 = TYPE_UNSIGNED (type1);
from_unsigned2 = TYPE_UNSIGNED (type2);
optype = type1;
/* There's no such thing as a mixed sign madd yet, so use a wider mode. */
if (from_unsigned1 != from_unsigned2)
{
if (!INTEGRAL_TYPE_P (type))
return false;
/* We can use a signed multiply with unsigned types as long as
there is a wider mode to use, or it is the smaller of the two
types that is unsigned. Note that type1 >= type2, always. */
@ -2322,6 +2325,8 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
}
from_unsigned1 = from_unsigned2 = false;
optype = build_nonstandard_integer_type (GET_MODE_PRECISION (from_mode),
false);
}
/* If there was a conversion between the multiply and addition
@ -2355,7 +2360,6 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
/* Verify that the machine can perform a widening multiply
accumulate in this mode/signedness combination, otherwise
this transformation is likely to pessimize code. */
optype = build_nonstandard_integer_type (from_mode, from_unsigned1);
this_optab = optab_for_tree_code (wmult_code, optype, optab_default);
handler = find_widening_optab_handler_and_mode (this_optab, to_mode,
from_mode, 0, &actual_mode);