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
This commit is contained in:
Richard Biener 2017-09-22 13:16:21 +00:00 committed by Richard Biener
parent 2402ffb671
commit 4d6e2f33a4
6 changed files with 121 additions and 132 deletions

View File

@ -1,3 +1,19 @@
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

View File

@ -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 ();
}

View File

@ -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;
}

View File

@ -293,59 +293,53 @@ 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. */
/* Transforms LOOP to the canonical loop closed SSA form. */
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)
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);
bb = e->src;
}
else
{
basic_block close = split_edge (e);
e = single_succ_edge (close);
for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
{
gphi *phi = psi.phi ();
use_operand_p use_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
tree arg = USE_FROM_PTR (use_p);
/* Only add close phi nodes for SSA_NAMEs defined in LOOP. */
if (TREE_CODE (arg) != SSA_NAME
|| loop_containing_stmt (SSA_NAME_DEF_STMT (arg)) != loop)
continue;
tree res = copy_ssa_name (arg);
gphi *close_phi = create_phi_node (res, close);
add_phi_arg (close_phi, arg, gimple_phi_arg_edge (close_phi, 0),
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;
@ -357,67 +351,17 @@ make_close_phi_nodes_unique (basic_block bb)
/* 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);
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);
}
}
/* 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
canonicalize_loop_closed_ssa (loop_p loop)
{
edge e = single_exit (loop);
basic_block bb;
if (!e || (e->flags & EDGE_COMPLEX))
return;
bb = e->dest;
if (single_pred_p (bb))
{
e = split_block_after_labels (bb);
make_close_phi_nodes_unique (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))
{
gphi *phi = psi.phi ();
use_operand_p use_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
tree arg = USE_FROM_PTR (use_p);
/* Only add close phi nodes for SSA_NAMEs defined in LOOP. */
if (TREE_CODE (arg) != SSA_NAME
|| !defined_in_loop_p (arg, loop))
continue;
tree res = copy_ssa_name (arg);
gphi *close_phi = create_phi_node (res, close);
add_phi_arg (close_phi, arg, gimple_phi_arg_edge (close_phi, 0),
UNKNOWN_LOCATION);
SET_USE (use_p, res);
}
make_close_phi_nodes_unique (close);
}
}
/* Converts the current loop closed SSA form to a canonical form
expected by the Graphite code generation.
@ -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;

View File

@ -1,3 +1,7 @@
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

View File

@ -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);
}
}