PR target/51552
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Dec 2011 20:21:00 +0000 (20:21 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Dec 2011 20:21:00 +0000 (20:21 +0000)
        * dwarf2cfi.c (dwarf2out_frame_debug): Move any_cfis_emitted code...
        (scan_trace): ... here.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182604 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2cfi.c

index 70aea78..31210c0 100644 (file)
@@ -1,3 +1,9 @@
+2011-12-21  Richard Henderson  <rth@redhat.com>
+
+       PR target/51552
+       * dwarf2cfi.c (dwarf2out_frame_debug): Move any_cfis_emitted code...
+       (scan_trace): ... here.
+
 2011-12-21  Jason Merrill  <jason@redhat.com>
 
        * doc/standards.texi (C++ language): Update for C++11.
index 69e6f21..b2721e8 100644 (file)
@@ -1930,9 +1930,6 @@ dwarf2out_frame_debug (rtx insn)
 {
   rtx note, n;
   bool handled_one = false;
-  bool need_flush = false;
-
-  any_cfis_emitted = false;
 
   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
     switch (REG_NOTE_KIND (note))
@@ -2020,8 +2017,7 @@ dwarf2out_frame_debug (rtx insn)
        break;
 
       case REG_CFA_FLUSH_QUEUE:
-       /* The actual flush happens below.  */
-       need_flush = true;
+       /* The actual flush happens elsewhere.  */
        handled_one = true;
        break;
 
@@ -2029,13 +2025,7 @@ dwarf2out_frame_debug (rtx insn)
        break;
       }
 
-  if (handled_one)
-    {
-      /* Minimize the number of advances by emitting the entire queue
-        once anything is emitted.  */
-      need_flush |= any_cfis_emitted;
-    }
-  else
+  if (!handled_one)
     {
       insn = PATTERN (insn);
     do_frame_expr:
@@ -2044,12 +2034,9 @@ dwarf2out_frame_debug (rtx insn)
       /* Check again.  A parallel can save and update the same register.
          We could probably check just once, here, but this is safer than
          removing the check at the start of the function.  */
-      if (any_cfis_emitted || clobbers_queued_reg_save (insn))
-       need_flush = true;
+      if (clobbers_queued_reg_save (insn))
+       dwarf2out_flush_queued_reg_saves ();
     }
-
-  if (need_flush)
-    dwarf2out_flush_queued_reg_saves ();
 }
 
 /* Emit CFI info to change the state from OLD_ROW to NEW_ROW.  */
@@ -2489,6 +2476,7 @@ scan_trace (dw_trace_info *trace)
 
          /* Make sure any register saves are visible at the jump target.  */
          dwarf2out_flush_queued_reg_saves ();
+         any_cfis_emitted = false;
 
           /* However, if there is some adjustment on the call itself, e.g.
             a call_pop, that action should be considered to happen after
@@ -2508,6 +2496,7 @@ scan_trace (dw_trace_info *trace)
                   || clobbers_queued_reg_save (insn)
                   || find_reg_note (insn, REG_CFA_FLUSH_QUEUE, NULL))
            dwarf2out_flush_queued_reg_saves ();
+         any_cfis_emitted = false;
 
          add_cfi_insn = insn;
          scan_insn_after (insn);
@@ -2518,6 +2507,12 @@ scan_trace (dw_trace_info *trace)
         emitted two cfa adjustments.  Do it now.  */
       def_cfa_1 (&this_cfa);
 
+      /* Minimize the number of advances by emitting the entire queue
+        once anything is emitted.  */
+      if (any_cfis_emitted
+         || find_reg_note (insn, REG_CFA_FLUSH_QUEUE, NULL))
+       dwarf2out_flush_queued_reg_saves ();
+
       /* Note that a test for control_flow_insn_p does exactly the
         same tests as are done to actually create the edges.  So
         always call the routine and let it not create edges for