aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-04-14 21:21:31 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-04-14 21:21:31 +0200
commit967ca9b932e2f1b137c4e8b414146b06e1cad45c (patch)
tree689f794a5cd438e124194ffde1382c3f023c5bf2
parentd8747845fded660e09bab98470f77753a4216b6e (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/ipa-polymorphic-call.c21
-rw-r--r--gcc/ipa-utils.h1
-rw-r--r--gcc/tree-ssa-live.c18
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);