[PATCH] Remove also 2nd argument for unused delete operator (PR tree-optimization/91270).
Martin Liška
mliska@suse.cz
Tue Jul 30 13:41:00 GMT 2019
On 7/30/19 3:09 PM, Marc Glisse wrote:
> On Tue, 30 Jul 2019, Martin Liška wrote:
>
>> On 7/30/19 1:35 PM, Marc Glisse wrote:
>>> +         /* Some delete operators have size as 2nd argument. */
>>>
>>> Some delete operators have 3 arguments. From cp/decl.c:
>>>
>>> Â Â Â Â Â Â Â Â Â Â Â /* operator delete (void *, size_t, align_val_t); */
>>>
>>
>> Yep, I know. The patch I installed expects at least 2 arguments:
>>
>> +                /* Some delete operators have size as 2nd argument. */
>> +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (is_delete_operator && gimple_call_num_args (stmt) >= 2)
>
> True, I guess I am a bit confused why the second argument (which could be either size or alignment) needs special handling (mark_operand_necessary) while the third one does not (it is usually a constant).
Ah, that's bad, both of them need a care:
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index bec13cd5930..80d5f5c30f7 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -824,13 +824,16 @@ propagate_necessity (bool aggressive)
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
|| DECL_IS_REPLACEABLE_OPERATOR_NEW_P (def_callee)))
{
- /* Some delete operators have size as 2nd argument. */
+ /* 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)
- {
- tree size_argument = gimple_call_arg (stmt, 1);
- if (TREE_CODE (size_argument) == SSA_NAME)
- mark_operand_necessary (size_argument);
- }
+ 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;
}
>
> I tried to experiment to understand, but it is complicated because including <new> disables the optimization:
>
> #include <new>
> void fn1() {
> Â Â Â char*p=new char;
> Â Â Â delete p;
> }
>
> This ICEs with -O -std=c++17:
>
> int a = 64;
> std::align_val_t b{64};
> void fn1() {
> Â void *s = operator new(a,b);
> Â operator delete(s,8+*(unsigned long*)s,b);
> }
>
>
I can't see it on current master. Can you?
Martin
More information about the Gcc-patches
mailing list