Makefile.in: Add the compilation of graphite-isl-ast-to-gimple.o.
authorRoman Gareev <gareevroman@gmail.com>
Sun, 29 Jun 2014 14:20:35 +0000 (14:20 +0000)
committerRoman Gareev <romangareev@gcc.gnu.org>
Sun, 29 Jun 2014 14:20:35 +0000 (14:20 +0000)
gcc/
* Makefile.in:
Add the compilation of graphite-isl-ast-to-gimple.o.
* common.opt:
Add new switch fgraphite-code-generator=[isl|cloog].
* flag-types.h:
Add new enum fgraphite_generator.
* graphite-isl-ast-to-gimple.c: New.
* graphite-isl-ast-to-gimple.h: New.
* graphite.c (graphite_transform_loops):
Add choice of Graphite code generator,
which depends on flag_graphite_code_gen.

gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c:
New testcase that checks that the dump is generated.

From-SVN: r212124

gcc/ChangeLog
gcc/Makefile.in
gcc/common.opt
gcc/flag-types.h
gcc/graphite-isl-ast-to-gimple.c [new file with mode: 0644]
gcc/graphite-isl-ast-to-gimple.h [new file with mode: 0644]
gcc/graphite.c
gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c [new file with mode: 0644]

index dcf5f1566fa4d5fcaf64167e5c6edb57ae5a8023..7c34af8b3d5e5dde7da80f66bece165ddb1f2964 100644 (file)
@@ -1,3 +1,20 @@
+2014-06-29  Roman Gareev  <gareevroman@gmail.com>
+
+       * Makefile.in:
+       Add the compilation of graphite-isl-ast-to-gimple.o.
+       * common.opt:
+       Add new switch fgraphite-code-generator=[isl|cloog].
+       * flag-types.h:
+       Add new enum fgraphite_generator.
+       * graphite-isl-ast-to-gimple.c: New.
+       * graphite-isl-ast-to-gimple.h: New.
+       * graphite.c (graphite_transform_loops):
+       Add choice of Graphite code generator,
+       which depends on flag_graphite_code_gen.
+
+       testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c:
+       New testcase that checks that the dump is generated.
+
 2014-06-29  Roman Gareev  <gareevroman@gmail.com>
 
        * graphite-dependences.c (subtract_commutative_associative_deps): 
index 3d15eff267d6ccaea56d3a10d52729e1b61b7e21..af6554f82345c06683b83d0a81d2627eaa9a9251 100644 (file)
@@ -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 \
index 15371dfbe9b378e7d0c0fd724a63c903710f10a8..e9ceab165513704fbdd6b1ba929f46c63253d04a 100644 (file)
@@ -1250,6 +1250,19 @@ Enable in and out of Graphite representation
 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
index 4b8e33889a75c53f13c9e3fcb8d13743a0b20e7e..2849455d79393bc5355f6e7b89a16d9ff52a25fd 100644 (file)
@@ -254,4 +254,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 (file)
index 0000000..6437474
--- /dev/null
@@ -0,0 +1,133 @@
+/* Translation of ISL AST to Gimple.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Contributed by Roman Gareev <gareevroman@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 (file)
index 0000000..0d98780
--- /dev/null
@@ -0,0 +1,26 @@
+/* Translation of ISL AST to Gimple.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   Contributed by Roman Gareev <gareevroman@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
index 16f154cde2bef719cbcddf8f94d524482ae85de5..0e424d01a057278f554197a794abf6b3171a9a52 100644 (file)
@@ -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"
 
@@ -299,7 +300,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 (file)
index 0000000..65d5155
--- /dev/null
@@ -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_4\\(c1, c3\\);" 1 "graphite"} } */
+/* { dg-final { cleanup-tree-dump "graphite" } } */