@@ -1,3 +1,15 @@
+2010-07-27 Sebastian Pop <sebastian.pop@amd.com>
+
+ * graphite-sese-to-poly.c (rewrite_cross_bb_scalar_deps): Returns
+ a bool.
+ (rewrite_commutative_reductions_out_of_ssa_close_phi): Same.
+ (rewrite_commutative_reductions_out_of_ssa_loop): Same.
+ (rewrite_cross_bb_scalar_deps_out_of_ssa): Call scev_reset_htab
+ when something has been changed.
+ (rewrite_commutative_reductions_out_of_ssa): Same.
+
+ * gcc.dg/graphite/id-26.c: New.
+
2010-07-26 Sebastian Pop <sebastian.pop@amd.com>
* graphite-sese-to-poly.c (propagate_expr_outside_region): Also
@@ -2427,9 +2427,10 @@ rewrite_cross_bb_scalar_dependence (tree zero_dim_array, tree def, gimple use_st
}
/* Rewrite the scalar dependences crossing the boundary of the BB
- containing STMT with an array. */
+ containing STMT with an array. Return true when something has been
+ changed. */
-static void
+static bool
rewrite_cross_bb_scalar_deps (sese region, gimple_stmt_iterator *gsi)
{
gimple stmt = gsi_stmt (*gsi);
@@ -2438,6 +2439,7 @@ rewrite_cross_bb_scalar_deps (sese region, gimple_stmt_iterator *gsi)
basic_block def_bb;
tree zero_dim_array = NULL_TREE;
gimple use_stmt;
+ bool res = false;
switch (gimple_code (stmt))
{
@@ -2450,27 +2452,29 @@ rewrite_cross_bb_scalar_deps (sese region, gimple_stmt_iterator *gsi)
break;
default:
- return;
+ return false;
}
if (!is_gimple_reg (def))
- return;
+ return false;
if (scev_analyzable_p (def, region))
{
loop_p loop = loop_containing_stmt (SSA_NAME_DEF_STMT (def));
tree scev = scalar_evolution_in_region (region, loop, def);
- if (tree_does_not_contain_chrecs (scev))
- propagate_expr_outside_region (def, scev, region);
+ if (tree_contains_chrecs (scev, NULL))
+ return false;
- return;
+ propagate_expr_outside_region (def, scev, region);
+ return true;
}
def_bb = gimple_bb (stmt);
FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
- if (gimple_code (use_stmt) == GIMPLE_PHI)
+ if (gimple_code (use_stmt) == GIMPLE_PHI
+ && (res = true))
{
gimple_stmt_iterator psi = gsi_for_stmt (use_stmt);
@@ -2483,7 +2487,8 @@ rewrite_cross_bb_scalar_deps (sese region, gimple_stmt_iterator *gsi)
FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
if (gimple_code (use_stmt) != GIMPLE_PHI
&& def_bb != gimple_bb (use_stmt)
- && !is_gimple_debug (use_stmt))
+ && !is_gimple_debug (use_stmt)
+ && (res = true))
{
if (!zero_dim_array)
{
@@ -2496,6 +2501,8 @@ rewrite_cross_bb_scalar_deps (sese region, gimple_stmt_iterator *gsi)
rewrite_cross_bb_scalar_dependence (zero_dim_array, def, use_stmt);
}
+
+ return res;
}
/* Rewrite out of SSA all the reduction phi nodes of SCOP. */
@@ -2506,16 +2513,21 @@ rewrite_cross_bb_scalar_deps_out_of_ssa (scop_p scop)
basic_block bb;
gimple_stmt_iterator psi;
sese region = SCOP_REGION (scop);
+ bool changed = false;
FOR_EACH_BB (bb)
if (bb_in_sese_p (bb, region))
for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi))
- rewrite_cross_bb_scalar_deps (region, &psi);
+ changed |= rewrite_cross_bb_scalar_deps (region, &psi);
- update_ssa (TODO_update_ssa);
+ if (changed)
+ {
+ scev_reset_htab ();
+ update_ssa (TODO_update_ssa);
#ifdef ENABLE_CHECKING
- verify_loop_closed_ssa (true);
+ verify_loop_closed_ssa (true);
#endif
+ }
}
/* Returns the number of pbbs that are in loops contained in SCOP. */
@@ -2901,26 +2913,31 @@ translate_scalar_reduction_to_array (VEC (gimple, heap) *in,
}
}
-/* Rewrites out of SSA a commutative reduction at CLOSE_PHI. */
+/* Rewrites out of SSA a commutative reduction at CLOSE_PHI. Returns
+ true when something has been changed. */
-static void
+static bool
rewrite_commutative_reductions_out_of_ssa_close_phi (gimple close_phi,
sbitmap reductions)
{
+ bool res;
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);
- if (VEC_length (gimple, in) > 0)
+ res = VEC_length (gimple, in) > 0;
+ if (res)
translate_scalar_reduction_to_array (in, out, reductions);
VEC_free (gimple, heap, in);
VEC_free (gimple, heap, out);
+ return res;
}
-/* Rewrites all the commutative reductions from LOOP out of SSA. */
+/* Rewrites all the commutative reductions from LOOP out of SSA.
+ Returns true when something has been changed. */
-static void
+static bool
rewrite_commutative_reductions_out_of_ssa_loop (loop_p loop,
sbitmap reductions,
sese region)
@@ -2928,16 +2945,19 @@ rewrite_commutative_reductions_out_of_ssa_loop (loop_p loop,
gimple_stmt_iterator gsi;
edge exit = single_exit (loop);
tree res;
+ bool changed = false;
if (!exit)
- return;
+ return false;
for (gsi = gsi_start_phis (exit->dest); !gsi_end_p (gsi); gsi_next (&gsi))
if ((res = gimple_phi_result (gsi_stmt (gsi)))
&& is_gimple_reg (res)
&& !scev_analyzable_p (res, region))
- rewrite_commutative_reductions_out_of_ssa_close_phi (gsi_stmt (gsi),
- reductions);
+ changed |= rewrite_commutative_reductions_out_of_ssa_close_phi
+ (gsi_stmt (gsi), reductions);
+
+ return changed;
}
/* Rewrites all the commutative reductions from SCOP out of SSA. */
@@ -2947,19 +2967,26 @@ rewrite_commutative_reductions_out_of_ssa (sese region, sbitmap reductions)
{
loop_iterator li;
loop_p loop;
+ bool changed = false;
if (!flag_associative_math)
return;
FOR_EACH_LOOP (li, loop, 0)
if (loop_in_sese_p (loop, region))
- rewrite_commutative_reductions_out_of_ssa_loop (loop, reductions, region);
+ changed |= rewrite_commutative_reductions_out_of_ssa_loop (loop,
+ reductions,
+ region);
- gsi_commit_edge_inserts ();
- update_ssa (TODO_update_ssa);
+ if (changed)
+ {
+ scev_reset_htab ();
+ gsi_commit_edge_inserts ();
+ update_ssa (TODO_update_ssa);
#ifdef ENABLE_CHECKING
- verify_loop_closed_ssa (true);
+ verify_loop_closed_ssa (true);
#endif
+ }
}
/* Java does not initialize long_long_integer_type_node. */
new file mode 100644
@@ -0,0 +1,24 @@
+int find_sad_16x16(int *intra_mode)
+{
+ int current_intra_sad_2,best_intra_sad2;
+ int M1[16][16],M0[4][4][4][4],M3[4],M4[4][4];
+ int i,j,k;
+ int ii,jj;
+ int up_avail, left_avail, left_up_avail;
+ for (i=0;i<17;i++)
+ if (left_up_avail)
+ {
+ for (jj=0;jj<4;jj++)
+ for (ii=0;ii<4;ii++)
+ for (j=0;j<4;j++)
+ for (i=0;i<4;i++)
+ {
+ M0[i][ii][2][jj]=M3[0]-M3[1];
+ M0[i][ii][1][jj]=M3[2]+M3[3];
+ current_intra_sad_2 += abs(M0[i][ii][j][jj]);
+ }
+
+ if(current_intra_sad_2 < best_intra_sad2)
+ best_intra_sad2=current_intra_sad_2;
+ }
+}