Commit a30e5345 by Sebastian Pop Committed by Sebastian Pop

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
parent 114dae43
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> 2010-12-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/46966 PR tree-optimization/46966
...@@ -2858,12 +2858,12 @@ initial_value_for_loop_phi (gimple phi) ...@@ -2858,12 +2858,12 @@ initial_value_for_loop_phi (gimple phi)
return NULL_TREE; return NULL_TREE;
} }
/* Detect commutative and associative scalar reductions starting at /* Detect commutative and associative scalar reductions belonging to
the loop closed phi node STMT. Return the phi node of the the SCOP starting at the loop closed phi node STMT. Return the phi
reduction cycle, or NULL. */ node of the reduction cycle, or NULL. */
static gimple 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) VEC (gimple, heap) **out)
{ {
if (scalar_close_phi_node_p (stmt)) if (scalar_close_phi_node_p (stmt))
...@@ -2880,7 +2880,10 @@ detect_commutative_reduction (gimple stmt, VEC (gimple, heap) **in, ...@@ -2880,7 +2880,10 @@ detect_commutative_reduction (gimple stmt, VEC (gimple, heap) **in,
gcc_assert (gimple_phi_num_args (stmt) == 1); gcc_assert (gimple_phi_num_args (stmt) == 1);
def = SSA_NAME_DEF_STMT (arg); 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) if (loop_phi)
{ {
...@@ -3019,7 +3022,7 @@ rewrite_commutative_reductions_out_of_ssa_close_phi (scop_p scop, ...@@ -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) *in = VEC_alloc (gimple, heap, 10);
VEC (gimple, heap) *out = 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; res = VEC_length (gimple, in) > 0;
if (res) if (res)
translate_scalar_reduction_to_array (scop, in, out); translate_scalar_reduction_to_array (scop, in, out);
......
...@@ -114,15 +114,22 @@ bb_in_sese_p (basic_block bb, sese region) ...@@ -114,15 +114,22 @@ bb_in_sese_p (basic_block bb, sese region)
return bb_in_region (bb, entry, exit); 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. */ /* Returns true when NAME is defined in REGION. */
static inline bool static inline bool
defined_in_sese_p (tree name, sese region) defined_in_sese_p (tree name, sese region)
{ {
gimple stmt = SSA_NAME_DEF_STMT (name); gimple stmt = SSA_NAME_DEF_STMT (name);
basic_block bb = gimple_bb (stmt); return stmt_in_sese_p (stmt, region);
return bb && bb_in_sese_p (bb, region);
} }
/* Returns true when LOOP is in REGION. */ /* Returns true when LOOP is in REGION. */
......
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> 2010-12-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/46966 PR tree-optimization/46966
......
/* { 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;
}
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