/* Translation of ISL AST to Gimple. Copyright (C) 2014 Free Software Foundation, Inc. Contributed by Roman Gareev . 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 . */ #include "config.h" #ifdef HAVE_cloog #include #include #include #include #endif #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" #ifdef HAVE_cloog #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; } #endif