]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/57147 (setjmp call and if body wrongly elided (function runs off...
authorRichard Biener <rguenther@suse.de>
Mon, 6 May 2013 11:27:29 +0000 (11:27 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 6 May 2013 11:27:29 +0000 (11:27 +0000)
2013-05-06  Richard Biener  <rguenther@suse.de>

PR middle-end/57147
* tree-cfg.c (gimple_purge_dead_abnormal_call_edges): If
the edge is also fallthru, preserve it and just clear the
abnormal flag.
* tree-cfgcleanup.c (remove_fallthru_edge): If the edge is
also complex, preserve that and just clear the fallthru flag.
* tree-inline.c (update_ssa_across_abnormal_edges): Also
update virtual operands.

* gcc.dg/torture/pr57147-1.c: New testcase.
* gcc.dg/torture/pr57147-2.c: Likewise.
* gcc.dg/torture/pr57147-3.c: Likewise.

From-SVN: r198625

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr57147-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr57147-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr57147-3.c [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-cfgcleanup.c
gcc/tree-inline.c

index 1a448c7d208f674138692f5ba6d066a786319715..ddcdb19fbf03d77c9f3df2ae82af2d5417fd41f1 100644 (file)
@@ -1,3 +1,14 @@
+2013-05-06  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/57147
+       * tree-cfg.c (gimple_purge_dead_abnormal_call_edges): If
+       the edge is also fallthru, preserve it and just clear the
+       abnormal flag.
+       * tree-cfgcleanup.c (remove_fallthru_edge): If the edge is
+       also complex, preserve that and just clear the fallthru flag.
+       * tree-inline.c (update_ssa_across_abnormal_edges): Also
+       update virtual operands.
+
 2013-05-06  Alan Modra  <amodra@gmail.com>
 
        * config/rs6000/linux.h (DEFAULT_ASM_ENDIAN): Define.
index 745ed0dcec2b3a5df4e0ded3f883eb6a7981a72b..b4e04799c9d4d27d8759a12729b66575fb4bbdb5 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-06  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/57147
+       * gcc.dg/torture/pr57147-1.c: New testcase.
+       * gcc.dg/torture/pr57147-2.c: Likewise.
+       * gcc.dg/torture/pr57147-3.c: Likewise.
+
 2013-05-06  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/55303
diff --git a/gcc/testsuite/gcc.dg/torture/pr57147-1.c b/gcc/testsuite/gcc.dg/torture/pr57147-1.c
new file mode 100644 (file)
index 0000000..e5ad544
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-optimized" } */
+/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
+
+struct __jmp_buf_tag {};
+typedef struct __jmp_buf_tag jmp_buf[1];
+extern int _setjmp (struct __jmp_buf_tag __env[1]);
+
+jmp_buf g_return_jmp_buf;
+
+void SetNaClSwitchExpectations (void)
+{
+}
+void TestSyscall(void)
+{
+  SetNaClSwitchExpectations();
+  _setjmp (g_return_jmp_buf);
+}
+
+/* { dg-final { scan-tree-dump-not "builtin_unreachable" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/torture/pr57147-2.c b/gcc/testsuite/gcc.dg/torture/pr57147-2.c
new file mode 100644 (file)
index 0000000..521d126
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-optimized" } */
+/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
+
+struct __jmp_buf_tag {};
+typedef struct __jmp_buf_tag jmp_buf[1];
+extern int _setjmp (struct __jmp_buf_tag __env[1]);
+
+jmp_buf g_return_jmp_buf;
+
+void SetNaClSwitchExpectations (void)
+{
+  __builtin_longjmp (g_return_jmp_buf, 1);
+}
+void TestSyscall(void)
+{
+  SetNaClSwitchExpectations();
+  _setjmp (g_return_jmp_buf);
+}
+
+/* { dg-final { scan-tree-dump "setjmp" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/torture/pr57147-3.c b/gcc/testsuite/gcc.dg/torture/pr57147-3.c
new file mode 100644 (file)
index 0000000..c64e5ad
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+typedef char * ptr_t;
+struct __jmp_buf_tag   {
+};
+typedef struct __jmp_buf_tag sigjmp_buf[1];
+sigjmp_buf GC_jmp_buf;
+void GC_fault_handler(int sig)
+{
+}
+void GC_setup_temporary_fault_handler()     {
+    GC_set_and_save_fault_handler(GC_fault_handler);
+}
+ptr_t GC_find_limit(ptr_t p)
+{
+  GC_setup_temporary_fault_handler();
+  if (__sigsetjmp (GC_jmp_buf, 1) == 0)
+    for (;;)
+      ;
+}
index 798a2f74057b21c9642b9153c8628dbea3765394..a08a737a0c0a95602ddfd1ccbaccb32334240bf8 100644 (file)
@@ -7628,7 +7628,10 @@ gimple_purge_dead_abnormal_call_edges (basic_block bb)
     {
       if (e->flags & EDGE_ABNORMAL)
        {
-         remove_edge_and_dominated_blocks (e);
+         if (e->flags & EDGE_FALLTHRU)
+           e->flags &= ~EDGE_ABNORMAL;
+         else
+           remove_edge_and_dominated_blocks (e);
          changed = true;
        }
       else
index 3c69a7df23d3709bc0091f03224ec2585bdcb781..9b314f73ea62bbd006059d063e3d908a9499f4c3 100644 (file)
@@ -57,7 +57,10 @@ remove_fallthru_edge (vec<edge, va_gc> *ev)
   FOR_EACH_EDGE (e, ei, ev)
     if ((e->flags & EDGE_FALLTHRU) != 0)
       {
-       remove_edge_and_dominated_blocks (e);
+       if (e->flags & EDGE_COMPLEX)
+         e->flags &= ~EDGE_FALLTHRU;
+       else
+         remove_edge_and_dominated_blocks (e);
        return true;
       }
   return false;
index b5339c4066e1a1c1b040eaf0501ea2c15f327e35..83b41b1ef2c48bb6bcbb6a551fa8722d98568fb0 100644 (file)
@@ -1841,14 +1841,8 @@ update_ssa_across_abnormal_edges (basic_block bb, basic_block ret_bb,
            gcc_assert ((e->flags & EDGE_EH)
                        || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)));
 
-           if (virtual_operand_p (PHI_RESULT (phi)))
-             {
-               mark_virtual_operands_for_renaming (cfun);
-               continue;
-             }
-
            re = find_edge (ret_bb, e->dest);
-           gcc_assert (re);
+           gcc_checking_assert (re);
            gcc_assert ((re->flags & (EDGE_EH | EDGE_ABNORMAL))
                        == (e->flags & (EDGE_EH | EDGE_ABNORMAL)));