aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite.c
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2009-01-16 15:20:16 +0000
committerSebastian Pop <spop@gcc.gnu.org>2009-01-16 15:20:16 +0000
commitbcab4e19dad2f3961908459964df00c086a19c13 (patch)
treecf9185214225c9de8fa53a3172076ecbcbec6390 /gcc/graphite.c
parent0b040072d6aa13cb46cf660307a77df7964c326f (diff)
downloadgcc-bcab4e19dad2f3961908459964df00c086a19c13.zip
gcc-bcab4e19dad2f3961908459964df00c086a19c13.tar.gz
gcc-bcab4e19dad2f3961908459964df00c086a19c13.tar.bz2
graphite.c (compare_prefix_loops): New.
2009-01-16 Sebastian Pop <sebastian.pop@amd.com> Tobias Grosser <tobi.grosser@amd.com> * graphite.c (compare_prefix_loops): New. (build_scop_canonical_schedules): Rewritten. (graphite_transform_loops): Move build_scop_canonical_schedules after build_scop_iteration_domain. Co-Authored-By: Tobias Grosser <tobi.grosser@amd.com> From-SVN: r143437
Diffstat (limited to 'gcc/graphite.c')
-rw-r--r--gcc/graphite.c66
1 files changed, 42 insertions, 24 deletions
diff --git a/gcc/graphite.c b/gcc/graphite.c
index b90abf1..4e301e4 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -2472,6 +2472,29 @@ build_scop_dynamic_schedules (scop_p scop)
}
}
+/* Returns the number of loops that are identical at the beginning of
+ the vectors A and B. */
+
+static int
+compare_prefix_loops (VEC (loop_p, heap) *a, VEC (loop_p, heap) *b)
+{
+ int i;
+ loop_p ea;
+ int lb;
+
+ if (!a || !b)
+ return 0;
+
+ lb = VEC_length (loop_p, b);
+
+ for (i = 0; VEC_iterate (loop_p, a, i, ea); i++)
+ if (i >= lb
+ || ea != VEC_index (loop_p, b, i))
+ return i;
+
+ return 0;
+}
+
/* Build for BB the static schedule.
The STATIC_SCHEDULE is defined like this:
@@ -2508,34 +2531,29 @@ build_scop_dynamic_schedules (scop_p scop)
static void
build_scop_canonical_schedules (scop_p scop)
{
- int i, j;
+ int i;
graphite_bb_p gb;
- int nb = scop_nb_loops (scop) + 1;
+ int nb_loops = scop_nb_loops (scop);
+ lambda_vector static_schedule = lambda_vector_new (nb_loops + 1);
+ VEC (loop_p, heap) *loops_previous = NULL;
- SCOP_STATIC_SCHEDULE (scop) = lambda_vector_new (nb);
+ /* We have to start schedules at 0 on the first component and
+ because we cannot compare_prefix_loops against a previous loop,
+ prefix will be equal to zero, and that index will be
+ incremented before copying. */
+ static_schedule[0] = -1;
for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
{
- int offset = nb_loops_around_gb (gb);
-
- /* After leaving a loop, it is possible that the schedule is not
- set at zero. This loop reinitializes components located
- after OFFSET. */
-
- for (j = offset + 1; j < nb; j++)
- if (SCOP_STATIC_SCHEDULE (scop)[j])
- {
- memset (&(SCOP_STATIC_SCHEDULE (scop)[j]), 0,
- sizeof (int) * (nb - j));
- ++SCOP_STATIC_SCHEDULE (scop)[offset];
- break;
- }
-
- GBB_STATIC_SCHEDULE (gb) = lambda_vector_new (offset + 1);
- lambda_vector_copy (SCOP_STATIC_SCHEDULE (scop),
- GBB_STATIC_SCHEDULE (gb), offset + 1);
-
- ++SCOP_STATIC_SCHEDULE (scop)[offset];
+ int prefix = compare_prefix_loops (loops_previous, GBB_LOOPS (gb));
+ int nb = gbb_nb_loops (gb);
+
+ loops_previous = GBB_LOOPS (gb);
+ memset (&(static_schedule[prefix + 1]), 0, sizeof (int) * (nb_loops - prefix));
+ ++static_schedule[prefix];
+ GBB_STATIC_SCHEDULE (gb) = lambda_vector_new (nb + 1);
+ lambda_vector_copy (static_schedule,
+ GBB_STATIC_SCHEDULE (gb), nb + 1);
}
}
@@ -6049,7 +6067,6 @@ graphite_transform_loops (void)
if (!build_scop_loop_nests (scop))
continue;
- build_scop_canonical_schedules (scop);
build_bb_loops (scop);
if (!build_scop_conditions (scop))
@@ -6071,6 +6088,7 @@ graphite_transform_loops (void)
continue;
add_conditions_to_constraints (scop);
+ build_scop_canonical_schedules (scop);
build_scop_data_accesses (scop);
build_scop_dynamic_schedules (scop);