tree-ssa-math-opts.c (convert_plusminus_to_widen): Call has_single_use () and not do the conversion if...

gcc/

	* tree-ssa-math-opts.c (convert_plusminus_to_widen): Call
	has_single_use () and not do the conversion if has_single_use ()
	returns false for the multiplication result.

gcc/testsuite/

	* gcc.dg/wmul-1.c: New test.

From-SVN: r204072
This commit is contained in:
Yufeng Zhang 2013-10-25 17:25:08 +00:00 committed by Yufeng Zhang
parent b02ef56d8d
commit 42917d01c0
4 changed files with 39 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2013-10-25 Yufeng Zhang <yufeng.zhang@arm.com>
* tree-ssa-math-opts.c (convert_plusminus_to_widen): Call
has_single_use () and not do the conversion if has_single_use ()
returns false for the multiplication result.
2013-10-25 David Malcolm <dmalcolm@redhat.com>
* tree.h (EXCEPTIONAL_CLASS_P): Rename parameter from "CODE"

View File

@ -1,3 +1,7 @@
2013-10-25 Yufeng Zhang <yufeng.zhang@arm.com>
* gcc.dg/wmul-1.c: New test.
2013-10-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58878

View File

@ -0,0 +1,19 @@
/* Not to fuse widening multiply with accumulate if the multiply has more than
one uses.
Note that for targets where pointer and int are of the same size or
widening multiply-and-accumulate is not available, this test just passes. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-widening_mul" } */
typedef int ArrT [10][10];
void
foo (ArrT Arr, int Idx)
{
Arr[Idx][Idx] = 1;
Arr[Idx + 10][Idx] = 2;
}
/* { dg-final { scan-tree-dump-not "WIDEN_MULT_PLUS_EXPR" "widening_mul" } } */
/* { dg-final { cleanup-tree-dump "widening_mul" } } */

View File

@ -2432,20 +2432,25 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple stmt,
It might also appear that it would be sufficient to use the existing
operands of the widening multiply, but that would limit the choice of
multiply-and-accumulate instructions. */
multiply-and-accumulate instructions.
If the widened-multiplication result has more than one uses, it is
probably wiser not to do the conversion. */
if (code == PLUS_EXPR
&& (rhs1_code == MULT_EXPR || rhs1_code == WIDEN_MULT_EXPR))
{
if (!is_widening_mult_p (rhs1_stmt, &type1, &mult_rhs1,
&type2, &mult_rhs2))
if (!has_single_use (rhs1)
|| !is_widening_mult_p (rhs1_stmt, &type1, &mult_rhs1,
&type2, &mult_rhs2))
return false;
add_rhs = rhs2;
conv_stmt = conv1_stmt;
}
else if (rhs2_code == MULT_EXPR || rhs2_code == WIDEN_MULT_EXPR)
{
if (!is_widening_mult_p (rhs2_stmt, &type1, &mult_rhs1,
&type2, &mult_rhs2))
if (!has_single_use (rhs2)
|| !is_widening_mult_p (rhs2_stmt, &type1, &mult_rhs1,
&type2, &mult_rhs2))
return false;
add_rhs = rhs1;
conv_stmt = conv2_stmt;