Fix try_transform_to_exit_first_loop_alt
authorTom de Vries <tom@codesourcery.com>
Mon, 8 Jun 2015 11:53:27 +0000 (11:53 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 8 Jun 2015 11:53:27 +0000 (11:53 +0000)
2015-06-08  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/66442
* gimple-iterator.h (gimple_seq_nondebug_singleton_p): Add function.
* tree-parloops.c (try_transform_to_exit_first_loop_alt): Return false
if the loop latch is not a singleton.  Use
gimple_seq_nondebug_singleton_p instead of gimple_seq_singleton_p.

From-SVN: r224218

gcc/ChangeLog
gcc/gimple-iterator.h
gcc/tree-parloops.c

index c163fcb51e577b2f6b4ecdc10e1c4fee5322c159..e33780fe9428e7bfb1922476eaa5502a8f323907 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-08  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/66442
+       * gimple-iterator.h (gimple_seq_nondebug_singleton_p): Add function.
+       * tree-parloops.c (try_transform_to_exit_first_loop_alt): Return false
+       if the loop latch is not a singleton.  Use
+       gimple_seq_nondebug_singleton_p instead of gimple_seq_singleton_p.
+
 2015-06-08  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/66452
index 87e943ae46876be0a2d2fac2c67431e30e21f718..d08245e56baa24aa4fa9670a2985a5aa9c51311c 100644 (file)
@@ -345,4 +345,39 @@ gsi_seq (gimple_stmt_iterator i)
   return *i.seq;
 }
 
+/* Determine whether SEQ is a nondebug singleton.  */
+
+static inline bool
+gimple_seq_nondebug_singleton_p (gimple_seq seq)
+{
+  gimple_stmt_iterator gsi;
+  gsi.ptr = gimple_seq_first (seq);
+  gsi.seq = &seq;
+  gsi.bb = NULL;
+
+  /* Not a singleton if the sequence is empty.  */
+  if (gsi_end_p (gsi))
+    return false;
+
+  /* Find a nondebug gimple.  */
+  while (!gsi_end_p (gsi)
+        && is_gimple_debug (gsi_stmt (gsi)))
+    gsi_next (&gsi);
+
+  /* Not a nondebug singleton if there's no nondebug gimple.  */
+  if (is_gimple_debug (gsi_stmt (gsi)))
+    return false;
+
+  /* Find the next nondebug gimple.  */
+  while (!gsi_end_p (gsi)
+        && is_gimple_debug (gsi_stmt (gsi)))
+    gsi_next (&gsi);
+
+  /* If there's a next nondebug gimple, it's not a nondebug singleton.  */
+  if (!gsi_end_p (gsi))
+    return false;
+
+  return true;
+}
+
 #endif /* GCC_GIMPLE_ITERATOR_H */
index 02f44ebac74309eecd02d3ce02c6fd77cf22375f..c4b83fe9635b9e5e05e2a0827b1b7376946981cd 100644 (file)
@@ -1769,8 +1769,8 @@ try_transform_to_exit_first_loop_alt (struct loop *loop,
                                      tree nit)
 {
   /* Check whether the latch contains a single statement.  */
-  if (!gimple_seq_singleton_p (bb_seq (loop->latch)))
-    return true;
+  if (!gimple_seq_nondebug_singleton_p (bb_seq (loop->latch)))
+    return false;
 
   /* Check whether the latch contains the loop iv increment.  */
   edge back = single_succ_edge (loop->latch);