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-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h index fc5a679..5e23d94 100644 --- a/gcc/graphite-clast-to-gimple.h +++ b/gcc/graphite-clast-to-gimple.h @@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see #ifndef GCC_GRAPHITE_CLAST_TO_GIMPLE_H #define GCC_GRAPHITE_CLAST_TO_GIMPLE_H +#include "graphite-htab.h" + extern CloogState *cloog_state; /* Data structure for CLooG program representation. */ @@ -30,14 +32,7 @@ struct cloog_prog_clast { struct clast_stmt *stmt; }; -/* Stores BB's related PBB. */ - -struct bb_pbb_def -{ - basic_block bb; - poly_bb_p pbb; -}; - +extern bool gloog (scop_p, bb_pbb_htab_type); extern void debug_clast_stmt (struct clast_stmt *); extern void print_clast_stmt (FILE *, struct clast_stmt *); diff --git a/gcc/graphite-htab.h b/gcc/graphite-htab.h index d67dd0c..9f31fac 100644 --- a/gcc/graphite-htab.h +++ b/gcc/graphite-htab.h @@ -22,7 +22,14 @@ along with GCC; see the file COPYING3. If not see #define GCC_GRAPHITE_HTAB_H #include "hash-table.h" -#include "graphite-clast-to-gimple.h" + +/* Stores BB's related PBB. */ + +struct bb_pbb_def +{ + basic_block bb; + poly_bb_p pbb; +}; /* Hashtable helpers. */ @@ -52,7 +59,6 @@ bb_pbb_hasher::equal (const value_type *bp1, const compare_type *bp2) typedef hash_table bb_pbb_htab_type; -extern bool gloog (scop_p, bb_pbb_htab_type); poly_bb_p find_pbb_via_hash (bb_pbb_htab_type, basic_block); bool loop_is_parallel_p (loop_p, bb_pbb_htab_type, int); scop_p get_loop_body_pbbs (loop_p, bb_pbb_htab_type, vec *); diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c new file mode 100644 index 0000000..309ba28 --- /dev/null +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -0,0 +1,132 @@ +/* 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" +#include "graphite-htab.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. */ + +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 2e1f439..9aae503 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) - && gloog (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) + && gloog (scop, bb_pbb_mapping)))) need_cfg_cleanup_p = true; } diff --git a/gcc/testsuite/gcc.dg/graphite/scop-23.c b/gcc/testsuite/gcc.dg/graphite/scop-23.c new file mode 100644 index 0000000..868222a --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/scop-23.c @@ -0,0 +1,32 @@ +/* { dg-additional-options "-floop-parallelize-all -O2 -fgraphite-code-generator=isl" } */ + +#include + +#define N 16 + +int +main1 (int n, int *a) +{ + int i, j; + + for (i = 0; i < n - 1; i++) + for (j = 0; j < n; j++) + a[j] = i + n; + + for (j = 0; j < n; j++) + if (a[j] != i + n - 1) + __builtin_abort (); + + return 0; +} + +int +main () +{ + int a[N]; + main1 (N, a); + 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" } } */