aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2011-12-20 21:33:48 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2011-12-20 21:33:48 +0000
commit3752b2ab7cddf20ed4c99638a3ecf6ecfed6cf55 (patch)
treee74b08aaa25c0a99375f97a1cca99fd996cbc03b
parent9d19c7329c6da0b59df04b32bca26f7d2c1ce20a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/tree-ssa-math-opts.c6
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);