aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-09-22 13:16:21 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-09-22 13:16:21 +0000
commit4d6e2f33a437fc6ead8218bf5f0e2cdb3e834d9e (patch)
treebd7aa309b1e9ebd76aaef48e163ddf24e3f686ba /gcc
parent2402ffb6711e01619f6fff7dc6f55be650ef2e23 (diff)
downloadgcc-4d6e2f33a437fc6ead8218bf5f0e2cdb3e834d9e.zip
gcc-4d6e2f33a437fc6ead8218bf5f0e2cdb3e834d9e.tar.gz
gcc-4d6e2f33a437fc6ead8218bf5f0e2cdb3e834d9e.tar.bz2
graphite-isl-ast-to-gimple.c (graphite_verify): Inline into single caller.
2017-09-22 Richard Biener <rguenther@suse.de> * 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/graphite-isl-ast-to-gimple.c27
-rw-r--r--gcc/graphite-optimize-isl.c10
-rw-r--r--gcc/graphite.c127
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/graphite/scop-24.c29
6 files changed, 101 insertions, 112 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5b9217c..b4fc20b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,21 @@
2017-09-22 Richard Biener <rguenther@suse.de>
+ * 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 <rguenther@suse.de>
+
PR tree-optimization/82291
* tree-if-conv.c (predicate_mem_writes): Make sure to
remove writes in blocks predicated with false.
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 1fb1bbd..8c5645b 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 467503e..ef41e55 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 bce3240..a5a31c2 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -293,86 +293,6 @@ free_scops (vec<scop_p> 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 1c2776a..161c1bd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2017-09-22 Richard Biener <rguenther@suse.de>
+ * gcc.dg/graphite/scop-24.c: New testcase.
+
+2017-09-22 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/82291
* gcc.dg/torture/pr82291.c: New testcase.
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 0000000..a051a11
--- /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<natoms); i++)
+ phi_max=((phi_max > __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<natoms); i++)
+ {
+ rr=gg=bb=1.0;
+ if (phi[i] < 0)
+ gg=bb=(1.0+(phi[i]/phi_max));
+ else
+ rr=gg=(1.0-(phi[i]/phi_max));
+ rr=rgbset(rr);
+ }
+}