* tree-eh.c (lower_try_finally_dup_block): Clear location information
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Sep 2015 17:57:49 +0000 (17:57 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Sep 2015 17:57:49 +0000 (17:57 +0000)
on stack restore statements.
(decide_copy_try_finally): Do not consider a stack restore statement as
coming from sources.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/array24.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/blocklocs.adb [deleted file]
gcc/tree-eh.c

index 9acbc57..0ec1419 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-eh.c (lower_try_finally_dup_block): Clear location information
+       on stack restore statements.
+       (decide_copy_try_finally): Do not consider a stack restore statement as
+       coming from sources.
+
 2015-09-15  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/alpha/alpha.c (alpha_expand_block_clear): Use
index f8593b3..b4eaf3d 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/array24.adb: New test.
+       * gnat.dg/blocklocs.adb: Delete.
+
 2015-09-15  Marek Polacek  <polacek@redhat.com>
 
        PR c/67580
diff --git a/gcc/testsuite/gnat.dg/array24.adb b/gcc/testsuite/gnat.dg/array24.adb
new file mode 100644 (file)
index 0000000..c697436
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-do compile }
+-- { dg-options "-fdump-tree-optimized" }
+
+procedure Array24 (N : Natural) is
+  S : String (1 .. N);
+  pragma Volatile (S);
+begin
+  S := (others => '0');
+end;
+
+-- { dg-final { scan-tree-dump-not "builtin_unwind_resume" "optimized"  } }
diff --git a/gcc/testsuite/gnat.dg/blocklocs.adb b/gcc/testsuite/gnat.dg/blocklocs.adb
deleted file mode 100644 (file)
index 20ff7b3..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
--- { dg-do compile { target *-*-linux* } }
--- { dg-options "-gdwarf-2" }
-
-procedure Blocklocs (Choice : Integer; N : in out Integer) is
-begin
-   if Choice > 0 then
-      declare -- line 7
-         S : String (1 .. N * 2);
-         pragma Volatile (S);
-      begin
-        S := (others => 'B');
-      end;    -- line 12
-   else
-      declare -- line 14
-        S : String (1 .. N );
-        pragma Volatile (S);
-      begin
-        S := (others => '1');
-      end;    -- line 19
-   end if;
-end;
-   
--- { dg-final { scan-assembler "loc 1 7" } }
--- { dg-final { scan-assembler "loc 1 12" } }
--- { dg-final { scan-assembler "loc 1 14" } }
--- { dg-final { scan-assembler "loc 1 19" } }
index c1ca468..1a55d22 100644 (file)
@@ -915,7 +915,12 @@ lower_try_finally_dup_block (gimple_seq seq, struct leh_state *outer_state,
   for (gsi = gsi_start (new_seq); !gsi_end_p (gsi); gsi_next (&gsi))
     {
       gimple stmt = gsi_stmt (gsi);
-      if (LOCATION_LOCUS (gimple_location (stmt)) == UNKNOWN_LOCATION)
+      /* We duplicate __builtin_stack_restore at -O0 in the hope of eliminating
+        it on the EH paths.  When it is not eliminated, make it transparent in
+        the debug info.  */
+      if (gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE))
+       gimple_set_location (stmt, UNKNOWN_LOCATION);
+      else if (LOCATION_LOCUS (gimple_location (stmt)) == UNKNOWN_LOCATION)
        {
          tree block = gimple_block (stmt);
          gimple_set_location (stmt, loc);
@@ -1604,8 +1609,12 @@ decide_copy_try_finally (int ndests, bool may_throw, gimple_seq finally)
 
       for (gsi = gsi_start (finally); !gsi_end_p (gsi); gsi_next (&gsi))
        {
+         /* Duplicate __builtin_stack_restore in the hope of eliminating it
+            on the EH paths and, consequently, useless cleanups.  */
          gimple stmt = gsi_stmt (gsi);
-         if (!is_gimple_debug (stmt) && !gimple_clobber_p (stmt))
+         if (!is_gimple_debug (stmt)
+             && !gimple_clobber_p (stmt)
+             && !gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE))
            return false;
        }
       return true;