summaryrefslogtreecommitdiff
path: root/gcc/graphite-isl-ast-to-gimple.c
diff options
context:
space:
mode:
authorromangareev <romangareev@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-29 14:20:35 +0000
committerromangareev <romangareev@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-29 14:20:35 +0000
commit5eb0077df225a2d15ff86cc493f8caaed7b08c63 (patch)
tree95e882342ab8217fe3b1e2dff48e7f7f5620b2d7 /gcc/graphite-isl-ast-to-gimple.c
parent7136063b1a7a591994cd8b16cf482caa12ba5fc7 (diff)
downloadgcc-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.c133
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;
+}