Commit 50034a36 by Sebastian Pop Committed by Sebastian Pop

Remove the temporary array for reductions written to memory.

2011-01-25  Sebastian Pop  <sebastian.pop@amd.com>

	* graphite-sese-to-poly.c
	(translate_scalar_reduction_to_array_for_stmt): Call unshare_expr.
	(close_phi_written_to_memory): New.
	(translate_scalar_reduction_to_array): Call close_phi_written_to_memory
	and unshare_expr.

	* gcc.dg/graphite/block-0.c: Un-XFAILed.
	* gcc.dg/graphite/block-1.c: Un-XFAILed.
	* gcc.dg/graphite/block-7.c: Un-XFAILed.
	* gcc.dg/graphite/block-8.c: Un-XFAILed.
	* gcc.dg/graphite/interchange-12.c: Un-XFAILed.
	* gcc.dg/graphite/interchange-14.c: Un-XFAILed.
	* gcc.dg/graphite/interchange-15.c: Un-XFAILed.
	* gcc.dg/graphite/interchange-8.c: Un-XFAILed.
	* gcc.dg/graphite/interchange-mvt.c: Un-XFAILed.

From-SVN: r169208
parent 0deada9e
2011-01-25 Sebastian Pop <sebastian.pop@amd.com> 2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-sese-to-poly.c
(translate_scalar_reduction_to_array_for_stmt): Call unshare_expr.
(close_phi_written_to_memory): New.
(translate_scalar_reduction_to_array): Call close_phi_written_to_memory
and unshare_expr.
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* doc/install.texi: Update the expected version number of PPL to 0.11. * doc/install.texi: Update the expected version number of PPL to 0.11.
* graphite-ppl.c (ppl_powerset_is_empty): Remove now dead code under * graphite-ppl.c (ppl_powerset_is_empty): Remove now dead code under
#if PPL_VERSION_MINOR < 11. #if PPL_VERSION_MINOR < 11.
......
2011-01-15 Sebastian Pop <sebastian.pop@amd.com> 2011-01-15 Sebastian Pop <sebastian.pop@amd.com>
* graphite-sese-to-poly.c
(translate_scalar_reduction_to_array_for_stmt): Call unshare_expr.
(close_phi_written_to_memory): New.
(translate_scalar_reduction_to_array): Call close_phi_written_to_memory
and unshare_expr.
* gcc.dg/graphite/block-0.c: Un-XFAILed.
* gcc.dg/graphite/block-1.c: Un-XFAILed.
* gcc.dg/graphite/block-7.c: Un-XFAILed.
* gcc.dg/graphite/block-8.c: Un-XFAILed.
* gcc.dg/graphite/interchange-12.c: Un-XFAILed.
* gcc.dg/graphite/interchange-14.c: Un-XFAILed.
* gcc.dg/graphite/interchange-15.c: Un-XFAILed.
* gcc.dg/graphite/interchange-8.c: Un-XFAILed.
* gcc.dg/graphite/interchange-mvt.c: Un-XFAILed.
2011-01-15 Sebastian Pop <sebastian.pop@amd.com>
* doc/install.texi: Update the expected version number of PPL to 0.11. * doc/install.texi: Update the expected version number of PPL to 0.11.
* graphite-ppl.c (ppl_powerset_is_empty): Remove now dead code under * graphite-ppl.c (ppl_powerset_is_empty): Remove now dead code under
#if PPL_VERSION_MINOR < 11. #if PPL_VERSION_MINOR < 11.
......
...@@ -2903,12 +2903,12 @@ translate_scalar_reduction_to_array_for_stmt (scop_p scop, tree red, ...@@ -2903,12 +2903,12 @@ translate_scalar_reduction_to_array_for_stmt (scop_p scop, tree red,
gimple stmt, gimple loop_phi) gimple stmt, gimple loop_phi)
{ {
tree res = gimple_phi_result (loop_phi); tree res = gimple_phi_result (loop_phi);
gimple assign = gimple_build_assign (res, red); gimple assign = gimple_build_assign (res, unshare_expr (red));
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
insert_stmts (scop, assign, NULL, gsi_after_labels (gimple_bb (loop_phi))); insert_stmts (scop, assign, NULL, gsi_after_labels (gimple_bb (loop_phi)));
assign = gimple_build_assign (red, gimple_assign_lhs (stmt)); assign = gimple_build_assign (unshare_expr (red), gimple_assign_lhs (stmt));
gsi = gsi_for_stmt (stmt); gsi = gsi_for_stmt (stmt);
gsi_next (&gsi); gsi_next (&gsi);
insert_stmts (scop, assign, NULL, gsi); insert_stmts (scop, assign, NULL, gsi);
...@@ -2949,6 +2949,29 @@ remove_phi (gimple phi) ...@@ -2949,6 +2949,29 @@ remove_phi (gimple phi)
remove_phi_node (&gsi, false); remove_phi_node (&gsi, false);
} }
/* When the result of a CLOSE_PHI is written to a memory location,
return a pointer to that memory reference, otherwise return
NULL_TREE. */
static tree
close_phi_written_to_memory (gimple close_phi)
{
imm_use_iterator imm_iter;
tree res, def = gimple_phi_result (close_phi);
use_operand_p use_p;
gimple stmt;
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
if ((stmt = USE_STMT (use_p))
&& gimple_code (stmt) == GIMPLE_ASSIGN
&& (res = gimple_assign_lhs (stmt))
&& (TREE_CODE (res) == ARRAY_REF
|| TREE_CODE (res) == MEM_REF))
return res;
return NULL_TREE;
}
/* Rewrite out of SSA the reduction described by the loop phi nodes /* Rewrite out of SSA the reduction described by the loop phi nodes
IN, and the close phi nodes OUT. IN and OUT are structured by loop IN, and the close phi nodes OUT. IN and OUT are structured by loop
levels like this: levels like this:
...@@ -2964,9 +2987,9 @@ translate_scalar_reduction_to_array (scop_p scop, ...@@ -2964,9 +2987,9 @@ translate_scalar_reduction_to_array (scop_p scop,
VEC (gimple, heap) *in, VEC (gimple, heap) *in,
VEC (gimple, heap) *out) VEC (gimple, heap) *out)
{ {
unsigned int i;
gimple loop_phi; gimple loop_phi;
tree red = NULL_TREE; unsigned int i = VEC_length (gimple, out) - 1;
tree red = close_phi_written_to_memory (VEC_index (gimple, out, i));
FOR_EACH_VEC_ELT (gimple, in, i, loop_phi) FOR_EACH_VEC_ELT (gimple, in, i, loop_phi)
{ {
...@@ -2980,8 +3003,10 @@ translate_scalar_reduction_to_array (scop_p scop, ...@@ -2980,8 +3003,10 @@ translate_scalar_reduction_to_array (scop_p scop,
PBB_IS_REDUCTION (pbb) = true; PBB_IS_REDUCTION (pbb) = true;
gcc_assert (close_phi == loop_phi); gcc_assert (close_phi == loop_phi);
red = create_zero_dim_array if (!red)
(gimple_assign_lhs (stmt), "Commutative_Associative_Reduction"); red = create_zero_dim_array
(gimple_assign_lhs (stmt), "Commutative_Associative_Reduction");
translate_scalar_reduction_to_array_for_stmt translate_scalar_reduction_to_array_for_stmt
(scop, red, stmt, VEC_index (gimple, in, 1)); (scop, red, stmt, VEC_index (gimple, in, 1));
continue; continue;
...@@ -2989,11 +3014,11 @@ translate_scalar_reduction_to_array (scop_p scop, ...@@ -2989,11 +3014,11 @@ translate_scalar_reduction_to_array (scop_p scop,
if (i == VEC_length (gimple, in) - 1) if (i == VEC_length (gimple, in) - 1)
{ {
insert_out_of_ssa_copy (scop, gimple_phi_result (close_phi), red, insert_out_of_ssa_copy (scop, gimple_phi_result (close_phi),
close_phi); unshare_expr (red), close_phi);
insert_out_of_ssa_copy_on_edge insert_out_of_ssa_copy_on_edge
(scop, edge_initial_value_for_loop_phi (loop_phi), (scop, edge_initial_value_for_loop_phi (loop_phi),
red, initial_value_for_loop_phi (loop_phi)); unshare_expr (red), initial_value_for_loop_phi (loop_phi));
} }
remove_phi (loop_phi); remove_phi (loop_phi);
......
2011-01-25 Sebastian Pop <sebastian.pop@amd.com> 2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* gcc.dg/graphite/block-0.c: Un-XFAILed.
* gcc.dg/graphite/block-1.c: Un-XFAILed.
* gcc.dg/graphite/block-7.c: Un-XFAILed.
* gcc.dg/graphite/block-8.c: Un-XFAILed.
* gcc.dg/graphite/interchange-12.c: Un-XFAILed.
* gcc.dg/graphite/interchange-14.c: Un-XFAILed.
* gcc.dg/graphite/interchange-15.c: Un-XFAILed.
* gcc.dg/graphite/interchange-8.c: Un-XFAILed.
* gcc.dg/graphite/interchange-mvt.c: Un-XFAILed.
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* gcc.dg/graphite/block-0.c: Add documentation. * gcc.dg/graphite/block-0.c: Add documentation.
* gcc.dg/graphite/block-4.c: Same. * gcc.dg/graphite/block-4.c: Same.
* gcc.dg/graphite/block-7.c: Same. * gcc.dg/graphite/block-7.c: Same.
......
...@@ -12,7 +12,7 @@ foo (void) ...@@ -12,7 +12,7 @@ foo (void)
int j; int j;
int i; int i;
/* This should be blocked. */ /* This is not blocked as it is not profitable. */
for (i = 0; i < N; i++) for (i = 0; i < N; i++)
for (j = 0; j < N; j++) for (j = 0; j < N; j++)
a[j] = a[i] + 1; a[j] = a[i] + 1;
...@@ -42,5 +42,5 @@ main (void) ...@@ -42,5 +42,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-not "will be loop blocked" "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -17,6 +17,7 @@ main (void) ...@@ -17,6 +17,7 @@ main (void)
int A[MAX * MAX]; int A[MAX * MAX];
int B[MAX * MAX]; int B[MAX * MAX];
/* These loops should be loop blocked. */
for (i = 0; i < MAX; i++) for (i = 0; i < MAX; i++)
for (j = 0; j < MAX; j++) for (j = 0; j < MAX; j++)
{ {
...@@ -24,10 +25,12 @@ main (void) ...@@ -24,10 +25,12 @@ main (void)
B[i*MAX + j] = j; B[i*MAX + j] = j;
} }
/* These loops should be loop blocked. */
for (i = 0; i < MAX; i++) for (i = 0; i < MAX; i++)
for (j = 0; j < MAX; j++) for (j = 0; j < MAX; j++)
A[i*MAX + j] += B[j*MAX + i]; A[i*MAX + j] += B[j*MAX + i];
/* These loops should be loop blocked. */
for(i = 0; i < MAX; i++) for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++) for(j = 0; j < MAX; j++)
sum += A[i*MAX + j]; sum += A[i*MAX + j];
...@@ -42,5 +45,5 @@ main (void) ...@@ -42,5 +45,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be loop blocked" 2 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be loop blocked" 3 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -53,5 +53,5 @@ main (void) ...@@ -53,5 +53,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -54,5 +54,5 @@ main (void) ...@@ -54,5 +54,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -14,8 +14,7 @@ matmult (void) ...@@ -14,8 +14,7 @@ matmult (void)
{ {
int i, j, k; int i, j, k;
/* This should be interchanged twice: (i, k) and (j, i). The /* Loops J and K should be interchanged. */
resulting nest should look like this (k, i, j). */
for (i = 0; i < N; i++) for (i = 0; i < N; i++)
for (j = 0; j < N; j++) for (j = 0; j < N; j++)
{ {
...@@ -54,5 +53,5 @@ main (void) ...@@ -54,5 +53,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 2 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -18,8 +18,7 @@ matmult (void) ...@@ -18,8 +18,7 @@ matmult (void)
for (j = 0; j < N; j++) for (j = 0; j < N; j++)
A[i][j] = 0; A[i][j] = 0;
/* This should be interchanged twice: (i, k) and (j, i). The /* Loops J and K should be interchanged. */
resulting nest should look like this (k, i, j). */
for (i = 0; i < N; i++) for (i = 0; i < N; i++)
for (j = 0; j < N; j++) for (j = 0; j < N; j++)
for (k = 0; k < N; k++) for (k = 0; k < N; k++)
...@@ -55,5 +54,5 @@ main (void) ...@@ -55,5 +54,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 2 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -48,6 +48,6 @@ main (void) ...@@ -48,6 +48,6 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -11,7 +11,8 @@ foo (void) ...@@ -11,7 +11,8 @@ foo (void)
{ {
int i, j, k, l; int i, j, k, l;
/* Loops K and L should be interchanged. */ /* Loops (L, J) are interchanged, and then loops (J and K) are
interchanged. The result is a nest starting with (K, J, L). */
for (l = 0; l < 4; l++) for (l = 0; l < 4; l++)
{ {
for (k = 0; k < 4; k++) for (k = 0; k < 4; k++)
...@@ -81,5 +82,5 @@ main (void) ...@@ -81,5 +82,5 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 2 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -58,6 +58,6 @@ main (void) ...@@ -58,6 +58,6 @@ main (void)
return 0; return 0;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
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