PR82816: Widening multiplies of bitfields
In this PR we tried to create a widening multiply of two 3-bit numbers, but that isn't a widening multiply at the optab/rtl level, since both the input and output still have the same mode. We could trap this either in is_widening_mult_p or (as the patch does) in the routines that actually ask for an optab. The latter seemed more natural since is_widening_mult_p doesn't otherwise care about modes. 2017-11-03 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ PR tree-optimization/82816 * tree-ssa-math-opts.c (convert_mult_to_widen): Return false if the modes of the two types are the same. (convert_plusminus_to_widen): Likewise. gcc/testsuite/ * gcc.c-torture/compile/pr82816.c: New test. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r254454
This commit is contained in:
parent
962b966886
commit
9134df2c6c
@ -1,3 +1,12 @@
|
||||
2017-11-06 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
||||
PR tree-optimization/82816
|
||||
* tree-ssa-math-opts.c (convert_mult_to_widen): Return false
|
||||
if the modes of the two types are the same.
|
||||
(convert_plusminus_to_widen): Likewise.
|
||||
|
||||
2017-11-06 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
* config/rs6000/altivec.md (*p9_vadu<mode>3) Rename to
|
||||
|
@ -1,3 +1,9 @@
|
||||
2017-11-06 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
||||
* gcc.c-torture/compile/pr82816.c: New test.
|
||||
|
||||
2017-11-06 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/powerpc/sad-vectorize-1.c: New file.
|
||||
|
12
gcc/testsuite/gcc.c-torture/compile/pr82816.c
Normal file
12
gcc/testsuite/gcc.c-torture/compile/pr82816.c
Normal file
@ -0,0 +1,12 @@
|
||||
struct A
|
||||
{
|
||||
int b:3;
|
||||
} d, e;
|
||||
|
||||
int c;
|
||||
|
||||
void f ()
|
||||
{
|
||||
char g = d.b * e.b;
|
||||
c = g;
|
||||
}
|
@ -3259,6 +3259,9 @@ convert_mult_to_widen (gimple *stmt, gimple_stmt_iterator *gsi)
|
||||
|
||||
to_mode = SCALAR_INT_TYPE_MODE (type);
|
||||
from_mode = SCALAR_INT_TYPE_MODE (type1);
|
||||
if (to_mode == from_mode)
|
||||
return false;
|
||||
|
||||
from_unsigned1 = TYPE_UNSIGNED (type1);
|
||||
from_unsigned2 = TYPE_UNSIGNED (type2);
|
||||
|
||||
@ -3449,6 +3452,9 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple *stmt,
|
||||
|
||||
to_mode = SCALAR_TYPE_MODE (type);
|
||||
from_mode = SCALAR_TYPE_MODE (type1);
|
||||
if (to_mode == from_mode)
|
||||
return false;
|
||||
|
||||
from_unsigned1 = TYPE_UNSIGNED (type1);
|
||||
from_unsigned2 = TYPE_UNSIGNED (type2);
|
||||
optype = type1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user