Hi,
and this is the streaming fix

diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index e4077b58890..dd9645723c1 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -646,6 +647,19 @@ degenerate_phi_p (gimple *phi)
   return true;
 }
 
+/* Return true if C1 and C2 are matching contexts (both translation unit decls
+   or both types.  */
+
+bool
+matching_contexts_p (tree c1, tree c2)
+{
+  if (TREE_CODE (c1) == TRANSLATION_UNIT_DECL)
+    return TREE_CODE (c2) == TRANSLATION_UNIT_DECL;
+  if (TREE_CODE (c2) == TRANSLATION_UNIT_DECL)
+    return TREE_CODE (c1) == TRANSLATION_UNIT_DECL;
+  return types_same_for_odr (c1, c2);
+}
+
 /* Propagate necessity using the operands of necessary statements.
    Process the uses on each statement in the worklist, and add all
    feeding statements which contribute to the calculation of this
@@ -824,16 +838,28 @@ propagate_necessity (bool aggressive)
                           || DECL_FUNCTION_CODE (def_callee) == 
BUILT_IN_CALLOC))
                      || DECL_IS_REPLACEABLE_OPERATOR_NEW_P (def_callee)))
                {
-                 /* Delete operators can have alignment and (or) size as next
-                    arguments.  When being a SSA_NAME, they must be marked
-                    as necessary.  */
-                 if (is_delete_operator && gimple_call_num_args (stmt) >= 2)
-                   for (unsigned i = 1; i < gimple_call_num_args (stmt); i++)
-                     {
-                       tree arg = gimple_call_arg (stmt, i);
-                       if (TREE_CODE (arg) == SSA_NAME)
-                         mark_operand_necessary (arg);
-                     }
+                 if (is_delete_operator)
+                   {
+                     /* Verify that new and delete operators have the same
+                        context.  */
+                     if (DECL_IS_REPLACEABLE_OPERATOR_NEW_P (def_callee)
+                         && !matching_contexts_p
+                                (DECL_CONTEXT (def_callee),
+                                 DECL_CONTEXT (gimple_call_fndecl (stmt))))
+                       mark_operand_necessary (gimple_call_arg (stmt, 0));
+
+                     /* Delete operators can have alignment and (or) size
+                        as next arguments.  When being a SSA_NAME, they
+                        must be marked as necessary.  */
+                     if (gimple_call_num_args (stmt) >= 2)
+                       for (unsigned i = 1; i < gimple_call_num_args (stmt);
+                            i++)
+                         {
+                           tree arg = gimple_call_arg (stmt, i);
+                           if (TREE_CODE (arg) == SSA_NAME)
+                             mark_operand_necessary (arg);
+                         }
+                   }
 
                  continue;
                }
diff --git a/gcc/tree.c b/gcc/tree.c
index 63dc6730b2b..cd608a9c878 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5879,6 +5879,9 @@ free_lang_data_in_decl (tree decl, class free_lang_data_d 
*fld)
      merging may merge some fileds and keep others disjoint wich in turn will
      not do well with TREE_CHAIN pointers linking them.
 
+     tree-ssa-dce is using context to match new and delete operators (which may
+     be static functions).
+
      Also do not drop containing types for virtual methods and tables because
      these are needed by devirtualization.
      C++ destructors are special because C++ frontends sometimes produces
@@ -5886,6 +5889,9 @@ free_lang_data_in_decl (tree decl, class free_lang_data_d 
*fld)
      devirutalization code we always walk through aliases and we need
      context to be preserved too.  See PR89335  */
   if (TREE_CODE (decl) != FIELD_DECL
+      && (TREE_CODE (decl) != FUNCTION_DECL
+         || (!DECL_IS_REPLACEABLE_OPERATOR_NEW_P (decl)
+             && !DECL_IS_OPERATOR_DELETE_P (decl)))
       && ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
           || (!DECL_VIRTUAL_P (decl)
              && (TREE_CODE (decl) != FUNCTION_DECL

Reply via email to