diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2011-12-20 21:33:48 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2011-12-20 21:33:48 +0000 |
commit | 3752b2ab7cddf20ed4c99638a3ecf6ecfed6cf55 (patch) | |
tree | e74b08aaa25c0a99375f97a1cca99fd996cbc03b | |
parent | 9d19c7329c6da0b59df04b32bca26f7d2c1ce20a (diff) | |
download | gcc-3752b2ab7cddf20ed4c99638a3ecf6ecfed6cf55.zip gcc-3752b2ab7cddf20ed4c99638a3ecf6ecfed6cf55.tar.gz gcc-3752b2ab7cddf20ed4c99638a3ecf6ecfed6cf55.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9bbfbcb..4b4d10f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 06a4505..a00541f 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -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); |