diff --git a/gcc/Makefile.in b/gcc/Makefile.in index e74bb67..39cb7bd 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1250,6 +1250,7 @@ OBJS = \ graphite.o \ graphite-blocking.o \ graphite-clast-to-gimple.o \ + graphite-isl-ast-to-gimple.o \ graphite-dependences.o \ graphite-interchange.o \ graphite-optimize-isl.o \ diff --git a/gcc/common.opt b/gcc/common.opt index 5c3f834..731aaf5 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1250,6 +1250,19 @@ fgraphite-identity Common Report Var(flag_graphite_identity) Optimization Enable Graphite Identity transformation +fgraphite-code-generator= +Common Report RejectNegative Joined Optimization Enum(fgraphite_generator) Var(flag_graphite_code_gen) Init(FGRAPHITE_CODE_GEN_CLOOG) +Choose code generator of Graphite + +Enum +Name(fgraphite_generator) Type(enum fgraphite_generator) UnknownError(unknown code generator of graphite %qs) + +EnumValue +Enum(fgraphite_generator) String(isl) Value(FGRAPHITE_CODE_GEN_ISL) + +EnumValue +Enum(fgraphite_generator) String(cloog) Value(FGRAPHITE_CODE_GEN_CLOOG) + fhoist-adjacent-loads Common Report Var(flag_hoist_adjacent_loads) Optimization Enable hoisting adjacent loads to encourage generating conditional move diff --git a/gcc/flag-types.h b/gcc/flag-types.h index ed00046..5aa8b36 100644 --- a/gcc/flag-types.h +++ b/gcc/flag-types.h @@ -252,4 +252,10 @@ enum lto_partition_model { LTO_PARTITION_MAX = 4 }; +/* The code generator used by graphite */ +enum fgraphite_generator { + FGRAPHITE_CODE_GEN_ISL = 0, + FGRAPHITE_CODE_GEN_CLOOG = 1 +}; + #endif /* ! GCC_FLAG_TYPES_H */ diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c new file mode 100644 index 0000000..6ddaa28 --- /dev/null +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -0,0 +1,134 @@ +/* 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" + +#include +#include +#include +#include + +#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; +} diff --git a/gcc/graphite-isl-ast-to-gimple.h b/gcc/graphite-isl-ast-to-gimple.h new file mode 100644 index 0000000..0d98780 --- /dev/null +++ b/gcc/graphite-isl-ast-to-gimple.h @@ -0,0 +1,26 @@ +/* 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 +. */ + +#ifndef GCC_GRAPHITE_ISL_AST_TO_GIMPLE_H +#define GCC_GRAPHITE_ISL_AST_TO_GIMPLE_H + +extern bool graphite_regenerate_ast_isl (scop_p); + +#endif diff --git a/gcc/graphite.c b/gcc/graphite.c index 28909ca..cb71f82 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -73,6 +73,7 @@ along with GCC; see the file COPYING3. If not see #include "graphite-poly.h" #include "graphite-scop-detection.h" #include "graphite-clast-to-gimple.h" +#include "graphite-isl-ast-to-gimple.h" #include "graphite-sese-to-poly.h" #include "graphite-htab.h" @@ -301,7 +302,10 @@ graphite_transform_loops (void) if (POLY_SCOP_P (scop) && apply_poly_transforms (scop) - && graphite_regenerate_ast_cloog (scop, bb_pbb_mapping)) + && (((flag_graphite_code_gen == FGRAPHITE_CODE_GEN_ISL) + && graphite_regenerate_ast_isl (scop)) + || ((flag_graphite_code_gen == FGRAPHITE_CODE_GEN_CLOOG) + && graphite_regenerate_ast_cloog (scop, bb_pbb_mapping)))) need_cfg_cleanup_p = true; } diff --git a/gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c b/gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c new file mode 100644 index 0000000..1bb0349 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c @@ -0,0 +1,16 @@ +/* { dg-options "-O2 -fdump-tree-graphite-all -fgraphite-identity -fgraphite-code-generator=isl" } */ + +int +main (int n, int *a) +{ + int i, j; + + for (i = 0; i < n - 1; i++) + for (j = 0; j < n; j++) + a[j] = i + n; + + return 0; +} + +/* { dg-final { scan-tree-dump-times "ISL AST generated by ISL: \nfor \\(int c1 = 0; c1 < n - 1; c1 \\+= 1\\)\n for \\(int c3 = 0; c3 < n; c3 \\+= 1\\)\n S_5\\(c1, c3\\);" 1 "graphite"} } */ +/* { dg-final { cleanup-tree-dump "graphite" } } */