On Mon, Oct 13, 2008 at 4:38 PM, Andrew Haley <[EMAIL PROTECTED]> wrote:
> Andrew Pinski wrote:
>> On Fri, Oct 10, 2008 at 11:14 AM, Andrew Haley <[EMAIL PROTECTED]> wrote:
>>> Richard Guenther wrote:
>>>> On Fri, Oct 10, 2008 at 7:55 PM, Andrew Haley <[EMAIL PROTECTED]> wrote:
>>>>> I have some broken code, compiled from Java source.
>>>>>
>>>>> It looks like:
>>>>>
>>>>> D.843 = &java.text.Collator.class$$;
>>>>> _Jv_InitClass (D.843);
>>>>> D.845 = &_CD_java_text_Collator;
>>>>>
>>>>> is being turned into:
>>>>>
>>>>> D.843 = &java.text.Collator.class$$;
>>>>> D.845 = &_CD_java_text_Collator;
>>>>> _Jv_InitClass (D.843);
>>>> This is always a valid transformation.
>>>>
>>>>> i.e. the memory reference is moved to before the call to _Jv_InitClass.
>>>> There is no memory reference in the above case, it seems just the address
>>>> of _CD_java_text_Collator is taken.
>>>>
>>>> Or maybe I'm missing sth?
>>> In the RTL code it moves the mem ref, not just the address:
>>>
>>> (call (mem:QI (symbol_ref:DI ("_Jv_InitClass") [flags 0x41]
>>>
>>> (set (reg/f:DI 95 [ #ref#8#1 ])
>>> (mem/s/u/f/j:DI (const:DI (plus:DI (symbol_ref:DI
>>> ("_CD_java_text_Collator")
>>> (const_int 16 [0x10])))
>>>
>>> is turned to:
>>>
>>> (set (reg/f:DI 162 [ #ref#8#1 ])
>>> (mem/s/u/f/j:DI (const:DI (plus:DI (symbol_ref:DI
>>> ("_CD_java_text_Collator")
>>> (const_int 16 [0x10])))
>>>
>>> ...
>>>
>>> (call (mem:QI (symbol_ref:DI ("_Jv_InitClass")
>>
>> Well the mem has a /u on it so it is being marked as MEM_READONLY_P so
>> it is valid optimization. Why it is being marked with MEM_READONLY_P,
>> I don't know.
>
> I've found the code that's incorrectly marking the decl as TREE_READONLY.
> It's here:
>
> /* If the variable is never written, we can set the TREE_READONLY
> flag. Additionally if it has a DECL_INITIAL that is made up of
> constants we can treat the entire global as a constant. */
>
> bitmap_and_compl (module_statics_readonly, all_module_statics,
> module_statics_written);
> EXECUTE_IF_SET_IN_BITMAP (module_statics_readonly, 0, index, bi)
> {
> tree var = get_static_decl (index);
>
> /* Ignore variables in named sections - changing TREE_READONLY
> changes the section flags, potentially causing conflicts with
> other variables in the same named section. */
> if (DECL_SECTION_NAME (var) == NULL_TREE)
> {
> TREE_READONLY (var) = 1;
>
> The decl (called _CD_ppp) is not written by the code we generate, that's true.
> However, there is a global struct class$, which contains a field which points
> to
> _CD_ppp:
>
> ppp::class$:
> .quad vtable for java::lang::Class+16
> .quad 1074145824
> .quad _Utf6
> .value 33
> .zero 6
> .quad java::lang::Object::class$
> .long 2
> .zero 4
> .quad _CT_ppp
> .quad _CD_ppp
> ...
>
> .type _CD_ppp, @object
> .size _CD_ppp, 16
> _CD_ppp:
> .quad 0
> .quad _Utf5
>
> I would expect that this would mean that _CD_ppp has its address taken, and
> therefore should not be marked as TREE_READONLY.
Right. So I guess ipa-reference doesn't properly treat all TU local globals
as written-to if the write occurs through a pointer we don't know where it
points to.
Honza - you recently looked into ipa-reference -- does it try to do the
right thing with pointer accesses here? I guess it may miss taking addresses
from inside initializers. Andrew - is this address-taking from ppp::class$
visible from a DECL_INITIAL or is this hidden behind some magic?
Thanks,
Richard.