diff options
author | romangareev <romangareev@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-06-29 14:20:35 +0000 |
---|---|---|
committer | romangareev <romangareev@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-06-29 14:20:35 +0000 |
commit | 5eb0077df225a2d15ff86cc493f8caaed7b08c63 (patch) | |
tree | 95e882342ab8217fe3b1e2dff48e7f7f5620b2d7 /gcc/graphite-isl-ast-to-gimple.c | |
parent | 7136063b1a7a591994cd8b16cf482caa12ba5fc7 (diff) | |
download | gcc-5eb0077df225a2d15ff86cc493f8caaed7b08c63.tar.gz |
gcc/
* Makefile.in:
Add the compilation of graphite-isl-ast-to-gimple.o.
* common.opt:
Add new switch fgraphite-code-generator=[isl|cloog].
* flag-types.h:
Add new enum fgraphite_generator.
* graphite-isl-ast-to-gimple.c: New.
* graphite-isl-ast-to-gimple.h: New.
* graphite.c (graphite_transform_loops):
Add choice of Graphite code generator,
which depends on flag_graphite_code_gen.
gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c:
New testcase that checks that the dump is generated.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212124 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/graphite-isl-ast-to-gimple.c')
-rw-r--r-- | gcc/graphite-isl-ast-to-gimple.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c new file mode 100644 index 00000000000..6437474741e --- /dev/null +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -0,0 +1,133 @@ +/* Translation of ISL AST to Gimple. + Copyright (C) 2014 Free Software Foundation, Inc. + Contributed by Roman Gareev <gareevroman@gmail.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" + +#include <isl/set.h> +#include <isl/map.h> +#include <isl/union_map.h> +#include <isl/ast_build.h> + +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "basic-block.h" +#include "tree-ssa-alias.h" +#include "internal-fn.h" +#include "gimple-expr.h" +#include "is-a.h" +#include "gimple.h" +#include "gimple-iterator.h" +#include "tree-ssa-loop.h" +#include "tree-pass.h" +#include "cfgloop.h" +#include "tree-data-ref.h" +#include "sese.h" + +#include "graphite-poly.h" +#include "graphite-isl-ast-to-gimple.h" + +/* This flag is set when an error occurred during the translation of + ISL AST to Gimple. */ + +static bool graphite_regenerate_error; + +/* Prints NODE to FILE. */ + +void +print_isl_ast_node (FILE *file, __isl_keep isl_ast_node *node, + __isl_keep isl_ctx *ctx) +{ + isl_printer *prn = isl_printer_to_file (ctx, file); + prn = isl_printer_set_output_format (prn, ISL_FORMAT_C); + prn = isl_printer_print_ast_node (prn, node); + prn = isl_printer_print_str (prn, "\n"); + isl_printer_free (prn); +} + +/* Generates a build, which specifies the constraints on the parameters. */ + +static isl_ast_build * +generate_isl_context (scop_p scop) +{ + isl_set *context_isl = isl_set_params (isl_set_copy (scop->context)); + return isl_ast_build_from_context (context_isl); +} + +/* Generates a schedule, which specifies an order used to + visit elements in a domain. */ + +static isl_union_map * +generate_isl_schedule (scop_p scop) +{ + int i; + poly_bb_p pbb; + isl_union_map *schedule_isl = + isl_union_map_empty (isl_set_get_space (scop->context)); + + FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb) + { + /* Dead code elimination: when the domain of a PBB is empty, + don't generate code for the PBB. */ + if (isl_set_is_empty (pbb->domain)) + continue; + + isl_map *bb_schedule = isl_map_copy (pbb->transformed); + bb_schedule = isl_map_intersect_domain (bb_schedule, + isl_set_copy (pbb->domain)); + schedule_isl = + isl_union_map_union (schedule_isl, + isl_union_map_from_map (bb_schedule)); + } + return schedule_isl; +} + +static isl_ast_node * +scop_to_isl_ast (scop_p scop) +{ + isl_union_map *schedule_isl = generate_isl_schedule (scop); + isl_ast_build *context_isl = generate_isl_context (scop); + isl_ast_node *ast_isl = isl_ast_build_ast_from_schedule (context_isl, + schedule_isl); + isl_ast_build_free (context_isl); + return ast_isl; +} + +/* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for + the given SCOP. Return true if code generation succeeded. + + FIXME: This is not yet a full implementation of the code generator + with ISL ASTs. Generation of GIMPLE code is have to be added. */ + +bool +graphite_regenerate_ast_isl (scop_p scop) +{ + timevar_push (TV_GRAPHITE_CODE_GEN); + graphite_regenerate_error = false; + isl_ast_node *root_node = scop_to_isl_ast (scop); + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "\nISL AST generated by ISL: \n"); + print_isl_ast_node (dump_file, root_node, scop->ctx); + } + isl_ast_node_free (root_node); + timevar_pop (TV_GRAPHITE_CODE_GEN); + return !graphite_regenerate_error; +} |