On Thu, Jul 21, 2011 at 12:27 PM, Rong Xu <x...@google.com> wrote:
> this is a good point. ipa_discover_readonly_nonaddressable_vars() is
> called in two passes. whole-program (whole program visibility
> analysis) and static-var. The one in whole-program is ok here as it is
>  bundled together with the analysis. the invocation in static-var can
> go wrong.
>
> should we add a check for COMDAT flag also? like

Probably not -- only non referenced comdat vars will be marked as not needed.

David

> if ((vnode->needed || (L_IPO_COMP_MODE && DECL_COMDAT (node->decl)))
>    && varpool_node_externally_visible_p) (
>
> Thanks,
>
> -Rong
> On Thu, Jul 21, 2011 at 11:59 AM, Xinliang David Li <davi...@google.com> 
> wrote:
>> On Thu, Jul 21, 2011 at 11:32 AM, Rong Xu <x...@google.com> wrote:
>>> On Thu, Jul 21, 2011 at 11:09 AM,  <davi...@google.com> wrote:
>>>>
>>>> http://codereview.appspot.com/4798045/diff/1/ipa.c
>>>> File ipa.c (right):
>>>>
>>>> http://codereview.appspot.com/4798045/diff/1/ipa.c#newcode1034
>>>> ipa.c:1034: {
>>>> Has varpool node linking happened at this point? If not, the new code
>>>> here is not excersised.
>>>
>>> This functions is called in multiple places: local pass and
>>> whole_program pass. varpool_node_link is b/w these two passes. the
>>> varpool node attribute is set before the use in
>>> ipa_discover_readonly_nonaddressable_vars()
>>
>> So the code relies on the second visibility pass to get things right
>> -- if that pass is disabled things can go wrong (if the default
>> visibility value when vnode is created is true, LIPO mode will get
>> pessemitic result; if the default is false, LIPO mode will still get
>> wrong result if only local visiblity pass is run).
>>
>> A better fix might be simply do not check 'needed' bit for comdat
>> varnode in LIPO mode and always run the visibiity checker:
>>
>> if ((vnode->needed || L_IPO_COMP_MODE)
>>   && varpool_node_externally_visible_p (...
>>  )
>>
>>
>> David
>>
>>
>>>
>>>>
>>>> http://codereview.appspot.com/4798045/diff/1/ipa.c#newcode1041
>>>> ipa.c:1041: vnode->externally_visible = false;
>>>> Better to add a simple loop after varpool_node_linking to merge the
>>>> attribute in l-ipo.c assuming the linking happens after local visibility
>>>> pass.
>>>
>>> We can merge in the varpool_node_link, but we still need to change
>>> here as the attribute will be overwritten here in the whole_program
>>> pass.
>>>
>>>>
>>>> http://codereview.appspot.com/4798045/
>>>>
>>>
>>
>

Reply via email to