diff options
-rw-r--r-- | gcc/ChangeLog.graphite | 11 | ||||
-rw-r--r-- | gcc/graphite-blocking.c | 5 | ||||
-rw-r--r-- | gcc/graphite-interchange.c | 5 | ||||
-rw-r--r-- | gcc/graphite-poly.c | 30 | ||||
-rw-r--r-- | gcc/graphite-poly.h | 6 |
5 files changed, 47 insertions, 10 deletions
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index defc111e8e8..535cd0cc250 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,5 +1,16 @@ 2009-10-15 Sebastian Pop <sebastian.pop@amd.com> + * graphite-blocking.c (lst_do_strip_mine): Avoid strip mining the + root of the LST. + * graphite-interchange.c (lst_do_interchange): Avoid interchanging + the root of the LST. + * graphite-poly.c (scop_to_lst): Fix LST sequence in an outermost + fake loop. + (print_lst): Print the root of LST in a different format. + * graphite-poly.h (lst_depth): Adjust to include the root of the LST. + +2009-10-15 Sebastian Pop <sebastian.pop@amd.com> + * graphite-poly.c (print_scop): Fix pretty printing of a SCoP. 2009-10-15 Sebastian Pop <sebastian.pop@amd.com> diff --git a/gcc/graphite-blocking.c b/gcc/graphite-blocking.c index b5f5acd74ba..e44ad8a921c 100644 --- a/gcc/graphite-blocking.c +++ b/gcc/graphite-blocking.c @@ -242,8 +242,9 @@ lst_do_strip_mine (lst_p lst) for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) res |= lst_do_strip_mine (l); - if (pbb_strip_mine_profitable_p (LST_PBB (lst_find_first_pbb (lst)), - lst_depth (lst), stride)) + if (lst_depth (lst) >= 0 + && pbb_strip_mine_profitable_p (LST_PBB (lst_find_first_pbb (lst)), + lst_depth (lst), stride)) { res |= lst_do_strip_mine_loop (lst, lst_depth (lst)); lst_add_loop_under_loop (lst); diff --git a/gcc/graphite-interchange.c b/gcc/graphite-interchange.c index cb703f27bdf..b42a1339426 100644 --- a/gcc/graphite-interchange.c +++ b/gcc/graphite-interchange.c @@ -539,8 +539,9 @@ lst_do_interchange (scop_p scop, lst_p lst) lst_p l; bool res = false; - for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) - res |= lst_try_interchange (scop, lst, l); + if (lst_depth (lst) >= 0) + for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) + res |= lst_try_interchange (scop, lst, l); for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) res |= lst_do_interchange (scop, l); diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c index 8d75fd47f3f..17d88815b4d 100644 --- a/gcc/graphite-poly.c +++ b/gcc/graphite-poly.c @@ -869,12 +869,27 @@ loop_to_lst (loop_p loop, VEC (poly_bb_p, heap) *bbs, int *i) void scop_to_lst (scop_p scop) { - poly_bb_p pbb = VEC_index (poly_bb_p, SCOP_BBS (scop), 0); - loop_p loop = outermost_loop_in_sese (SCOP_REGION (scop), GBB_BB (PBB_BLACK_BOX (pbb))); - int i = 0; + lst_p res; + int i, n = VEC_length (poly_bb_p, SCOP_BBS (scop)); + VEC (lst_p, heap) *seq = VEC_alloc (lst_p, heap, 5); + sese region = SCOP_REGION (scop); + + for (i = 0; i < n; i++) + { + poly_bb_p pbb = VEC_index (poly_bb_p, SCOP_BBS (scop), i); + loop_p loop = outermost_loop_in_sese (region, GBB_BB (PBB_BLACK_BOX (pbb))); + + if (loop_in_sese_p (loop, region)) + res = loop_to_lst (loop, SCOP_BBS (scop), &i); + else + res = new_lst_stmt (pbb); + + VEC_safe_push (lst_p, heap, seq, res); + } - SCOP_ORIGINAL_SCHEDULE (scop) = loop_to_lst (loop, SCOP_BBS (scop), &i); - SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (SCOP_ORIGINAL_SCHEDULE (scop)); + res = new_lst_loop (seq); + SCOP_ORIGINAL_SCHEDULE (scop) = res; + SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (res); } /* Print LST to FILE with INDENT spaces of indentation. */ @@ -892,7 +907,10 @@ print_lst (FILE *file, lst_p lst, int indent) int i; lst_p l; - fprintf (file, "%d (loop", lst_dewey_number (lst)); + if (LST_LOOP_FATHER (lst)) + fprintf (file, "%d (loop", lst_dewey_number (lst)); + else + fprintf (file, "(root"); for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) print_lst (file, l, indent + 2); diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index 64a082e4125..8165d35fb49 100644 --- a/gcc/graphite-poly.h +++ b/gcc/graphite-poly.h @@ -714,6 +714,12 @@ static inline int lst_depth (lst_p lst) { if (!lst) + return -2; + + /* The depth of the outermost "fake" loop is -1. This outermost + loop does not have a loop father and it is just a container, as + in the loop representation of GCC. */ + if (!LST_LOOP_FATHER (lst)) return -1; return lst_depth (LST_LOOP_FATHER (lst)) + 1; |