From 5a97f64aa8743d83a456fd647a628eab054c36c2 Mon Sep 17 00:00:00 2001 From: spop Date: Sat, 15 Jan 2011 09:10:28 +0000 Subject: [PATCH] Remove the temporary array for reductions written to memory. 2011-01-15 Sebastian Pop * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/graphite@168842 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog.graphite | 18 +++++++++++ gcc/graphite-sese-to-poly.c | 43 +++++++++++++++++++------ gcc/testsuite/gcc.dg/graphite/block-0.c | 4 +-- gcc/testsuite/gcc.dg/graphite/block-1.c | 5 ++- gcc/testsuite/gcc.dg/graphite/block-7.c | 2 +- gcc/testsuite/gcc.dg/graphite/block-8.c | 2 +- gcc/testsuite/gcc.dg/graphite/interchange-12.c | 5 ++- gcc/testsuite/gcc.dg/graphite/interchange-14.c | 5 ++- gcc/testsuite/gcc.dg/graphite/interchange-15.c | 2 +- gcc/testsuite/gcc.dg/graphite/interchange-8.c | 5 +-- gcc/testsuite/gcc.dg/graphite/interchange-mvt.c | 2 +- 11 files changed, 69 insertions(+), 24 deletions(-) diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index 8328af35a05..b0f609d0d7e 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,5 +1,23 @@ 2011-01-15 Sebastian Pop + * 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 + * 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 #if PPL_VERSION_MINOR < 11. diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index ae01490ae17..88eee71f757 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -2903,12 +2903,12 @@ translate_scalar_reduction_to_array_for_stmt (scop_p scop, tree red, gimple stmt, gimple 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; 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_next (&gsi); insert_stmts (scop, assign, NULL, gsi); @@ -2949,6 +2949,29 @@ remove_phi (gimple phi) 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 IN, and the close phi nodes OUT. IN and OUT are structured by loop levels like this: @@ -2964,9 +2987,9 @@ translate_scalar_reduction_to_array (scop_p scop, VEC (gimple, heap) *in, VEC (gimple, heap) *out) { - unsigned int i; 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) { @@ -2980,8 +3003,10 @@ translate_scalar_reduction_to_array (scop_p scop, PBB_IS_REDUCTION (pbb) = true; gcc_assert (close_phi == loop_phi); - red = create_zero_dim_array - (gimple_assign_lhs (stmt), "Commutative_Associative_Reduction"); + if (!red) + red = create_zero_dim_array + (gimple_assign_lhs (stmt), "Commutative_Associative_Reduction"); + translate_scalar_reduction_to_array_for_stmt (scop, red, stmt, VEC_index (gimple, in, 1)); continue; @@ -2989,11 +3014,11 @@ translate_scalar_reduction_to_array (scop_p scop, if (i == VEC_length (gimple, in) - 1) { - insert_out_of_ssa_copy (scop, gimple_phi_result (close_phi), red, - close_phi); + insert_out_of_ssa_copy (scop, gimple_phi_result (close_phi), + unshare_expr (red), close_phi); insert_out_of_ssa_copy_on_edge (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); diff --git a/gcc/testsuite/gcc.dg/graphite/block-0.c b/gcc/testsuite/gcc.dg/graphite/block-0.c index d77274395d3..9bf97126df8 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-0.c +++ b/gcc/testsuite/gcc.dg/graphite/block-0.c @@ -12,7 +12,7 @@ foo (void) int j; int i; - /* This should be blocked. */ + /* This is not blocked as it is not profitable. */ for (i = 0; i < N; i++) for (j = 0; j < N; j++) a[j] = a[i] + 1; @@ -42,5 +42,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-1.c b/gcc/testsuite/gcc.dg/graphite/block-1.c index 876d6f08360..d335345a699 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-1.c +++ b/gcc/testsuite/gcc.dg/graphite/block-1.c @@ -17,6 +17,7 @@ main (void) int A[MAX * MAX]; int B[MAX * MAX]; + /* These loops should be loop blocked. */ for (i = 0; i < MAX; i++) for (j = 0; j < MAX; j++) { @@ -24,10 +25,12 @@ main (void) B[i*MAX + j] = j; } + /* These loops should be loop blocked. */ for (i = 0; i < MAX; i++) for (j = 0; j < MAX; j++) A[i*MAX + j] += B[j*MAX + i]; + /* These loops should be loop blocked. */ for(i = 0; i < MAX; i++) for(j = 0; j < MAX; j++) sum += A[i*MAX + j]; @@ -42,5 +45,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-7.c b/gcc/testsuite/gcc.dg/graphite/block-7.c index 6f3365146c2..fbbe1f3ad51 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-7.c +++ b/gcc/testsuite/gcc.dg/graphite/block-7.c @@ -53,5 +53,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/block-8.c b/gcc/testsuite/gcc.dg/graphite/block-8.c index 4e7e5b5e2ae..9c1c9cebe83 100644 --- a/gcc/testsuite/gcc.dg/graphite/block-8.c +++ b/gcc/testsuite/gcc.dg/graphite/block-8.c @@ -54,5 +54,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-12.c b/gcc/testsuite/gcc.dg/graphite/interchange-12.c index f569b78fc03..fc27b4c5358 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-12.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-12.c @@ -14,8 +14,7 @@ matmult (void) { int i, j, k; - /* This should be interchanged twice: (i, k) and (j, i). The - resulting nest should look like this (k, i, j). */ + /* Loops J and K should be interchanged. */ for (i = 0; i < N; i++) for (j = 0; j < N; j++) { @@ -54,5 +53,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-14.c b/gcc/testsuite/gcc.dg/graphite/interchange-14.c index 00b7f82654d..53809b54d7d 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-14.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-14.c @@ -18,8 +18,7 @@ matmult (void) for (j = 0; j < N; j++) A[i][j] = 0; - /* This should be interchanged twice: (i, k) and (j, i). The - resulting nest should look like this (k, i, j). */ + /* Loops J and K should be interchanged. */ for (i = 0; i < N; i++) for (j = 0; j < N; j++) for (k = 0; k < N; k++) @@ -55,5 +54,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-15.c b/gcc/testsuite/gcc.dg/graphite/interchange-15.c index bfb8a731a20..9eeef661731 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-15.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-15.c @@ -48,6 +48,6 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-8.c b/gcc/testsuite/gcc.dg/graphite/interchange-8.c index e084bd8b5dd..ca99dbc13a1 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-8.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-8.c @@ -11,7 +11,8 @@ foo (void) { 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 (k = 0; k < 4; k++) @@ -81,5 +82,5 @@ main (void) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c b/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c index 61e73c1df6c..ee262e9f765 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-mvt.c @@ -58,6 +58,6 @@ main (void) 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" } } */ -- 2.11.4.GIT