From bcab4e19dad2f3961908459964df00c086a19c13 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Fri, 16 Jan 2009 15:20:16 +0000 Subject: [PATCH] graphite.c (compare_prefix_loops): New. 2009-01-16 Sebastian Pop Tobias Grosser * 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 From-SVN: r143437 --- gcc/ChangeLog | 8 ++++++ gcc/graphite.c | 66 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0dd888d4519f..b6e30e058eb2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-01-16 Sebastian Pop + Tobias Grosser + + * graphite.c (compare_prefix_loops): New. + (build_scop_canonical_schedules): Rewritten. + (graphite_transform_loops): Move build_scop_canonical_schedules + after build_scop_iteration_domain. + 2009-01-16 Sebastian Pop Tobias Grosser diff --git a/gcc/graphite.c b/gcc/graphite.c index b90abf1fef36..4e301e47c542 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); -- 2.47.2