> It seems the patch1/patch2 files you attach have the Content-Type: > application/octet-stream. This makes it impossible to view them inline. > Could you send them as text files? Just calling them patch1.patch or > patch1.txt should make this work.
Yes, sure.
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c index 9ac9b67..49b7bc6 100644 --- a/gcc/graphite-clast-to-gimple.c +++ b/gcc/graphite-clast-to-gimple.c @@ -109,7 +109,7 @@ value_max (mpz_t res, mpz_t v1, mpz_t v2) /* This flag is set when an error occurred during the translation of CLAST to Gimple. */ -static bool gloog_error; +static bool graphite_regenerate_error; /* Verifies properties that GRAPHITE should maintain during translation. */ @@ -363,7 +363,7 @@ max_precision_type (tree type1, tree type2) if (precision > BITS_PER_WORD) { - gloog_error = true; + graphite_regenerate_error = true; return integer_type_node; } @@ -373,7 +373,7 @@ max_precision_type (tree type1, tree type2) if (!type) { - gloog_error = true; + graphite_regenerate_error = true; return integer_type_node; } @@ -456,7 +456,7 @@ clast_to_gcc_expression (tree type, struct clast_expr *e, ivs_params_p ip) if (!POINTER_TYPE_P (type)) return fold_build2 (MULT_EXPR, type, cst, name); - gloog_error = true; + graphite_regenerate_error = true; return cst; } } @@ -535,7 +535,7 @@ type_for_interval (mpz_t bound_one, mpz_t bound_two) if (precision > BITS_PER_WORD) { - gloog_error = true; + graphite_regenerate_error = true; return integer_type_node; } @@ -558,7 +558,7 @@ type_for_interval (mpz_t bound_one, mpz_t bound_two) if (!type) { - gloog_error = true; + graphite_regenerate_error = true; return integer_type_node; } @@ -1112,7 +1112,7 @@ translate_clast_user (struct clast_user_stmt *stmt, edge next_e, build_iv_mapping (iv_map, stmt, ip); next_e = copy_bb_and_scalar_dependences (GBB_BB (gbb), ip->region, - next_e, iv_map, &gloog_error); + next_e, iv_map, &graphite_regenerate_error); iv_map.release (); new_bb = next_e->src; @@ -1488,7 +1488,7 @@ build_cloog_union_domain (scop_p scop, int nb_scattering_dims) return union_domain; } -/* Return the options that will be used in GLOOG. */ +/* Return the options that will be used in graphite_regenerate_ast_cloog. */ static CloogOptions * set_cloog_options (void) @@ -1503,7 +1503,7 @@ set_cloog_options (void) /* Enable complex equality spreading: removes dummy statements (assignments) in the generated code which repeats the substitution equations for statements. This is useless for - GLooG. */ + graphite_regenerate_ast_cloog. */ options->esp = 1; /* Silence CLooG to avoid failing tests due to debug output to stderr. */ @@ -1663,7 +1663,7 @@ debug_generated_program (scop_p scop) */ bool -gloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping) +graphite_regenerate_ast_cloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping) { auto_vec<tree, 10> newivs; loop_p context_loop; @@ -1674,7 +1674,7 @@ gloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping) struct ivs_params ip; timevar_push (TV_GRAPHITE_CODE_GEN); - gloog_error = false; + graphite_regenerate_error = false; params_index.create (10); @@ -1714,7 +1714,7 @@ gloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping) recompute_all_dominators (); graphite_verify (); - if (gloog_error) + if (graphite_regenerate_error) set_ifsese_condition (if_region, integer_zero_node); free (if_region->true_region); @@ -1739,6 +1739,6 @@ gloog (scop_p scop, bb_pbb_htab_type bb_pbb_mapping) num_no_dependency); } - return !gloog_error; + return !graphite_regenerate_error; } #endif diff --git a/gcc/graphite-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h index fc5a679..615cae8 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 graphite_regenerate_ast_cloog (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_hasher> 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<poly_bb_p> *); diff --git a/gcc/graphite.c b/gcc/graphite.c index 2e1f439..28909ca 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -301,7 +301,7 @@ graphite_transform_loops (void) if (POLY_SCOP_P (scop) && apply_poly_transforms (scop) - && gloog (scop, bb_pbb_mapping)) + && graphite_regenerate_ast_cloog (scop, bb_pbb_mapping)) need_cfg_cleanup_p = true; }
ChangeLog_entry1
Description: Binary data
ChangeLog_entry2
Description: Binary data
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 <gareevro...@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; +} 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 <gareevro...@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/>. */ + +#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" } } */