aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite-clast-to-gimple.c
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2011-07-21 22:56:50 +0000
committerSebastian Pop <sebastian.pop@amd.com>2011-07-21 22:56:50 +0000
commit73ea03b13f4495f26dafbdc11650ec7bd108b2a1 (patch)
tree94afacdb40de700aa3fbccc78d4e59cdea8dc563 /gcc/graphite-clast-to-gimple.c
parent44752143e10f705d84c234a11acd23262b2b8516 (diff)
Record the loop level that defines a clast_name.
2011-07-21 Sebastian Pop <sebastian.pop@amd.com> * graphite-clast-to-gimple.c (struct clast_name_index): Add level. (new_clast_name_index): Add level parameter. (clast_name_to_level): New. (save_clast_name_index): Add level parameter. (newivs_to_depth_to_newiv): Removed. (clast_name_to_gcc): Inlined newivs_to_depth_to_newiv. (graphite_create_new_loop): Add level parameter. Pass level to save_clast_name_index. (translate_clast_for_loop): Pass level to graphite_create_new_loop. (create_params_index): Pass level to save_clast_name_index. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@176598 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/graphite-clast-to-gimple.c')
-rw-r--r--gcc/graphite-clast-to-gimple.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index a8ac9c6bfa6..c442f1eb3d6 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -56,26 +56,55 @@ graphite_verify (void)
#endif
}
-/* Stores the INDEX in a vector for a given clast NAME. */
+/* Stores the INDEX in a vector and the loop nesting LEVEL for a given
+ clast NAME. */
typedef struct clast_name_index {
int index;
+ int level;
const char *name;
} *clast_name_index_p;
/* Returns a pointer to a new element of type clast_name_index_p built
- from NAME and INDEX. */
+ from NAME, LEVEL, and INDEX. */
static inline clast_name_index_p
-new_clast_name_index (const char *name, int index)
+new_clast_name_index (const char *name, int index, int level)
{
clast_name_index_p res = XNEW (struct clast_name_index);
res->name = name;
+ res->level = level;
res->index = index;
return res;
}
+/* For a given clast NAME, returns -1 if NAME is not in the
+ INDEX_TABLE, otherwise returns the loop level for the induction
+ variable NAME, or if it is a parameter, the parameter number in the
+ vector of parameters. */
+
+static inline int
+clast_name_to_level (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)
+ return ((struct clast_name_index *) *slot)->level;
+
+ return -1;
+}
+
/* For a given clast NAME, returns -1 if it does not correspond to any
parameter, or otherwise, returns the index in the PARAMS or
SCATTERING_DIMENSIONS vector. */
@@ -101,10 +130,11 @@ clast_name_to_index (clast_name_p name, htab_t index_table)
return -1;
}
-/* Records in INDEX_TABLE the INDEX for NAME. */
+/* Records in INDEX_TABLE the INDEX and LEVEL for NAME. */
static inline void
-save_clast_name_index (htab_t index_table, const char *name, int index)
+save_clast_name_index (htab_t index_table, const char *name,
+ int index, int level)
{
struct clast_name_index tmp;
PTR *slot;
@@ -116,7 +146,7 @@ save_clast_name_index (htab_t index_table, const char *name, int index)
{
free (*slot);
- *slot = new_clast_name_index (name, index);
+ *slot = new_clast_name_index (name, index, level);
}
}
@@ -139,15 +169,6 @@ eq_clast_name_indexes (const void *e1, const void *e2)
return (elt1->name == elt2->name);
}
-/* For a given scattering dimension, return the new induction variable
- associated to it. */
-
-static inline tree
-newivs_to_depth_to_newiv (VEC (tree, heap) *newivs, int depth)
-{
- return VEC_index (tree, newivs, depth);
-}
-
/* Returns the tree variable from the name NAME that was given in
@@ -172,7 +193,7 @@ clast_name_to_gcc (clast_name_p name, sese region, VEC (tree, heap) *newivs,
index = clast_name_to_index (name, newivs_index);
gcc_assert (index >= 0);
- return newivs_to_depth_to_newiv (newivs, index);
+ return VEC_index (tree, newivs, index);
}
/* Returns the signed maximal precision type for expressions TYPE1 and TYPE2. */
@@ -703,7 +724,7 @@ graphite_create_new_loop (edge entry_edge,
struct clast_for *stmt,
loop_p outer, VEC (tree, heap) **newivs,
htab_t newivs_index,
- tree type, tree lb, tree ub)
+ tree type, tree lb, tree ub, int level)
{
tree stride = gmp_cst_to_tree (type, stmt->stride);
tree ivvar = create_tmp_var (type, "graphite_IV");
@@ -715,7 +736,7 @@ graphite_create_new_loop (edge entry_edge,
add_referenced_var (ivvar);
save_clast_name_index (newivs_index, stmt->iterator,
- VEC_length (tree, *newivs));
+ VEC_length (tree, *newivs), level);
VEC_safe_push (tree, heap, *newivs, iv);
return loop;
}
@@ -942,7 +963,7 @@ translate_clast_for_loop (sese region, loop_p context_loop,
struct loop *loop = graphite_create_new_loop (next_e, stmt,
context_loop, newivs,
newivs_index,
- type, lb, ub);
+ type, lb, ub, level);
edge last_e = single_exit (loop);
edge to_body = single_succ_edge (loop->header);
basic_block after = to_body->dest;
@@ -1423,7 +1444,7 @@ create_params_index (htab_t index_table, CloogProgram *prog) {
int i;
for (i = 0; i < nb_parameters; i++)
- save_clast_name_index (index_table, parameters[i], i);
+ save_clast_name_index (index_table, parameters[i], i, i);
}
/* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for