]> gcc.gnu.org Git - gcc.git/commitdiff
df-scan.c (record_nonlocal_goto_receiver_defs): New function.
authorZdenek Dvorak <dvorakz@suse.cz>
Sun, 29 Apr 2007 17:33:34 +0000 (19:33 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sun, 29 Apr 2007 17:33:34 +0000 (17:33 +0000)
* df-scan.c (record_nonlocal_goto_receiver_defs): New function.
(df_refs_record): Call it.

From-SVN: r124283

gcc/ChangeLog
gcc/df-scan.c

index ddd258727cbd27dc6f29a4e7b5c748ce88748f8b..dbf78d08e222c961bb689fdb68d35ea96af25aa5 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-29  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       * df-scan.c (record_nonlocal_goto_receiver_defs): New function.
+       (df_refs_record): Call it.
+
 2007-04-29  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * rtl.def (SS_ABS): New code.
index d88da8a99308b5873b5ae8f8025e04f60e5a5023..87d21a4bb170b98483b92b6100eaeb4612009186 100644 (file)
@@ -1765,6 +1765,32 @@ df_bb_refs_record (struct dataflow *dflow, basic_block bb)
     }
 }
 
+/* Records the implicit definitions at targets of nonlocal gotos in BLOCKS.  */
+
+static void
+record_nonlocal_goto_receiver_defs (struct dataflow *dflow, bitmap blocks)
+{
+  rtx x;
+  basic_block bb;
+
+  /* See expand_builtin_setjmp_receiver; hard_frame_pointer_rtx is used in
+     the nonlocal goto receiver, and needs to be considered defined
+     implicitly.  */
+  if (!(dflow->flags & DF_HARD_REGS))
+    return;
+
+  for (x = nonlocal_goto_handler_labels; x; x = XEXP (x, 1))
+    {
+      bb = BLOCK_FOR_INSN (XEXP (x, 0));
+      if (!bitmap_bit_p (blocks, bb->index))
+       continue;
+
+      df_ref_record (dflow, hard_frame_pointer_rtx, &hard_frame_pointer_rtx,
+                    bb, NULL,
+                    DF_REF_REG_DEF, DF_REF_ARTIFICIAL | DF_REF_AT_TOP,
+                    false);
+    }
+}
 
 /* Record all the refs in the basic blocks specified by BLOCKS.  */
 
@@ -1785,6 +1811,9 @@ df_refs_record (struct dataflow *dflow, bitmap blocks)
 
   if (bitmap_bit_p (blocks, ENTRY_BLOCK))
     df_record_entry_block_defs (dflow);
+
+  if (current_function_has_nonlocal_label)
+    record_nonlocal_goto_receiver_defs (dflow, blocks);
 }
 
 
This page took 0.075392 seconds and 5 git commands to generate.