On 8/5/19 9:07 AM, Marc Glisse wrote:
> On Mon, 5 Aug 2019, Martin Liška wrote:
>
>> I'm sending fix for the ICE. The issue is that we can end up
>> with a ctor without an argument (when not being used).
>
> Ah, I didn't realize that after cloning and drastically changing the
> signature it would still count as operator new/delete. Is getting down to 0
> arguments the only bad thing that can happen? Can't we have an operator
> delete (void*, void*) where the first argument gets optimized out and we end
> up optimizing as if the second argument was actually the memory being
> released? Should we do some sanity-checking when propagating the new/delete
> flags to clones?
>
It can theoretically happen, but it should be properly handled in the following
code:
810 if (is_delete_operator
811 || gimple_call_builtin_p (stmt, BUILT_IN_FREE))
812 {
813 /* It can happen that a user delete operator has the
pointer
814 argument optimized out already. */
815 if (gimple_call_num_args (stmt) == 0)
816 continue;
817
818 tree ptr = gimple_call_arg (stmt, 0);
819 gimple *def_stmt;
820 tree def_callee;
821 /* If the pointer we free is defined by an allocation
822 function do not add the call to the worklist. */
823 if (TREE_CODE (ptr) == SSA_NAME
824 && is_gimple_call (def_stmt = SSA_NAME_DEF_STMT (ptr))
825 && (def_callee = gimple_call_fndecl (def_stmt))
826 && ((DECL_BUILT_IN_CLASS (def_callee) ==
BUILT_IN_NORMAL
827 && (DECL_FUNCTION_CODE (def_callee) ==
BUILT_IN_ALIGNED_ALLOC
828 || DECL_FUNCTION_CODE (def_callee) ==
BUILT_IN_MALLOC
829 || DECL_FUNCTION_CODE (def_callee) ==
BUILT_IN_CALLOC))
830 || DECL_IS_REPLACEABLE_OPERATOR_NEW_P
(def_callee)))
831 {
832 /* Delete operators can have alignment and (or) size
as next
833 arguments. When being a SSA_NAME, they must be
marked
834 as necessary. */
835 if (is_delete_operator && gimple_call_num_args (stmt)
>= 2)
836 for (unsigned i = 1; i < gimple_call_num_args
(stmt); i++)
837 {
838 tree arg = gimple_call_arg (stmt, i);
839 if (TREE_CODE (arg) == SSA_NAME)
840 mark_operand_necessary (arg);
841 }
Where we verify that first argument of delete call is defined as a LHS of a new
operator.
Martin