On 4 July 2016 at 13:51, Andrew Pinski <pins...@gmail.com> wrote:
> On Mon, Jul 4, 2016 at 12:58 AM, Prathamesh Kulkarni
> <prathamesh.kulka...@linaro.org> wrote:
>> Hi,
>> I have attached a "quick and dirty" prototype patch (var-partition-1.diff),
>> that attempts to partition variables to reduce number of
>> external references and to increase usage of section-anchors
>> to CSE address computation of global variables.
>>
>> We could put a variable in a partition that has max references for it,
>> however it doesn't lend itself directly to section anchor optimization.
>> For instance if a partition has max references for variables 'a' and 'b',
>> but no function in that partition references both 'a', and 'b' then AFAIU
>> it doesn't make any difference from section anchors perspective to have them
>> in same partition.
>>
>> The patch tries to assign a set of variables (>= 2)
>> to a partition whose functions have maximum references for that set.
>> Functions within the partition that reference the variables
>> in the set can take advantage of section-anchors. Functions
>> referencing the variables in the set outside the partition
>> would need to load them as external references (using movw/movt),
>> however since we are placing the set in partition that has maximal
>> references for it, number of external references should be overall
>> reduced.
>>
>> Partitioning is gated by -flto-var-partition and enabled
>> only for arm and aarch64.
>
> Why only for arm and aarch64?  Shouldn't it be enabled for all section
> anchor targets?
AFAIK the only targets supporting section anchors are arm, aarch64 and powerpc.
I didn't enable it for ppc64 because I am not sure how much profitable
it is for that target.
Honza mentioned to me some time back that effect of partitioning on
powerpc was nearly zero.

Thanks,
Prathamesh
>
> Thanks,
> Andrew
>
>> As per previous discussion [1], I haven't
>> touched function partitioning. Does this approach look ok
>> especially regarding correctness ?
>> So far, I have cross-tested patch on arm*-*-*, aarch64*-*-*.
>>
>> I haven't yet managed to benchmark the patch.
>> As a cheap measurement, I tried to measure number of external
>> references with and without patch by writing a small ipa pass
>> which is run during ltrans and simply walks over varpool nodes
>> and counts number of varpool_nodes for which DECL_EXTERNAL (vnode->decl) is 
>> true
>> and vnode->definition is 0. Is that sufficient condition to determine
>> if variable is externally defined ? I have attached the pass
>> (count-external-refs.diff)
>> and the comparison done with it for for SPEC2000 [2]. The entries
>> in "before" and "after" column contain summation of number of
>> external refs (total_count) across all partitions before and after applying
>> the patch. Does the comparison hold any merit ?
>> I was wondering if we could we use a better way for
>> measuring statically the effects of variable partitioning ?
>> I hope also to get done with benchmarking soon.
>>
>> I have not yet figured out how to integrate it with existing cost metrics for
>> balanced partitioning, I am looking into that.
>> I would be grateful for suggestions on the patch.
>>
>> [1] https://gcc.gnu.org/ml/gcc/2016-04/msg00090.html
>>
>> [2] SPEC2000 comparison:
>> https://docs.google.com/spreadsheets/d/1xnszyw04ksoyBspmCVYesq6KARLw-PA2n3T4aoaKdYw/edit?usp=sharing

Reply via email to