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