Fix PR46924: Do not detect reductions outside the current SESE region.
2010-12-16 Sebastian Pop <sebastian.pop@amd.com> PR tree-optimization/46924 * graphite-sese-to-poly.c (detect_commutative_reduction): Do not detect reductions outside the current SESE region. * sese.h (stmt_in_sese_p): New. (defined_in_sese_p): Call stmt_in_sese_p. * gcc.dg/graphite/pr46924.c: New. From-SVN: r167962
This commit is contained in:
parent
114dae4330
commit
a30e534546
@ -1,3 +1,11 @@
|
||||
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
PR tree-optimization/46924
|
||||
* graphite-sese-to-poly.c (detect_commutative_reduction): Do not
|
||||
detect reductions outside the current SESE region.
|
||||
* sese.h (stmt_in_sese_p): New.
|
||||
(defined_in_sese_p): Call stmt_in_sese_p.
|
||||
|
||||
2010-12-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/46966
|
||||
|
@ -2858,12 +2858,12 @@ initial_value_for_loop_phi (gimple phi)
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Detect commutative and associative scalar reductions starting at
|
||||
the loop closed phi node STMT. Return the phi node of the
|
||||
reduction cycle, or NULL. */
|
||||
/* Detect commutative and associative scalar reductions belonging to
|
||||
the SCOP starting at the loop closed phi node STMT. Return the phi
|
||||
node of the reduction cycle, or NULL. */
|
||||
|
||||
static gimple
|
||||
detect_commutative_reduction (gimple stmt, VEC (gimple, heap) **in,
|
||||
detect_commutative_reduction (scop_p scop, gimple stmt, VEC (gimple, heap) **in,
|
||||
VEC (gimple, heap) **out)
|
||||
{
|
||||
if (scalar_close_phi_node_p (stmt))
|
||||
@ -2880,7 +2880,10 @@ detect_commutative_reduction (gimple stmt, VEC (gimple, heap) **in,
|
||||
gcc_assert (gimple_phi_num_args (stmt) == 1);
|
||||
|
||||
def = SSA_NAME_DEF_STMT (arg);
|
||||
loop_phi = detect_commutative_reduction (def, in, out);
|
||||
if (!stmt_in_sese_p (def, SCOP_REGION (scop)))
|
||||
return NULL;
|
||||
|
||||
loop_phi = detect_commutative_reduction (scop, def, in, out);
|
||||
|
||||
if (loop_phi)
|
||||
{
|
||||
@ -3019,7 +3022,7 @@ rewrite_commutative_reductions_out_of_ssa_close_phi (scop_p scop,
|
||||
VEC (gimple, heap) *in = VEC_alloc (gimple, heap, 10);
|
||||
VEC (gimple, heap) *out = VEC_alloc (gimple, heap, 10);
|
||||
|
||||
detect_commutative_reduction (close_phi, &in, &out);
|
||||
detect_commutative_reduction (scop, close_phi, &in, &out);
|
||||
res = VEC_length (gimple, in) > 0;
|
||||
if (res)
|
||||
translate_scalar_reduction_to_array (scop, in, out);
|
||||
|
13
gcc/sese.h
13
gcc/sese.h
@ -114,15 +114,22 @@ bb_in_sese_p (basic_block bb, sese region)
|
||||
return bb_in_region (bb, entry, exit);
|
||||
}
|
||||
|
||||
/* Returns true when STMT is defined in REGION. */
|
||||
|
||||
static inline bool
|
||||
stmt_in_sese_p (gimple stmt, sese region)
|
||||
{
|
||||
basic_block bb = gimple_bb (stmt);
|
||||
return bb && bb_in_sese_p (bb, region);
|
||||
}
|
||||
|
||||
/* Returns true when NAME is defined in REGION. */
|
||||
|
||||
static inline bool
|
||||
defined_in_sese_p (tree name, sese region)
|
||||
{
|
||||
gimple stmt = SSA_NAME_DEF_STMT (name);
|
||||
basic_block bb = gimple_bb (stmt);
|
||||
|
||||
return bb && bb_in_sese_p (bb, region);
|
||||
return stmt_in_sese_p (stmt, region);
|
||||
}
|
||||
|
||||
/* Returns true when LOOP is in REGION. */
|
||||
|
@ -1,3 +1,8 @@
|
||||
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
PR tree-optimization/46924
|
||||
* gcc.dg/graphite/pr46924.c: New.
|
||||
|
||||
2010-12-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/46966
|
||||
|
18
gcc/testsuite/gcc.dg/graphite/pr46924.c
Normal file
18
gcc/testsuite/gcc.dg/graphite/pr46924.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* { dg-options "-O -fgraphite-identity -ffast-math -fno-tree-loop-im" } */
|
||||
|
||||
struct S
|
||||
{
|
||||
int n;
|
||||
float *a;
|
||||
};
|
||||
|
||||
float foo (struct S *s)
|
||||
{
|
||||
float f = 0, g=0;
|
||||
int i;
|
||||
for (i = 0; i < s->n; i++)
|
||||
f += s->a[i];
|
||||
for (i = 0; i < s->n; i++)
|
||||
;
|
||||
return f;
|
||||
}
|
Loading…
Reference in New Issue
Block a user