From e2a6b9da18a9bee0845d3f27674cbe413a479cb0 Mon Sep 17 00:00:00 2001 From: rguenth Date: Mon, 6 May 2013 11:27:29 +0000 Subject: [PATCH] 2013-05-06 Richard Biener 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198625 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 +++++++++++ gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/gcc.dg/torture/pr57147-1.c | 21 +++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr57147-2.c | 22 ++++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr57147-3.c | 20 ++++++++++++++++++++ gcc/tree-cfg.c | 5 ++++- gcc/tree-cfgcleanup.c | 5 ++++- gcc/tree-inline.c | 8 +------- 8 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr57147-1.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr57147-2.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr57147-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a448c7d208..ddcdb19fbf0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2013-05-06 Richard Biener + + 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 * config/rs6000/linux.h (DEFAULT_ASM_ENDIAN): Define. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 745ed0dcec2..b4e04799c9d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-05-06 Richard Biener + + 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 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 index 00000000000..e5ad5449989 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57147-1.c @@ -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 index 00000000000..521d126e3c7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57147-2.c @@ -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 index 00000000000..c64e5adb030 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57147-3.c @@ -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 (;;) + ; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 798a2f74057..a08a737a0c0 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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 diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 3c69a7df23d..9b314f73ea6 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -57,7 +57,10 @@ remove_fallthru_edge (vec *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; diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index b5339c4066e..83b41b1ef2c 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -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))); -- 2.11.4.GIT