Makefile.in: Add the compilation of graphite-isl-ast-to-gimple.o.
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
This commit is contained in:
parent
3b37ccd4ff
commit
f6cc31036a
8 changed files with 217 additions and 1 deletions
|
@ -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):
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
133
gcc/graphite-isl-ast-to-gimple.c
Normal file
133
gcc/graphite-isl-ast-to-gimple.c
Normal file
|
@ -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;
|
||||
}
|
26
gcc/graphite-isl-ast-to-gimple.h
Normal file
26
gcc/graphite-isl-ast-to-gimple.h
Normal file
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
16
gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c
Normal file
16
gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c
Normal file
|
@ -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" } } */
|
Loading…
Add table
Reference in a new issue