[-fcompare-debug] skip more debug stmts in cleanup_empty_eh
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 5 Jan 2017 01:46:14 +0000 (01:46 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 5 Jan 2017 01:46:14 +0000 (01:46 +0000)
Various Ada RTS files failed -fcompare-debug compilation because debug
stmts prevented EH cleanups from taking place.  Adjusting
cleanup_empty_eh to skip them fixes it.

for  gcc/ChangeLog

* gimple-iterator.h (gsi_one_nondebug_before_end_p): New.
* tree-eh.c (cleanup_empty_eh): Skip more debug stmts.

From-SVN: r244088

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

index 2582f4814d582a17b8f112217c99a5c06818a50e..6f26a7a0e40c43b34e07076a81c44cd38795c3ce 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-04  Alexandre Oliva <aoliva@redhat.com>
+
+       * gimple-iterator.h (gsi_one_nondebug_before_end_p): New.
+       * tree-eh.c (cleanup_empty_eh): Skip more debug stmts.
+
 2017-01-04  Alexandre Oliva <aoliva@redhat.com>
 
        * multiple_target.c (create_dispatcher_calls): Init e_next.
index 7b2c49c83a61118b7d9b7dcf6a632ac9f70c86a3..70f18beceffc10126f68cabb54ddfa3204624eb5 100644 (file)
@@ -305,6 +305,20 @@ gsi_last_nondebug_bb (basic_block bb)
   return i;
 }
 
+/* Return true if I is followed only by debug statements in its
+   sequence.  */
+
+static inline bool
+gsi_one_nondebug_before_end_p (gimple_stmt_iterator i)
+{
+  if (gsi_one_before_end_p (i))
+    return true;
+  if (gsi_end_p (i))
+    return false;
+  gsi_next_nondebug (&i);
+  return gsi_end_p (i);
+}
+
 /* Iterates I statement iterator to the next non-virtual statement.  */
 
 static inline void
index 2be4312b8620439a7b16a13a3d550b6f95a7b765..45e6b9e4ebb3973e1bcd6267a512457c37d4044b 100644 (file)
@@ -4382,7 +4382,8 @@ cleanup_empty_eh (eh_landing_pad lp)
       return false;
     }
 
-  resx = last_stmt (bb);
+  gsi = gsi_last_nondebug_bb (bb);
+  resx = gsi_stmt (gsi);
   if (resx && is_gimple_resx (resx))
     {
       if (stmt_can_throw_external (resx))
@@ -4416,12 +4417,12 @@ cleanup_empty_eh (eh_landing_pad lp)
   resx = gsi_stmt (gsi);
   if (!e_out && gimple_call_builtin_p (resx, BUILT_IN_STACK_RESTORE))
     {
-      gsi_next (&gsi);
+      gsi_next_nondebug (&gsi);
       resx = gsi_stmt (gsi);
     }
   if (!is_gimple_resx (resx))
     return ret;
-  gcc_assert (gsi_one_before_end_p (gsi));
+  gcc_assert (gsi_one_nondebug_before_end_p (gsi));
 
   /* Determine if there are non-EH edges, or resx edges into the handler.  */
   has_non_eh_pred = false;