diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index defc111e8e8fee1c91da396d71b6ee7ec5bc63e7..535cd0cc2501a4b8fd04bf865f1ddc6223cce53d 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,3 +1,14 @@
+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.
diff --git a/gcc/graphite-blocking.c b/gcc/graphite-blocking.c
index b5f5acd74ba27bffb72292649e9052db455a53d2..e44ad8a921cceee6919186cd41ea0474ae51752a 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 cb703f27bdf76413e116c699645036e7c6ae5b22..b42a13394262980edbdf72e5c17fd675d2176939 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 8d75fd47f3f72b742a2943bb5a39cc208518ca3d..17d88815b4dcc357a233432759be035756234614 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 64a082e412561f703f0a5ddf846310d4ac7c285e..8165d35fb49c5a106c58101c6255904c9c5aedcd 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;