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:
parent
2402ffb671
commit
4d6e2f33a4
|
@ -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
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
167
gcc/graphite.c
167
gcc/graphite.c
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue