> 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;
       }
 

Attachment: ChangeLog_entry1
Description: Binary data

Attachment: 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" } } */

Reply via email to