diff options
author | Jan Hubicka <jh@suse.cz> | 2008-09-13 16:38:10 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2008-09-13 14:38:10 +0000 |
commit | 5a6e26b73f407c421048a2e0c0b2c055ac6804bb (patch) | |
tree | 92e0245783830687ae1d788955f6f5ad6c2bb591 | |
parent | 934cb78a5826cfb0549000d76cd7a05fa5369c03 (diff) | |
download | gcc-5a6e26b73f407c421048a2e0c0b2c055ac6804bb.zip gcc-5a6e26b73f407c421048a2e0c0b2c055ac6804bb.tar.gz gcc-5a6e26b73f407c421048a2e0c0b2c055ac6804bb.tar.bz2 |
re PR tree-optimization/37392 (Segfault in verify_ssa: !gimple_nop_p (stmt))
PR tree-optimization/37392
* tree-inline.c (remap_gimple_stmt): Do not remap return value.
From-SVN: r140342
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-inline.c | 12 |
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7929d7e..1f07ada 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-09-13 Jan Hubicka <jh@suse.cz> + + PR tree-optimization/37392 + * tree-inline.c (remap_gimple_stmt): Do not remap return value. + 2008-09-13 Martin Jambor <mjambor@suse.cz> Jan Hubicka <jh@suse.cz> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 114cd47..ebc8b32 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1029,6 +1029,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id) gimple copy = NULL; struct walk_stmt_info wi; tree new_block; + bool skip_first = false; /* Begin by recognizing trees that we'll completely rewrite for the inlining context. Our output for these trees is completely @@ -1050,7 +1051,11 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id) already been set (e.g. a recent "foo (&result_decl, ...)"); just toss the entire GIMPLE_RETURN. */ if (retval && TREE_CODE (retval) != RESULT_DECL) - copy = gimple_build_assign (id->retvar, retval); + { + copy = gimple_build_assign (id->retvar, retval); + /* id->retvar is already substituted. Skip it on later remapping. */ + skip_first = true; + } else return gimple_build_nop (); } @@ -1216,7 +1221,10 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id) /* Remap all the operands in COPY. */ memset (&wi, 0, sizeof (wi)); wi.info = id; - walk_gimple_op (copy, remap_gimple_op_r, &wi); + if (skip_first) + walk_tree (gimple_op_ptr (copy, 1), remap_gimple_op_r, &wi, NULL); + else + walk_gimple_op (copy, remap_gimple_op_r, &wi); /* We have to handle EH region remapping of GIMPLE_RESX specially because the region number is not an operand. */ |