From 4d6e2f33a437fc6ead8218bf5f0e2cdb3e834d9e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 22 Sep 2017 13:16:21 +0000 Subject: [PATCH] graphite-isl-ast-to-gimple.c (graphite_verify): Inline into single caller. 2017-09-22 Richard Biener * graphite-isl-ast-to-gimple.c (graphite_verify): Inline into single caller. (graphite_regenerate_ast_isl): Do not reset SCEV. Move debug print of no dependency loops ... * graphite.c (graphite_transform_loops): ... here. (canonicalize_loop_closed_ssa_form): Work from inner to outer loops. (same_close_phi_node, remove_duplicate_close_phi, make_close_phi_nodes_unique, defined_in_loop_p): Fold into ... (canonicalize_loop_closed_ssa): ... here and simplify. * graphite-optimize-isl.c: Include tree-vectorizer.h. (optimize_isl): Use dump_printf_loc to tell when we stopped optimizing because of an ISL timeout. * gcc.dg/graphite/scop-24.c: New testcase. From-SVN: r253094 --- gcc/ChangeLog | 16 +++ gcc/graphite-isl-ast-to-gimple.c | 27 +---- gcc/graphite-optimize-isl.c | 10 +- gcc/graphite.c | 127 ++++++++---------------- gcc/testsuite/ChangeLog | 4 + gcc/testsuite/gcc.dg/graphite/scop-24.c | 29 ++++++ 6 files changed, 101 insertions(+), 112 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/graphite/scop-24.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5b9217c4b0a..b4fc20be09a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2017-09-22 Richard Biener + + * graphite-isl-ast-to-gimple.c (graphite_verify): Inline into + single caller. + (graphite_regenerate_ast_isl): Do not reset SCEV. Move debug + print of no dependency loops ... + * graphite.c (graphite_transform_loops): ... here. + (canonicalize_loop_closed_ssa_form): Work from inner to outer + loops. + (same_close_phi_node, remove_duplicate_close_phi, + make_close_phi_nodes_unique, defined_in_loop_p): Fold into ... + (canonicalize_loop_closed_ssa): ... here and simplify. + * graphite-optimize-isl.c: Include tree-vectorizer.h. + (optimize_isl): Use dump_printf_loc to tell when we stopped + optimizing because of an ISL timeout. + 2017-09-22 Richard Biener PR tree-optimization/82291 diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index 1fb1bbd036a..8c5645b6f34 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -73,15 +73,6 @@ struct ast_build_info bool is_parallelizable; }; -/* Verifies properties that GRAPHITE should maintain during translation. */ - -static inline void -graphite_verify (void) -{ - checking_verify_loop_structure (); - checking_verify_loop_closed_ssa (true); -} - /* IVS_PARAMS maps isl's scattering and parameter identifiers to corresponding trees. */ @@ -2997,8 +2988,9 @@ graphite_regenerate_ast_isl (scop_p scop) delete_loop (loop); } - graphite_verify (); - scev_reset (); + /* Verifies properties that GRAPHITE should maintain during translation. */ + checking_verify_loop_structure (); + checking_verify_loop_closed_ssa (true); free (if_region->true_region); free (if_region->region); @@ -3008,19 +3000,6 @@ graphite_regenerate_ast_isl (scop_p scop) isl_ast_node_free (root_node); timevar_pop (TV_GRAPHITE_CODE_GEN); - if (dump_file && (dump_flags & TDF_DETAILS)) - { - loop_p loop; - int num_no_dependency = 0; - - FOR_EACH_LOOP (loop, 0) - if (loop->can_be_parallel) - num_no_dependency++; - - fprintf (dump_file, "%d loops carried no dependency.\n", - num_no_dependency); - } - return !t.codegen_error_p (); } diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c index 467503e1b62..ef41e55e173 100644 --- a/gcc/graphite-optimize-isl.c +++ b/gcc/graphite-optimize-isl.c @@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-data-ref.h" #include "params.h" #include "dumpfile.h" +#include "tree-vectorizer.h" #include "graphite.h" @@ -156,9 +157,12 @@ optimize_isl (scop_p scop) if (!scop->transformed_schedule || isl_ctx_last_error (scop->isl_context) == isl_error_quota) { - if (dump_file && dump_flags) - fprintf (dump_file, "isl timed out --param max-isl-operations=%d\n", - max_operations); + location_t loc = find_loop_location + (scop->scop_info->region.entry->dest->loop_father); + dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc, + "loop nest not optimized, optimization timed out " + "after %d operations [--param max-isl-operations]\n", + max_operations); return false; } diff --git a/gcc/graphite.c b/gcc/graphite.c index bce324092dd..a5a31c2c074 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -293,86 +293,6 @@ free_scops (vec scops) scops.release (); } -/* Returns true when P1 and P2 are close phis with the same - argument. */ - -static inline bool -same_close_phi_node (gphi *p1, gphi *p2) -{ - return (types_compatible_p (TREE_TYPE (gimple_phi_result (p1)), - TREE_TYPE (gimple_phi_result (p2))) - && operand_equal_p (gimple_phi_arg_def (p1, 0), - gimple_phi_arg_def (p2, 0), 0)); -} - -static void make_close_phi_nodes_unique (basic_block bb); - -/* Remove the close phi node at GSI and replace its rhs with the rhs - of PHI. */ - -static void -remove_duplicate_close_phi (gphi *phi, gphi_iterator *gsi) -{ - gimple *use_stmt; - use_operand_p use_p; - imm_use_iterator imm_iter; - tree res = gimple_phi_result (phi); - tree def = gimple_phi_result (gsi->phi ()); - - gcc_assert (same_close_phi_node (phi, gsi->phi ())); - - FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def) - { - FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) - SET_USE (use_p, res); - - update_stmt (use_stmt); - - /* It is possible that we just created a duplicate close-phi - for an already-processed containing loop. Check for this - case and clean it up. */ - if (gimple_code (use_stmt) == GIMPLE_PHI - && gimple_phi_num_args (use_stmt) == 1) - make_close_phi_nodes_unique (gimple_bb (use_stmt)); - } - - remove_phi_node (gsi, true); -} - -/* Removes all the close phi duplicates from BB. */ - -static void -make_close_phi_nodes_unique (basic_block bb) -{ - gphi_iterator psi; - - for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi)) - { - gphi_iterator gsi = psi; - gphi *phi = psi.phi (); - - /* At this point, PHI should be a close phi in normal form. */ - gcc_assert (gimple_phi_num_args (phi) == 1); - - /* Iterate over the next phis and remove duplicates. */ - gsi_next (&gsi); - while (!gsi_end_p (gsi)) - if (same_close_phi_node (phi, gsi.phi ())) - remove_duplicate_close_phi (phi, &gsi); - else - gsi_next (&gsi); - } -} - -/* Return true when NAME is defined in LOOP. */ - -static bool -defined_in_loop_p (tree name, loop_p loop) -{ - gcc_assert (TREE_CODE (name) == SSA_NAME); - return loop == loop_containing_stmt (SSA_NAME_DEF_STMT (name)); -} - /* Transforms LOOP to the canonical loop closed SSA form. */ static void @@ -380,20 +300,22 @@ canonicalize_loop_closed_ssa (loop_p loop) { edge e = single_exit (loop); basic_block bb; + gphi_iterator psi; if (!e || (e->flags & EDGE_COMPLEX)) return; bb = e->dest; + /* Make the loop-close PHI node BB contain only PHIs and have a + single predecessor. */ if (single_pred_p (bb)) { e = split_block_after_labels (bb); - make_close_phi_nodes_unique (e->src); + bb = e->src; } else { - gphi_iterator psi; basic_block close = split_edge (e); e = single_succ_edge (close); for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi)) @@ -404,7 +326,7 @@ canonicalize_loop_closed_ssa (loop_p loop) /* Only add close phi nodes for SSA_NAMEs defined in LOOP. */ if (TREE_CODE (arg) != SSA_NAME - || !defined_in_loop_p (arg, loop)) + || loop_containing_stmt (SSA_NAME_DEF_STMT (arg)) != loop) continue; tree res = copy_ssa_name (arg); @@ -413,8 +335,30 @@ canonicalize_loop_closed_ssa (loop_p loop) UNKNOWN_LOCATION); SET_USE (use_p, res); } + bb = close; + } + + /* Eliminate duplicates. This relies on processing loops from + innermost to outer. */ + for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi)) + { + gphi_iterator gsi = psi; + gphi *phi = psi.phi (); + + /* At this point, PHI should be a close phi in normal form. */ + gcc_assert (gimple_phi_num_args (phi) == 1); - make_close_phi_nodes_unique (close); + /* Iterate over the next phis and remove duplicates. */ + gsi_next (&gsi); + while (!gsi_end_p (gsi)) + if (gimple_phi_arg_def (phi, 0) == gimple_phi_arg_def (gsi.phi (), 0)) + { + replace_uses_by (gimple_phi_result (gsi.phi ()), + gimple_phi_result (phi)); + remove_phi_node (&gsi, true); + } + else + gsi_next (&gsi); } } @@ -443,7 +387,7 @@ static void canonicalize_loop_closed_ssa_form (void) { loop_p loop; - FOR_EACH_LOOP (loop, 0) + FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) canonicalize_loop_closed_ssa (loop); checking_verify_loop_closed_ssa (true); @@ -509,6 +453,19 @@ graphite_transform_loops (void) "loop nest optimized\n"); } + if (dump_file && (dump_flags & TDF_DETAILS)) + { + loop_p loop; + int num_no_dependency = 0; + + FOR_EACH_LOOP (loop, 0) + if (loop->can_be_parallel) + num_no_dependency++; + + fprintf (dump_file, "%d loops carried no dependency.\n", + num_no_dependency); + } + free_scops (scops); graphite_finalize (need_cfg_cleanup_p); the_isl_ctx = NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c2776af002..161c1bde1ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-09-22 Richard Biener + + * gcc.dg/graphite/scop-24.c: New testcase. + 2017-09-22 Richard Biener PR tree-optimization/82291 diff --git a/gcc/testsuite/gcc.dg/graphite/scop-24.c b/gcc/testsuite/gcc.dg/graphite/scop-24.c new file mode 100644 index 00000000000..a051a11983d --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/scop-24.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-Ofast -floop-nest-optimize" } */ + +typedef struct _IO_FILE FILE; +extern struct _IO_FILE *stderr; +typedef float real; +typedef real rvec[3]; +int rgbset (int); +void ps_box (int, int); +void plot_phi(char *fn,rvec box,int natoms,rvec x[],real phi[]) +{ + real phi_max,rr,gg,bb,fac,dx,x0,y0; + int i; + for(i=0; (i __builtin_fabs(phi[i])) + ? phi_max : __builtin_fabs(phi[i])); + if (__builtin_fabs(phi_max)<1.2e-38) + __builtin_fprintf(stderr, "X"); + ps_box((real)(fac*box[0]-1),(real)(fac*box[1]-1)); + for(i=0; (i