Commit 574921c2 by Roman Gareev Committed by Roman Gareev

graphite-isl-ast-to-gimple.c: Add a new struct ast_build_info.

[gcc/]

	* graphite-isl-ast-to-gimple.c: Add a new struct ast_build_info.
	(translate_isl_ast_for_loop): Add checking of the 
	flag_loop_parallelize_all.
	(ast_build_before_for): New function.
	(scop_to_isl_ast): Add checking of the 
	flag_loop_parallelize_all.
	* graphite-dependences.c: Move the defenition of the
	scop_get_dependences from graphite-optimize-isl.c to this file.
	(apply_schedule_on_deps): Add checking of the ux's emptiness.
	(carries_deps): Add checking of the x's value.
	* graphite-optimize-isl.c: Move the defenition of the
	scop_get_dependences to graphite-dependences.c.
	* graphite-poly.h: Add declarations of scop_get_dependences
	and carries_deps.

From-SVN: r213619
parent b5975ceb
2014-08-05 Roman Gareev <gareevroman@gmail.com>
* graphite-isl-ast-to-gimple.c: Add a new struct ast_build_info.
(translate_isl_ast_for_loop): Add checking of the
flag_loop_parallelize_all.
(ast_build_before_for): New function.
(scop_to_isl_ast): Add checking of the
flag_loop_parallelize_all.
* graphite-dependences.c: Move the defenition of the
scop_get_dependences from graphite-optimize-isl.c to this file.
(apply_schedule_on_deps): Add checking of the ux's emptiness.
(carries_deps): Add checking of the x's value.
* graphite-optimize-isl.c: Move the defenition of the
scop_get_dependences to graphite-dependences.c.
* graphite-poly.h: Add declarations of scop_get_dependences
and carries_deps.
2014-08-04 Rohit <rohitarulraj@freescale.com> 2014-08-04 Rohit <rohitarulraj@freescale.com>
PR target/60102 PR target/60102
......
...@@ -53,6 +53,35 @@ along with GCC; see the file COPYING3. If not see ...@@ -53,6 +53,35 @@ along with GCC; see the file COPYING3. If not see
#include "graphite-poly.h" #include "graphite-poly.h"
#include "graphite-htab.h" #include "graphite-htab.h"
isl_union_map *
scop_get_dependences (scop_p scop)
{
isl_union_map *dependences;
if (!scop->must_raw)
compute_deps (scop, SCOP_BBS (scop),
&scop->must_raw, &scop->may_raw,
&scop->must_raw_no_source, &scop->may_raw_no_source,
&scop->must_war, &scop->may_war,
&scop->must_war_no_source, &scop->may_war_no_source,
&scop->must_waw, &scop->may_waw,
&scop->must_waw_no_source, &scop->may_waw_no_source);
dependences = isl_union_map_copy (scop->must_raw);
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->must_war));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->must_waw));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->may_raw));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->may_war));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->may_waw));
return dependences;
}
/* Add the constraints from the set S to the domain of MAP. */ /* Add the constraints from the set S to the domain of MAP. */
static isl_map * static isl_map *
...@@ -263,6 +292,11 @@ apply_schedule_on_deps (__isl_keep isl_union_map *schedule, ...@@ -263,6 +292,11 @@ apply_schedule_on_deps (__isl_keep isl_union_map *schedule,
ux = isl_union_map_copy (deps); ux = isl_union_map_copy (deps);
ux = isl_union_map_apply_domain (ux, isl_union_map_copy (trans)); ux = isl_union_map_apply_domain (ux, isl_union_map_copy (trans));
ux = isl_union_map_apply_range (ux, trans); ux = isl_union_map_apply_range (ux, trans);
if (isl_union_map_is_empty (ux))
{
isl_union_map_free (ux);
return NULL;
}
x = isl_map_from_union_map (ux); x = isl_map_from_union_map (ux);
return x; return x;
...@@ -300,7 +334,7 @@ no_violations (__isl_keep isl_union_map *schedule, ...@@ -300,7 +334,7 @@ no_violations (__isl_keep isl_union_map *schedule,
in which all the inputs before DEPTH occur at the same time as the in which all the inputs before DEPTH occur at the same time as the
output, and the input at DEPTH occurs before output. */ output, and the input at DEPTH occurs before output. */
static bool bool
carries_deps (__isl_keep isl_union_map *schedule, carries_deps (__isl_keep isl_union_map *schedule,
__isl_keep isl_union_map *deps, __isl_keep isl_union_map *deps,
int depth) int depth)
...@@ -315,6 +349,8 @@ carries_deps (__isl_keep isl_union_map *schedule, ...@@ -315,6 +349,8 @@ carries_deps (__isl_keep isl_union_map *schedule,
return false; return false;
x = apply_schedule_on_deps (schedule, deps); x = apply_schedule_on_deps (schedule, deps);
if (x == NULL)
return false;
space = isl_map_get_space (x); space = isl_map_get_space (x);
space = isl_space_range (space); space = isl_space_range (space);
lex = isl_map_lex_le (space); lex = isl_map_lex_le (space);
......
...@@ -73,6 +73,14 @@ static int max_mode_int_precision = ...@@ -73,6 +73,14 @@ static int max_mode_int_precision =
static int graphite_expression_type_precision = 128 <= max_mode_int_precision ? static int graphite_expression_type_precision = 128 <= max_mode_int_precision ?
128 : max_mode_int_precision; 128 : max_mode_int_precision;
struct ast_build_info
{
ast_build_info()
: is_parallelizable(false)
{ };
bool is_parallelizable;
};
/* Converts a GMP constant VAL to a tree and returns it. */ /* Converts a GMP constant VAL to a tree and returns it. */
static tree static tree
...@@ -435,7 +443,15 @@ translate_isl_ast_for_loop (loop_p context_loop, ...@@ -435,7 +443,15 @@ translate_isl_ast_for_loop (loop_p context_loop,
redirect_edge_succ_nodup (next_e, after); redirect_edge_succ_nodup (next_e, after);
set_immediate_dominator (CDI_DOMINATORS, next_e->dest, next_e->src); set_immediate_dominator (CDI_DOMINATORS, next_e->dest, next_e->src);
/* TODO: Add checking for the loop parallelism. */ if (flag_loop_parallelize_all)
{
isl_id *id = isl_ast_node_get_annotation (node_for);
gcc_assert (id);
ast_build_info *for_info = (ast_build_info *) isl_id_get_user (id);
loop->can_be_parallel = for_info->is_parallelizable;
free (for_info);
isl_id_free (id);
}
return last_e; return last_e;
} }
...@@ -834,6 +850,23 @@ generate_isl_schedule (scop_p scop) ...@@ -834,6 +850,23 @@ generate_isl_schedule (scop_p scop)
return schedule_isl; return schedule_isl;
} }
/* This method is executed before the construction of a for node. */
static __isl_give isl_id *
ast_build_before_for (__isl_keep isl_ast_build *build, void *user)
{
isl_union_map *dependences = (isl_union_map *) user;
ast_build_info *for_info = XNEW (struct ast_build_info);
isl_union_map *schedule = isl_ast_build_get_schedule (build);
isl_space *schedule_space = isl_ast_build_get_schedule_space (build);
int dimension = isl_space_dim (schedule_space, isl_dim_out);
for_info->is_parallelizable =
!carries_deps (schedule, dependences, dimension);
isl_union_map_free (schedule);
isl_space_free (schedule_space);
isl_id *id = isl_id_alloc (isl_ast_build_get_ctx (build), "", for_info);
return id;
}
static __isl_give isl_ast_node * static __isl_give isl_ast_node *
scop_to_isl_ast (scop_p scop, ivs_params &ip) scop_to_isl_ast (scop_p scop, ivs_params &ip)
{ {
...@@ -846,8 +879,18 @@ scop_to_isl_ast (scop_p scop, ivs_params &ip) ...@@ -846,8 +879,18 @@ scop_to_isl_ast (scop_p scop, ivs_params &ip)
add_parameters_to_ivs_params (scop, ip); add_parameters_to_ivs_params (scop, ip);
isl_union_map *schedule_isl = generate_isl_schedule (scop); isl_union_map *schedule_isl = generate_isl_schedule (scop);
isl_ast_build *context_isl = generate_isl_context (scop); isl_ast_build *context_isl = generate_isl_context (scop);
isl_union_map *dependences = NULL;
if (flag_loop_parallelize_all)
{
dependences = scop_get_dependences (scop);
context_isl =
isl_ast_build_set_before_each_for (context_isl, ast_build_before_for,
dependences);
}
isl_ast_node *ast_isl = isl_ast_build_ast_from_schedule (context_isl, isl_ast_node *ast_isl = isl_ast_build_ast_from_schedule (context_isl,
schedule_isl); schedule_isl);
if(dependences)
isl_union_map_free (dependences);
isl_ast_build_free (context_isl); isl_ast_build_free (context_isl);
return ast_isl; return ast_isl;
} }
...@@ -908,7 +951,20 @@ graphite_regenerate_ast_isl (scop_p scop) ...@@ -908,7 +951,20 @@ graphite_regenerate_ast_isl (scop_p scop)
ivs_params_clear (ip); ivs_params_clear (ip);
isl_ast_node_free (root_node); isl_ast_node_free (root_node);
timevar_pop (TV_GRAPHITE_CODE_GEN); timevar_pop (TV_GRAPHITE_CODE_GEN);
/* TODO: Add dump */
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, "\n%d loops carried no dependency.\n",
num_no_dependency);
}
return !graphite_regenerate_error; return !graphite_regenerate_error;
} }
#endif #endif
...@@ -65,35 +65,6 @@ scop_get_domains (scop_p scop ATTRIBUTE_UNUSED) ...@@ -65,35 +65,6 @@ scop_get_domains (scop_p scop ATTRIBUTE_UNUSED)
return res; return res;
} }
static isl_union_map *
scop_get_dependences (scop_p scop)
{
isl_union_map *dependences;
if (!scop->must_raw)
compute_deps (scop, SCOP_BBS (scop),
&scop->must_raw, &scop->may_raw,
&scop->must_raw_no_source, &scop->may_raw_no_source,
&scop->must_war, &scop->may_war,
&scop->must_war_no_source, &scop->may_war_no_source,
&scop->must_waw, &scop->may_waw,
&scop->must_waw_no_source, &scop->may_waw_no_source);
dependences = isl_union_map_copy (scop->must_raw);
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->must_war));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->must_waw));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->may_raw));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->may_war));
dependences = isl_union_map_union (dependences,
isl_union_map_copy (scop->may_waw));
return dependences;
}
/* getTileMap - Create a map that describes a n-dimensonal tiling. /* getTileMap - Create a map that describes a n-dimensonal tiling.
getTileMap creates a map from a n-dimensional scattering space into an getTileMap creates a map from a n-dimensional scattering space into an
......
...@@ -1551,4 +1551,12 @@ compute_deps (scop_p scop, vec<poly_bb_p> pbbs, ...@@ -1551,4 +1551,12 @@ compute_deps (scop_p scop, vec<poly_bb_p> pbbs,
isl_union_map **must_waw_no_source, isl_union_map **must_waw_no_source,
isl_union_map **may_waw_no_source); isl_union_map **may_waw_no_source);
isl_union_map *
scop_get_dependences (scop_p scop);
bool
carries_deps (__isl_keep isl_union_map *schedule,
__isl_keep isl_union_map *deps,
int depth);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment