Preserving tree node fields for access in LTO?

Uday Khedker uday@cse.iitb.ac.in
Tue Jul 28 17:12:00 GMT 2015


On 07/28/2015 08:10 PM, Richard Biener wrote:
> On July 28, 2015 4:37:15 PM GMT+02:00, "Uday P. Khedker" <uday@cse.iitb.ac.in> wrote:
>>
>> Richard Biener wrote on Tuesday 28 July 2015 01:12 PM:
>>> On Mon, Jul 27, 2015 at 7:14 PM, Uday Khedker <uday@cse.iitb.ac.in>
>> wrote:
>>>> We have added a new field (bool ptr_arith in struct tree_base) to
>> the tree
>>>> node. We are assigning values to this field in a gimple pass in
>> non-LTO mode
>>>> and would like to access them in LTO mode in our ipa passes. It
>> appears that
>>>> all fields of tree node are not preserved in LTO mode. Is there any
>> way to
>>>> tell GCC that a given field should be preserved so that it can be
>> accessed
>>>> in LTO mode?
>>> You have to explicitely add the streaming to tree-streamer-{in,out}.c
>>>
>>>
>> Thanks for this info. We have done the following:
>>
>> (a) Added a field to tree_base in the file tree.h as follows:
>>
>>        unsigned ptr_arith : 1;
>>
>>       right after
>>
>>        ENUM_BITFIELD(tree_code) code : 16;
>>
>> (b) Added the following code to function  pack_ts_base_value_fields in
>> the file tree-streamer-out.c
>>
>>         bp_pack_value (bp, TREE_PTR_ARITH (expr), 1);
>>
>>        just after
>>
>>         bp_pack_value (bp, TREE_CODE (expr), 16);
>>
>>         Macro TREE_PTR_ARITH access the field pts_arith.
>>
>> (c) Added the following code to function unpack_ts_base_value_fields in
>> the file tree-streamer-in.c
>>
>>         TREE_PTR_ARITH (expr) = (unsigned) bp_unpack_value (bp, 1);
>>
>>        right in the beginning.
>>
>> We are getting the correct values in non-LTO mode of our pass. However,
>> the same code has values 0 in the LTO mode execution.
>>
>> Is there anything else that we need to do? We briefly looked at the
>> functions in tree-streamer-{in,out}.c but could not guess if something
>> more needs to be done
> No, that should be all.  Though dependent on what trees the flags are on you might want to change the tree compare function in lto.c as well.
>
> Are you sure the trees survive until lto streaming?
>

The trees survive because all other fields show correct values. Only the 
new flag remains 0.

Our flag is present in the tree unconditionally. We have written a pass 
which sets this flag conditionally for a tree that involves a pointer 
arithmetic (default value is 0).

Which comparison function are you referring to? There is a function 
lto_splay_tree_compare_ids in lto.c. Is there any other function that we 
are missing?

If it matters: We are using gcc-4.7.2 and using the option 
-flto-partition=none.

Uday.




More information about the Gcc mailing list