Commit 42917d01 by Yufeng Zhang Committed by Yufeng Zhang

tree-ssa-math-opts.c (convert_plusminus_to_widen): Call has_single_use () and…

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
parent b02ef56d
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"
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
......
/* 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" } } */
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment