This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR ipa/65908.
- From: Martin Liška <mliska at suse dot cz>
- Cc: gcc-patches at gcc dot gnu dot org, Jan Hubicka <hubicka at ucw dot cz>
- Date: Wed, 17 Jun 2015 15:29:57 +0200
- Subject: Re: [PATCH] Fix PR ipa/65908.
- Authentication-results: sourceware.org; auth=none
- References: <5555B0A1 dot 1060702 at suse dot cz> <20150515103832 dot GO1751 at tucnak dot redhat dot com> <5555F205 dot 1060609 at suse dot cz> <20150515185238 dot GA85866 at kam dot mff dot cuni dot cz> <55782471 dot 4020505 at suse dot cz>
On 06/10/2015 01:50 PM, Martin Liška wrote:
> On 05/15/2015 08:52 PM, Jan Hubicka wrote:
>>> +/* Return true if DECL_ARGUMENT types are valid to be merged. */
>> Perhaps bettter as
>>
>> Perform additional check needed to match types function parameters that are
>> used. Unlike for normal parameters it matters if type is TYPE_RESTRICT and we
>> make an assumption that REFERENCE_TYPE parameters are always non-NULL.
>>
>>> +
>>> +bool
>>> +sem_function::compatible_parm_types_p ()
>>> +{
>>> + tree parm1, parm2;
>>> + unsigned i = 0;
>>> +
>>> + for (parm1 = DECL_ARGUMENTS (decl),
>>> + parm2 = DECL_ARGUMENTS (m_compared_func->decl);
>>> + parm1 && parm2;
>>> + parm1 = DECL_CHAIN (parm1), parm2 = DECL_CHAIN (parm2), i++)
>>
>> I think this is still not right. What you wan to to do is to have
>>
>> 1) comparible_parm_types_p (t1,t2, index) that returns true if T1 and T2 are
>> matching with checks bellow:
>>> + {
>>> + if (!param_used_p (i))
>>> + continue;
>>> +
>>> + if (POINTER_TYPE_P (parm1)
>>> + && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
>>> + return return_false_with_msg ("argument restrict flag mismatch");
>>> + /* nonnull_arg_p implies non-zero range to REFERENCE types. */
>>> + if (POINTER_TYPE_P (parm1)
>>> + && TREE_CODE (parm1) != TREE_CODE (parm2)
>>> + && opt_for_fn (decl, flag_delete_null_pointer_checks))
>>> + return return_false_with_msg ("pointer wrt reference mismatch");
>>> + }
>> withtout actually walking the chain.
>>
>> 2) make equals_wpa to walk TYPE_ARG_TYPES of the function type and match them.
>> This is because DECL_ARGUMENTS are part of function body and before you
>> read it into memory, these are NULL
>>
>> Walking DECL_ARGUMENTS here may cause ipa-icf to give up in case one body is
>> read (and thus have some arguments) and other is not.
>>
>> 3) make equals_private walk DECL_ARGUMENTS and match them
>> (well at the time you populate the map.)
>> You probalby can skip matching PARM_DECLS that are !parm_used_p (i)
>> for anything else than types_compatible_p.
>>
>> We only care they are passed the same way by ABI. Everything else is not
>> relevant.
>>
>> Honza
>>
>
> Hi Honza.
>
> I forgot a bit about the patch.
> Please check updated version of the patch which can boostrap and survives
> regression tests.
>
> Martin
>
As we're planning to release 5.2 soon, I ping the patch.
Martin