diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-04-14 21:21:31 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-04-14 21:21:31 +0200 |
commit | 967ca9b932e2f1b137c4e8b414146b06e1cad45c (patch) | |
tree | 689f794a5cd438e124194ffde1382c3f023c5bf2 /gcc | |
parent | d8747845fded660e09bab98470f77753a4216b6e (diff) | |
download | gcc-967ca9b932e2f1b137c4e8b414146b06e1cad45c.zip gcc-967ca9b932e2f1b137c4e8b414146b06e1cad45c.tar.gz gcc-967ca9b932e2f1b137c4e8b414146b06e1cad45c.tar.bz2 |
re PR c++/70594 (-fcompare-debug failure)
PR c++/70594
* ipa-utils.h (polymorphic_ctor_dtor_p): New prototype.
* ipa-polymorphic-call.c (polymorphic_ctor_dtor_p): New function.
(inlined_polymorphic_ctor_dtor_block_p): Use it.
* tree-ssa-live.c (remove_unused_scope_block_p): When
in_ctor_dtor_block, avoid discarding not just BLOCKs with
BLOCK_ABSTRACT_ORIGIN being FUNCTION_DECL, but even when
block_ultimate_origin is FUNCTION_DECL.
(remove_unused_locals): If current_function_decl is
polymorphic_ctor_dtor_p, pass initial true to
remove_unused_scope_block_p' is_ctor_dtor_block.
From-SVN: r234987
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/ipa-polymorphic-call.c | 21 | ||||
-rw-r--r-- | gcc/ipa-utils.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-live.c | 18 |
4 files changed, 41 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 17de27f..8f5f320 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2016-04-14 Jakub Jelinek <jakub@redhat.com> + + PR c++/70594 + * ipa-utils.h (polymorphic_ctor_dtor_p): New prototype. + * ipa-polymorphic-call.c (polymorphic_ctor_dtor_p): New function. + (inlined_polymorphic_ctor_dtor_block_p): Use it. + * tree-ssa-live.c (remove_unused_scope_block_p): When + in_ctor_dtor_block, avoid discarding not just BLOCKs with + BLOCK_ABSTRACT_ORIGIN being FUNCTION_DECL, but even when + block_ultimate_origin is FUNCTION_DECL. + (remove_unused_locals): If current_function_decl is + polymorphic_ctor_dtor_p, pass initial true to + remove_unused_scope_block_p' is_ctor_dtor_block. + 2016-04-14 Martin Sebor <msebor@redhat.com> PR c++/69517 diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c index 0ebbd4a..56f3344 100644 --- a/gcc/ipa-polymorphic-call.c +++ b/gcc/ipa-polymorphic-call.c @@ -479,16 +479,12 @@ contains_type_p (tree outer_type, HOST_WIDE_INT offset, } -/* Return a FUNCTION_DECL if BLOCK represents a constructor or destructor. +/* Return a FUNCTION_DECL if FN represent a constructor or destructor. If CHECK_CLONES is true, also check for clones of ctor/dtors. */ tree -inlined_polymorphic_ctor_dtor_block_p (tree block, bool check_clones) +polymorphic_ctor_dtor_p (tree fn, bool check_clones) { - tree fn = block_ultimate_origin (block); - if (fn == NULL || TREE_CODE (fn) != FUNCTION_DECL) - return NULL_TREE; - if (TREE_CODE (TREE_TYPE (fn)) != METHOD_TYPE || (!DECL_CXX_CONSTRUCTOR_P (fn) && !DECL_CXX_DESTRUCTOR_P (fn))) { @@ -510,6 +506,19 @@ inlined_polymorphic_ctor_dtor_block_p (tree block, bool check_clones) return fn; } +/* Return a FUNCTION_DECL if BLOCK represents a constructor or destructor. + If CHECK_CLONES is true, also check for clones of ctor/dtors. */ + +tree +inlined_polymorphic_ctor_dtor_block_p (tree block, bool check_clones) +{ + tree fn = block_ultimate_origin (block); + if (fn == NULL || TREE_CODE (fn) != FUNCTION_DECL) + return NULL_TREE; + + return polymorphic_ctor_dtor_p (fn, check_clones); +} + /* We know that the instance is stored in variable or parameter (not dynamically allocated) and we want to disprove the fact diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index 839c6c5..58d2de7 100644 --- a/gcc/ipa-utils.h +++ b/gcc/ipa-utils.h @@ -70,6 +70,7 @@ void dump_possible_polymorphic_call_targets (FILE *, tree, HOST_WIDE_INT, bool possible_polymorphic_call_target_p (tree, HOST_WIDE_INT, const ipa_polymorphic_call_context &, struct cgraph_node *); +tree polymorphic_ctor_dtor_p (tree, bool); tree inlined_polymorphic_ctor_dtor_block_p (tree, bool); bool decl_maybe_in_construction_p (tree, tree, gimple *, tree); tree vtable_pointer_value_to_binfo (const_tree); diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index c76051a..15fc43f 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -393,14 +393,16 @@ remove_unused_scope_block_p (tree scope, bool in_ctor_dtor_block) in_ctor_dtor_block = true; unused = false; } - /* 2) inside such blocks, the outermost block with BLOCK_ABSTRACT_ORIGIN + /* 2) inside such blocks, the outermost block with block_ultimate_origin being a FUNCTION_DECL. */ - else if (in_ctor_dtor_block - && BLOCK_ABSTRACT_ORIGIN (scope) - && TREE_CODE (BLOCK_ABSTRACT_ORIGIN (scope)) == FUNCTION_DECL) + else if (in_ctor_dtor_block) { - in_ctor_dtor_block = false; - unused = false; + tree fn = block_ultimate_origin (scope); + if (fn && TREE_CODE (fn) == FUNCTION_DECL) + { + in_ctor_dtor_block = false; + unused = false; + } } for (t = &BLOCK_VARS (scope); *t; t = next) @@ -855,7 +857,9 @@ remove_unused_locals (void) cfun->local_decls->truncate (dstidx); } - remove_unused_scope_block_p (DECL_INITIAL (current_function_decl), false); + remove_unused_scope_block_p (DECL_INITIAL (current_function_decl), + polymorphic_ctor_dtor_p (current_function_decl, + true) != NULL_TREE); clear_unused_block_pointer (); BITMAP_FREE (usedvars); |