diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-08-13 19:06:13 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-08-13 19:06:13 +0200 |
commit | 4029a5e06387a5d222a4a7ff870404678b0054c0 (patch) | |
tree | d5c18123e7a057448dfc5369c00a76ff6e121643 /gcc/tree-inline.c | |
parent | 99c2bd544a3f84ae1716a0d8d973c98fc0534f86 (diff) | |
download | gcc-4029a5e06387a5d222a4a7ff870404678b0054c0.zip gcc-4029a5e06387a5d222a4a7ff870404678b0054c0.tar.gz gcc-4029a5e06387a5d222a4a7ff870404678b0054c0.tar.bz2 |
re PR middle-end/57661 (ICE: SIGSEGV in verify_ssa)
PR tree-optimization/57661
* tree-inline.h (struct copy_body_data): Add blocks_to_copy field.
* tree-inline.c (tree_function_versioning): Initialize it.
(remap_gimple_stmt): Return GIMPLE_NOP for MEM_REF lhs clobber stmts
if id->blocks_to_copy and MEM_REF's SSA_NAME is defined in a block
that is not being copied.
* g++.dg/opt/pr57661.C: New test.
From-SVN: r201698
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 00e3198..55e5270 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1387,6 +1387,23 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id) } } + /* For *ptr_N ={v} {CLOBBER}, if ptr_N is SSA_NAME defined + in a block that we aren't copying during tree_function_versioning, + just drop the clobber stmt. */ + if (id->blocks_to_copy && gimple_clobber_p (stmt)) + { + tree lhs = gimple_assign_lhs (stmt); + if (TREE_CODE (lhs) == MEM_REF + && TREE_CODE (TREE_OPERAND (lhs, 0)) == SSA_NAME) + { + gimple def_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (lhs, 0)); + if (gimple_bb (def_stmt) + && !bitmap_bit_p (id->blocks_to_copy, + gimple_bb (def_stmt)->index)) + return gimple_build_nop (); + } + } + if (gimple_debug_bind_p (stmt)) { copy = gimple_build_debug_bind (gimple_debug_bind_get_var (stmt), @@ -5161,6 +5178,7 @@ tree_function_versioning (tree old_decl, tree new_decl, id.src_node = old_version_node; id.dst_node = new_version_node; id.src_cfun = DECL_STRUCT_FUNCTION (old_decl); + id.blocks_to_copy = blocks_to_copy; if (id.src_node->ipa_transforms_to_apply.exists ()) { vec<ipa_opt_pass> old_transforms_to_apply |