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.