aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-04-23 14:36:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-04-23 14:36:02 +0000
commit92e776e9971b9fc4e31fd0f23352809cb3680d3a (patch)
tree875a3489ed6c6effaec734bac5a457d62d6807af /gcc
parenta15ee567f234312ebc2b2bda8a8465d6a668e9d1 (diff)
downloadgcc-92e776e9971b9fc4e31fd0f23352809cb3680d3a.zip
gcc-92e776e9971b9fc4e31fd0f23352809cb3680d3a.tar.gz
gcc-92e776e9971b9fc4e31fd0f23352809cb3680d3a.tar.bz2
re PR middle-end/57036 (ice in update_ssa_across_abnormal_edges)
2013-04-23 Richard Biener <rguenther@suse.de> PR middle-end/57036 * tree-inline.c (copy_edges_for_bb): Add can_make_abnormal_goto parameter, only add abnormal goto edges from the copied body if the call could perform abnormal gotos. (copy_cfg_body): Adjust. * gcc.dg/torture/pr57036-1.c: New testcase. * gcc.dg/torture/pr57036-2.c: Likewise. From-SVN: r198192
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr57036-1.c16
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr57036-2.c25
-rw-r--r--gcc/tree-inline.c14
5 files changed, 66 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 307d389..ca931ae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2013-04-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/57036
+ * tree-inline.c (copy_edges_for_bb): Add can_make_abnormal_goto
+ parameter, only add abnormal goto edges from the copied body
+ if the call could perform abnormal gotos.
+ (copy_cfg_body): Adjust.
+
2013-04-23 Sofiane Naci <sofiane.naci@arm.com>
* config/aarch64/aarch64.md (*mov<mode>_aarch64): Add simd attribute.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a54279a..a9c8694 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/57036
+ * gcc.dg/torture/pr57036-1.c: New testcase.
+ * gcc.dg/torture/pr57036-2.c: Likewise.
+
2013-04-23 Sofiane Naci <sofiane.naci@arm.com>
* gcc.target/aarch64/scalar-mov.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr57036-1.c b/gcc/testsuite/gcc.dg/torture/pr57036-1.c
new file mode 100644
index 0000000..5aa63bd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr57036-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+extern void g (void);
+extern __inline __attribute__ ((__always_inline__,__leaf__))
+f ()
+{
+ g ();
+}
+struct __jmp_buf_tag *b;
+int jpgDecode_convert (unsigned i)
+{
+ if (i != 0)
+ f ();
+ read_buf_open ();
+ return _setjmp (b);
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr57036-2.c b/gcc/testsuite/gcc.dg/torture/pr57036-2.c
new file mode 100644
index 0000000..25de5cd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr57036-2.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+int j_;
+int jpgDecode_convert (unsigned i)
+{
+ __label__ label;
+ int j;
+
+ inline void __attribute__((always_inline,leaf)) f(void)
+ {
+ g();
+ }
+
+ void __attribute__((noinline)) read_buf_open (void)
+ {
+ goto label;
+ }
+
+ if (i != 0)
+ f ();
+ j = j_;
+ read_buf_open ();
+label:
+ return j;
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index b94ba10..7fa0245 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1866,7 +1866,8 @@ update_ssa_across_abnormal_edges (basic_block bb, basic_block ret_bb,
debug stmts are left after a statement that must end the basic block. */
static bool
-copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb)
+copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb,
+ bool can_make_abnormal_goto)
{
basic_block new_bb = (basic_block) bb->aux;
edge_iterator ei;
@@ -1921,7 +1922,11 @@ copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb)
into a COMPONENT_REF which doesn't. If the copy
can throw, the original could also throw. */
can_throw = stmt_can_throw_internal (copy_stmt);
- nonlocal_goto = stmt_can_make_abnormal_goto (copy_stmt);
+ /* If the call we inline cannot make abnormal goto do not add
+ additional abnormal edges but only retain those already present
+ in the original function body. */
+ nonlocal_goto
+ = can_make_abnormal_goto && stmt_can_make_abnormal_goto (copy_stmt);
if (can_throw || nonlocal_goto)
{
@@ -2270,10 +2275,13 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale,
last = last_basic_block;
/* Now that we've duplicated the blocks, duplicate their edges. */
+ bool can_make_abormal_goto
+ = id->gimple_call && stmt_can_make_abnormal_goto (id->gimple_call);
FOR_ALL_BB_FN (bb, cfun_to_copy)
if (!blocks_to_copy
|| (bb->index > 0 && bitmap_bit_p (blocks_to_copy, bb->index)))
- need_debug_cleanup |= copy_edges_for_bb (bb, count_scale, exit_block_map);
+ need_debug_cleanup |= copy_edges_for_bb (bb, count_scale, exit_block_map,
+ can_make_abormal_goto);
if (new_entry)
{