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:
parent
b02ef56d8d
commit
42917d01c0
4 changed files with 39 additions and 5 deletions
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
19
gcc/testsuite/gcc.dg/wmul-1.c
Normal file
19
gcc/testsuite/gcc.dg/wmul-1.c
Normal 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" } } */
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue