#ifdef ENABLE_CHECKING
verify_loop_structure ();
verify_dominators (CDI_DOMINATORS);
- verify_dominators (CDI_POST_DOMINATORS);
verify_loop_closed_ssa (true);
#endif
}
SCATTERING_DIMENSIONS vector. */
static inline int
-clast_name_to_index (const char *name, htab_t index_table)
+clast_name_to_index (clast_name_p name, htab_t index_table)
{
struct clast_name_index tmp;
PTR *slot;
+#ifdef CLOOG_ORG
+ gcc_assert (name->type == clast_expr_name);
+ tmp.name = ((const struct clast_name*) name)->name;
+#else
tmp.name = name;
+#endif
+
slot = htab_find_slot (index_table, &tmp, NO_INSERT);
if (slot && *slot)
Cloog representation. */
static tree
-clast_name_to_gcc (const char *name, sese region, VEC (tree, heap) *newivs,
+clast_name_to_gcc (clast_name_p name, sese region, VEC (tree, heap) *newivs,
htab_t newivs_index, htab_t params_index)
{
int index;
int p2 = TYPE_PRECISION (type2);
int precision;
tree type;
+ enum machine_mode mode;
if (p1 > p2)
precision = TYPE_UNSIGNED (type1) ? p1 * 2 : p1;
else
precision = TYPE_UNSIGNED (type2) ? p2 * 2 : p2;
- type = lang_hooks.types.type_for_size (precision, false);
+ if (precision > BITS_PER_WORD)
+ {
+ gloog_error = true;
+ return integer_type_node;
+ }
+
+ mode = smallest_mode_for_size (precision, MODE_INT);
+ precision = GET_MODE_PRECISION (mode);
+ type = build_nonstandard_integer_type (precision, false);
if (!type)
{
gloog_error = true;
return integer_type_node;
}
+
return type;
}
{
switch (e->type)
{
- case expr_term:
+ case clast_expr_term:
{
struct clast_term *t = (struct clast_term *) e;
return gmp_cst_to_tree (type, t->val);
}
- case expr_red:
+ case clast_expr_red:
{
struct clast_reduction *r = (struct clast_reduction *) e;
break;
}
- case expr_bin:
+ case clast_expr_bin:
{
struct clast_binary *b = (struct clast_binary *) e;
struct clast_expr *lhs = (struct clast_expr *) b->LHS;
if (mpz_sgn (y) < 0)
mpz_neg (y, y);
- while (mpz_cmp (y, x) > 0)
+ while (mpz_cmp (y, x) >= 0)
{
mpz_mul (x, x, two);
precision++;
gcc_assert (mpz_cmp (low, up) <= 0);
- if (mpz_sgn (low) < 0)
- unsigned_p = false;
-
prec_up = precision_for_value (up);
prec_int = precision_for_interval (low, up);
precision = MAX (prec_up, prec_int);
return integer_type_node;
}
+ if (mpz_sgn (low) <= 0)
+ unsigned_p = false;
+
+ else if (precision < BITS_PER_WORD)
+ {
+ unsigned_p = false;
+ precision++;
+ }
+
mode = smallest_mode_for_size (precision, MODE_INT);
precision = GET_MODE_PRECISION (mode);
type = build_nonstandard_integer_type (precision, unsigned_p);
sese region, VEC (tree, heap) *newivs,
htab_t newivs_index, htab_t params_index)
{
- gcc_assert (t->expr.type == expr_term);
+ gcc_assert (t->expr.type == clast_expr_term);
if (!t->var)
return gcc_type_for_value (t->val);
{
switch (e->type)
{
- case expr_term:
+ case clast_expr_term:
return gcc_type_for_clast_term ((struct clast_term *) e, region,
newivs, newivs_index, params_index);
- case expr_red:
+ case clast_expr_red:
return gcc_type_for_clast_red ((struct clast_reduction *) e, region,
newivs, newivs_index, params_index);
- case expr_bin:
+ case clast_expr_bin:
return gcc_type_for_clast_bin ((struct clast_binary *) e, region,
newivs, newivs_index, params_index);
ppl_max_for_le_pointset (ps, le, up);
ppl_min_for_le_pointset (ps, le, low);
+ ppl_delete_Linear_Expression (le);
+ ppl_delete_Pointset_Powerset_C_Polyhedron (ps);
}
/* Compute the type for the induction variable at LEVEL for the
/* Free the SCATTERING domain list. */
static void
-free_scattering (CloogDomainList *scattering)
+free_scattering (CloogScatteringList *scattering)
{
while (scattering)
{
- CloogDomain *dom = cloog_domain (scattering);
- CloogDomainList *next = cloog_next_domain (scattering);
+ CloogScattering *dom = cloog_scattering (scattering);
+ CloogScatteringList *next = cloog_next_scattering (scattering);
- cloog_domain_free (dom);
+ cloog_scattering_free (dom);
free (scattering);
scattering = next;
}
scattering);
}
+/* Initialize a CLooG input file. */
+
+static FILE *
+init_cloog_input_file (int scop_number)
+{
+ FILE *graphite_out_file;
+ int len = strlen (dump_base_name);
+ char *dumpname = XNEWVEC (char, len + 25);
+ char *s_scop_number = XNEWVEC (char, 15);
+
+ memcpy (dumpname, dump_base_name, len + 1);
+ strip_off_ending (dumpname, len);
+ sprintf (s_scop_number, ".%d", scop_number);
+ strcat (dumpname, s_scop_number);
+ strcat (dumpname, ".cloog");
+ graphite_out_file = fopen (dumpname, "w+b");
+
+ if (graphite_out_file == 0)
+ fatal_error ("can%'t open %s for writing: %m", dumpname);
+
+ free (dumpname);
+
+ return graphite_out_file;
+}
+
/* Build cloog program for SCoP. */
static void
-build_cloog_prog (scop_p scop, CloogProgram *prog, CloogOptions *options)
+build_cloog_prog (scop_p scop, CloogProgram *prog,
+ CloogOptions *options, CloogState *state ATTRIBUTE_UNUSED)
{
int i;
int max_nb_loops = scop_max_loop_depth (scop);
poly_bb_p pbb;
CloogLoop *loop_list = NULL;
CloogBlockList *block_list = NULL;
- CloogDomainList *scattering = NULL;
+ CloogScatteringList *scattering = NULL;
int nbs = 2 * max_nb_loops + 1;
int *scaldims;
cloog_program_set_context
- (prog, new_Cloog_Domain_from_ppl_Pointset_Powerset (SCOP_CONTEXT (scop)));
+ (prog, new_Cloog_Domain_from_ppl_Pointset_Powerset (SCOP_CONTEXT (scop),
+ scop_nb_params (scop), state));
nbs = unify_scattering_dimensions (scop);
scaldims = (int *) xmalloc (nbs * (sizeof (int)));
cloog_program_set_nb_scattdims (prog, nbs);
initialize_cloog_names (scop, prog);
- for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb); i++)
+ FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb)
{
CloogStatement *stmt;
CloogBlock *block;
+ CloogDomain *dom;
/* Dead code elimination: when the domain of a PBB is empty,
don't generate code for the PBB. */
continue;
/* Build the new statement and its block. */
- stmt = cloog_statement_alloc (pbb_index (pbb));
+ stmt = cloog_statement_alloc (state, pbb_index (pbb));
+ dom = new_Cloog_Domain_from_ppl_Pointset_Powerset (PBB_DOMAIN (pbb),
+ scop_nb_params (scop),
+ state);
block = cloog_block_alloc (stmt, 0, NULL, pbb_dim_iter_domain (pbb));
cloog_statement_set_usr (stmt, pbb);
/* Build loop list. */
{
- CloogLoop *new_loop_list = cloog_loop_malloc ();
+ CloogLoop *new_loop_list = cloog_loop_malloc (state);
cloog_loop_set_next (new_loop_list, loop_list);
- cloog_loop_set_domain
- (new_loop_list,
- new_Cloog_Domain_from_ppl_Pointset_Powerset (PBB_DOMAIN (pbb)));
+ cloog_loop_set_domain (new_loop_list, dom);
cloog_loop_set_block (new_loop_list, block);
loop_list = new_loop_list;
}
/* Build scattering list. */
{
/* XXX: Replace with cloog_domain_list_alloc(), when available. */
- CloogDomainList *new_scattering
- = (CloogDomainList *) xmalloc (sizeof (CloogDomainList));
+ CloogScatteringList *new_scattering
+ = (CloogScatteringList *) xmalloc (sizeof (CloogScatteringList));
ppl_Polyhedron_t scat;
- CloogDomain *dom;
+ CloogScattering *dom;
scat = PBB_TRANSFORMED_SCATTERING (pbb);
- dom = new_Cloog_Domain_from_ppl_Polyhedron (scat);
+ dom = new_Cloog_Scattering_from_ppl_Polyhedron
+ (scat, scop_nb_params (scop), pbb_nb_scattering_transform (pbb),
+ state);
- cloog_set_next_domain (new_scattering, scattering);
- cloog_set_domain (new_scattering, dom);
+ cloog_set_next_scattering (new_scattering, scattering);
+ cloog_set_scattering (new_scattering, dom);
scattering = new_scattering;
}
}
/* Extract scalar dimensions to simplify the code generation problem. */
cloog_program_extract_scalars (prog, scattering, options);
+ /* Dump a .cloog input file, if requested. This feature is only
+ enabled in the Graphite branch. */
+ if (0)
+ {
+ static size_t file_scop_number = 0;
+ FILE *cloog_file = init_cloog_input_file (file_scop_number);
+
+ cloog_program_dump_cloog (cloog_file, prog, scattering);
+ ++file_scop_number;
+ }
+
/* Apply scattering. */
cloog_program_scatter (prog, scattering, options);
free_scattering (scattering);
/* Return the options that will be used in GLOOG. */
static CloogOptions *
-set_cloog_options (void)
+set_cloog_options (CloogState *state ATTRIBUTE_UNUSED)
{
- CloogOptions *options = cloog_options_malloc ();
+ CloogOptions *options = cloog_options_malloc (state);
/* Change cloog output language to C. If we do use FORTRAN instead, cloog
will stop e.g. with "ERROR: unbounded loops not allowed in FORTRAN.", if
void
print_clast_stmt (FILE *file, struct clast_stmt *stmt)
{
- CloogOptions *options = set_cloog_options ();
+ CloogState *state = cloog_state_malloc ();
+ CloogOptions *options = set_cloog_options (state);
- pprint (file, stmt, 0, options);
+ clast_pprint (file, stmt, 0, options);
cloog_options_free (options);
+ cloog_state_free (state);
}
/* Prints STMT to STDERR. */
without a program. */
cloog_prog_clast
-scop_to_clast (scop_p scop)
+scop_to_clast (scop_p scop, CloogState *state)
{
- CloogOptions *options = set_cloog_options ();
+ CloogOptions *options = set_cloog_options (state);
cloog_prog_clast pc;
/* Connect new cloog prog generation to graphite. */
pc.prog = cloog_program_malloc ();
- build_cloog_prog (scop, pc.prog, options);
+ build_cloog_prog (scop, pc.prog, options, state);
pc.prog = cloog_program_generate (pc.prog, options);
pc.stmt = cloog_clast_create (pc.prog, options);
void
print_generated_program (FILE *file, scop_p scop)
{
- CloogOptions *options = set_cloog_options ();
- cloog_prog_clast pc = scop_to_clast (scop);
+ CloogState *state = cloog_state_malloc ();
+ CloogOptions *options = set_cloog_options (state);
+
+ cloog_prog_clast pc = scop_to_clast (scop, state);
fprintf (file, " (prog: \n");
cloog_program_print (file, pc.prog);
fprintf (file, " )\n");
fprintf (file, " (clast: \n");
- pprint (file, pc.stmt, 0, options);
+ clast_pprint (file, pc.stmt, 0, options);
fprintf (file, " )\n");
cloog_options_free (options);
ifsese if_region = NULL;
htab_t newivs_index, params_index;
cloog_prog_clast pc;
+ CloogState *state;
+ state = cloog_state_malloc ();
timevar_push (TV_GRAPHITE_CODE_GEN);
gloog_error = false;
- pc = scop_to_clast (scop);
+ pc = scop_to_clast (scop, state);
if (dump_file && (dump_flags & TDF_DETAILS))
{
num_no_dependency);
}
+ cloog_state_free (state);
+
return !gloog_error;
}
-
#endif