[PATCH] Check DECL_CONTEXT of new/delete operators.
Jan Hubicka
hubicka@ucw.cz
Fri Apr 3 15:42:12 GMT 2020
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
More information about the Gcc-patches
mailing list