* reg-stack.c (convert_regs_1): Return boolean value, true if the CFG
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 24 Oct 2010 20:50:20 +0000 (20:50 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 24 Oct 2010 20:50:20 +0000 (20:50 +0000)
has been modified.
(convert_regs_2): Likewise.  Adjust calls to convert_regs_1.
(convert_regs): Adjust calls to convert_regs_2.  Clean up the CFG if
it has been modified.

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

gcc/ChangeLog
gcc/reg-stack.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt7.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt7.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt7_pkg.ads [new file with mode: 0644]

index 4f250e7..c48d9d7 100644 (file)
@@ -1,5 +1,13 @@
 2010-10-24  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * reg-stack.c (convert_regs_1): Return boolean value, true if the CFG
+       has been modified.
+       (convert_regs_2): Likewise.  Adjust calls to convert_regs_1.
+       (convert_regs): Adjust calls to convert_regs_2.  Clean up the CFG if
+       it has been modified.
+
+2010-10-24  Eric Botcazou  <ebotcazou@adacore.com>
+
        * config/sparc/sparc.c (sparc_type_code) <NULLPTR_TYPE>: New case.
 
 2010-10-24  Paul Koning  <ni1d@arrl.net>
index e692584..98c5fce 100644 (file)
@@ -2876,9 +2876,10 @@ better_edge (edge e1, edge e2)
   return (e1->src->index < e2->src->index) ? e1 : e2;
 }
 
-/* Convert stack register references in one block.  */
+/* Convert stack register references in one block.  Return true if the CFG
+   has been modified in the process.  */
 
-static void
+static bool
 convert_regs_1 (basic_block block)
 {
   struct stack_def regstack;
@@ -2886,6 +2887,7 @@ convert_regs_1 (basic_block block)
   int reg;
   rtx insn, next;
   bool control_flow_insn_deleted = false;
+  bool cfg_altered = false;
   int debug_insns_with_starting_stack = 0;
 
   any_malformed_asm = false;
@@ -3041,7 +3043,7 @@ convert_regs_1 (basic_block block)
      place, still, but we don't have enough information at that time.  */
 
   if (control_flow_insn_deleted)
-    purge_dead_edges (block);
+    cfg_altered |= purge_dead_edges (block);
 
   /* Something failed if the stack lives don't match.  If we had malformed
      asms, we zapped the instruction itself, but that didn't produce the
@@ -3051,14 +3053,18 @@ convert_regs_1 (basic_block block)
              || any_malformed_asm);
   bi->stack_out = regstack;
   bi->done = true;
+
+  return cfg_altered;
 }
 
-/* Convert registers in all blocks reachable from BLOCK.  */
+/* Convert registers in all blocks reachable from BLOCK.  Return true if the
+   CFG has been modified in the process.  */
 
-static void
+static bool
 convert_regs_2 (basic_block block)
 {
   basic_block *stack, *sp;
+  bool cfg_altered = false;
 
   /* We process the blocks in a top-down manner, in a way such that one block
      is only processed after all its predecessors.  The number of predecessors
@@ -3097,11 +3103,13 @@ convert_regs_2 (basic_block block)
              *sp++ = e->dest;
          }
 
-      convert_regs_1 (block);
+      cfg_altered |= convert_regs_1 (block);
     }
   while (sp != stack);
 
   free (stack);
+
+  return cfg_altered;
 }
 
 /* Traverse all basic blocks in a function, converting the register
@@ -3111,6 +3119,7 @@ convert_regs_2 (basic_block block)
 static void
 convert_regs (void)
 {
+  bool cfg_altered = false;
   int inserted;
   basic_block b;
   edge e;
@@ -3129,7 +3138,7 @@ convert_regs (void)
 
   /* Process all blocks reachable from all entry points.  */
   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
-    convert_regs_2 (e->dest);
+    cfg_altered |= convert_regs_2 (e->dest);
 
   /* ??? Process all unreachable blocks.  Though there's no excuse
      for keeping these even when not optimizing.  */
@@ -3138,7 +3147,7 @@ convert_regs (void)
       block_info bi = BLOCK_INFO (b);
 
       if (! bi->done)
-       convert_regs_2 (b);
+       cfg_altered |= convert_regs_2 (b);
     }
 
   inserted |= compensate_edges ();
@@ -3149,6 +3158,9 @@ convert_regs (void)
   if (inserted)
     commit_edge_insertions ();
 
+  if (cfg_altered)
+    cleanup_cfg (0);
+
   if (dump_file)
     fputc ('\n', dump_file);
 }
index 9ee2d3c..5e202cb 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt7.ad[sb]: New test.
+       * gnat.dg/opt7_pkg.ads: New helper.
+
 2010-10-24  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR objc/45735   
diff --git a/gcc/testsuite/gnat.dg/opt7.adb b/gcc/testsuite/gnat.dg/opt7.adb
new file mode 100644 (file)
index 0000000..da3b0e6
--- /dev/null
@@ -0,0 +1,44 @@
+-- { dg-do compile }\r
+-- { dg-options "-Os -g" }\r
+\r
+with Opt7_Pkg;\r
+\r
+package body Opt7 is\r
+\r
+   procedure Parse (Str       :     String;\r
+                    Time_Type : out time_t;\r
+                    Abs_Time  : out Time;\r
+                    Delt_Time : out Duration) is\r
+      Year         : Year_Number;\r
+      Month        : Month_Number;\r
+      Day          : Day_Number;\r
+      Minute       : Integer := 0;\r
+      Idx          : Integer := Str'First;\r
+      Ch           : Character := Str (Idx);\r
+      Current_Time : Time;\r
+\r
+   begin\r
+      if Ch = '-' then\r
+         Time_Type := Absolute_Time;\r
+         Current_Time := Clock;\r
+         Day   := Ada.Calendar.Day (Current_Time);\r
+         Month := Ada.Calendar.Month (Current_Time);\r
+         Year  := Ada.Calendar.Year (Current_Time);\r
+      else\r
+         Time_Type := Delta_Time;\r
+      end if;\r
+      while Ch in '0' .. '9' loop\r
+         Minute := Minute + Character'Pos (Ch);\r
+         Idx := Idx + 1;\r
+         Ch  := Str (Idx);\r
+      end loop;\r
+      if Time_Type = Absolute_Time then\r
+         Abs_Time := Time_Of (Year, Month, Day, Day_Duration (1));\r
+      else\r
+         Delt_Time := Duration (Float (Minute));\r
+      end if;\r
+   exception\r
+      when others => Opt7_Pkg.My_Raise_Exception;\r
+   end;\r
+\r
+end Opt7;\r
diff --git a/gcc/testsuite/gnat.dg/opt7.ads b/gcc/testsuite/gnat.dg/opt7.ads
new file mode 100644 (file)
index 0000000..c980353
--- /dev/null
@@ -0,0 +1,12 @@
+with Ada.Calendar; use Ada.Calendar;\r
+\r
+package Opt7 is\r
+\r
+   type time_t is (Absolute_Time, Delta_Time);\r
+\r
+   procedure Parse (Str       :     String;\r
+                    Time_Type : out time_t;\r
+                    Abs_Time  : out Time;\r
+                    Delt_Time : out Duration);\r
+\r
+end Opt7;\r
diff --git a/gcc/testsuite/gnat.dg/opt7_pkg.ads b/gcc/testsuite/gnat.dg/opt7_pkg.ads
new file mode 100644 (file)
index 0000000..db24f5d
--- /dev/null
@@ -0,0 +1,5 @@
+package Opt7_Pkg is
+
+  procedure My_Raise_Exception;
+
+end Opt7_Pkg;