re PR c++/70594 (-fcompare-debug failure)
authorJakub Jelinek <jakub@redhat.com>
Thu, 14 Apr 2016 19:21:31 +0000 (21:21 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 14 Apr 2016 19:21:31 +0000 (21:21 +0200)
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

gcc/ChangeLog
gcc/ipa-polymorphic-call.c
gcc/ipa-utils.h
gcc/tree-ssa-live.c

index 17de27f41c78d6e85eddccd5f3d8066d71f2f264..8f5f3207232b425bbd8ed12c3583aefc68cc6c1b 100644 (file)
@@ -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
index 0ebbd4ae66da5ab9f02afb87e8c2f40af63d2226..56f334471de498f7f0407eb3b27cb03f9e2b1ad5 100644 (file)
@@ -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
index 839c6c514442c534a65270cc54c18095877518f6..58d2de7e3c57b38d7dbb42140580698fe3db795e 100644 (file)
@@ -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);
index c76051ac5421ef4a76495346eea1320e84b778bf..15fc43f812604277f3648d4641eb5f4291ad045d 100644 (file)
@@ -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);