aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/ChangeLog.graphite10
-rw-r--r--gcc/graphite-blocking.c42
-rw-r--r--gcc/graphite-poly.c2
-rw-r--r--gcc/graphite-poly.h2
5 files changed, 50 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 26c6e8e..8e76b89 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2010-12-01 Sebastian Pop <sebastian.pop@amd.com>
+
+ * graphite-blocking.c (lst_do_strip_mine_loop): Extra parameter
+ for the stride.
+ (lst_do_strip_mine): Same.
+ (scop_do_strip_mine): Same.
+ * graphite-poly.c (apply_poly_transforms): Update call to
+ scop_do_strip_mine.
+ * graphite-poly.h (scop_do_strip_mine): Update declaration.
+
2010-12-01 Jan Hubicka <jh@suse.cz>
* tree.c (build_common_builtin_nodes): Do not initialize
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index 6f0038b..a205928 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,3 +1,13 @@
+2010-10-20 Sebastian Pop <sebastian.pop@amd.com>
+
+ * graphite-blocking.c (lst_do_strip_mine_loop): Extra parameter
+ for the stride.
+ (lst_do_strip_mine): Same.
+ (scop_do_strip_mine): Same.
+ * graphite-poly.c (apply_poly_transforms): Update call to
+ scop_do_strip_mine.
+ * graphite-poly.h (scop_do_strip_mine): Update declaration.
+
2010-09-24 Sebastian Pop <sebastian.pop@amd.com>
PR middle-end/45758
diff --git a/gcc/graphite-blocking.c b/gcc/graphite-blocking.c
index 5322cd4..f263cde 100644
--- a/gcc/graphite-blocking.c
+++ b/gcc/graphite-blocking.c
@@ -193,15 +193,14 @@ lst_strip_mine_profitable_p (lst_p lst, int stride)
return res;
}
-/* Strip-mines all the loops of LST that are considered profitable to
- strip-mine. Return true if it did strip-mined some loops. */
+/* Strip-mines all the loops of LST with STRIDE. Return true if it
+ did strip-mined some loops. */
static bool
-lst_do_strip_mine_loop (lst_p lst, int depth)
+lst_do_strip_mine_loop (lst_p lst, int depth, int stride)
{
int i;
lst_p l;
- int stride = PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE);
poly_bb_p pbb;
if (!lst)
@@ -212,7 +211,7 @@ lst_do_strip_mine_loop (lst_p lst, int depth)
bool res = false;
FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
- res |= lst_do_strip_mine_loop (l, depth);
+ res |= lst_do_strip_mine_loop (l, depth, stride);
return res;
}
@@ -222,30 +221,45 @@ lst_do_strip_mine_loop (lst_p lst, int depth)
stride);
}
-/* Strip-mines all the loops of LST that are considered profitable to
- strip-mine. Return true if it did strip-mined some loops. */
+/* Strip-mines all the loops of LST with STRIDE. When STRIDE is zero,
+ read the stride from the PARAM_LOOP_BLOCK_TILE_SIZE. Return true
+ if it did strip-mined some loops.
+
+ Strip mining transforms a loop
+
+ | for (i = 0; i < N; i++)
+ | S (i);
+
+ into the following loop nest:
+
+ | for (k = 0; k < N; k += STRIDE)
+ | for (j = 0; j < STRIDE; j++)
+ | S (i = k + j);
+*/
static bool
-lst_do_strip_mine (lst_p lst)
+lst_do_strip_mine (lst_p lst, int stride)
{
int i;
lst_p l;
bool res = false;
- int stride = PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE);
int depth;
+ if (!stride)
+ stride = PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE);
+
if (!lst
|| !LST_LOOP_P (lst))
return false;
FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l)
- res |= lst_do_strip_mine (l);
+ res |= lst_do_strip_mine (l, stride);
depth = lst_depth (lst);
if (depth >= 0
&& lst_strip_mine_profitable_p (lst, stride))
{
- res |= lst_do_strip_mine_loop (lst, lst_depth (lst));
+ res |= lst_do_strip_mine_loop (lst, lst_depth (lst), stride);
lst_add_loop_under_loop (lst);
}
@@ -256,9 +270,9 @@ lst_do_strip_mine (lst_p lst)
have been strip-mined. */
bool
-scop_do_strip_mine (scop_p scop)
+scop_do_strip_mine (scop_p scop, int stride)
{
- return lst_do_strip_mine (SCOP_TRANSFORMED_SCHEDULE (scop));
+ return lst_do_strip_mine (SCOP_TRANSFORMED_SCHEDULE (scop), stride);
}
/* Loop blocks all the loops in SCOP. Returns true when we manage to
@@ -272,7 +286,7 @@ scop_do_block (scop_p scop)
store_scattering (scop);
- strip_mined = lst_do_strip_mine (SCOP_TRANSFORMED_SCHEDULE (scop));
+ strip_mined = lst_do_strip_mine (SCOP_TRANSFORMED_SCHEDULE (scop), 0);
interchanged = scop_do_interchange (scop);
/* If we don't interchange loops, the strip mine alone will not be
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index 9604e38..4f5a437 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -776,7 +776,7 @@ apply_poly_transforms (scop_p scop)
else
{
if (flag_loop_strip_mine)
- transform_done |= scop_do_strip_mine (scop);
+ transform_done |= scop_do_strip_mine (scop, 0);
if (flag_loop_interchange)
transform_done |= scop_do_interchange (scop);
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
index 8b950a4..4a2f25c 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -412,7 +412,7 @@ extern void print_iteration_domains (FILE *, scop_p, int);
extern void debug_iteration_domain (poly_bb_p, int);
extern void debug_iteration_domains (scop_p, int);
extern bool scop_do_interchange (scop_p);
-extern bool scop_do_strip_mine (scop_p);
+extern bool scop_do_strip_mine (scop_p, int);
extern bool scop_do_block (scop_p);
extern bool flatten_all_loops (scop_p);
extern void pbb_number_of_iterations_at_time (poly_bb_p, graphite_dim_t, mpz_t);