[LLVMdev] [RFC] AArch64: Should we disable GlobalMerge?
Quentin Colombet
qcolombet at apple.com
Fri Feb 27 15:13:01 PST 2015
> On Feb 27, 2015, at 2:03 PM, Ahmed Bougacha <ahmed.bougacha at gmail.com> wrote:
>
> On Thu, Feb 26, 2015 at 4:09 AM, Renato Golin <renato.golin at linaro.org> wrote:
>> On 26 February 2015 at 00:57, Ahmed Bougacha <ahmed.bougacha at gmail.com> wrote:
>>> -- A way forward
>>> One obvious way to improve it is: look at uses of globals, and try to
>>> form sets of globals commonly used together. The tricky part is to
>>> define heuristics for "commonly". Also, the pass then becomes much
>>> more expensive. I'm currently looking into improving it, and will
>>> report if I come up with a good solution. But this shouldn't stop us
>>> from disabling it, for now.
>>
>> Hi Ahmed,
>>
>> Before "moving forward", it would be good to understand what in
>> GlobalMerge is impacting what in LTO.
>>
>> With LTO becoming more important nowadays, I agree we have to balance
>> the compiler optimisations to work well with it, but by turning things
>> off we might be impacting unknown code in an unknown way.
>>
>> We'll never know how unknown code behaves, but if at least we
>> understand what of GM affects what of LTO, then people using unknown
>> code will have a more informed view on what to disable, when.
>
> Fair enough. First, a couple things to note:
> - GlobalMerge runs as a pre-ISel pass, so very late in the mid-level pipeline.
To be precise, GlobalMerge is registered as a pre-ISel pass, but still it runs very early in the pipeline, because all its work in done during doInitialization… Pretty broken, I know.
-Quentin
> - GlobalMerge (by default) only looks at internal globals.
>
> Internal globals come up with file- or function- static variables. In
> LTO, all module-level globals are internalized, and are eligible for
> merging.
>
> So, we can generally group global usage into a few categories:
> - a function that uses a local static variable (say, llvm::outs())
> - a function that uses several globals at once. For instance,
> 400.perlbench's interpreter has a bunch of those, as does its
> parser/lexer.
> - a set of functions that share a few common globals (say, an inlined
> reference to a function-local static variable), but otherwise each use
> several other globals (again, perl's interpreter).
>
>
> GlobalMerge is only ever a win if we are able to share base pointers.
> This requires:
> - several globals being referenced
> - the references being close enough (otherwise we'll just
> rematerialize the base, or worse, increase register pressure)
>
> There is one obvious special case for the first requirement: if a
> global is only ever used alone, there's no point in merging it
> anywhere. (this is improvement #1).
> Once we can determine the set of used globals for each function, we
> can try to merge those sets only. (#2)
>
> We can try to better handle the second requirement, by having some
> more precise metric for distance between uses. One trivially
> available such metric is grouping used sets by parent basic-block
> rather than function (#3).
>
>
>
> Experimentally, #1 catches a lot of the singleton-ish globals out
> there, which is the majority in some of the more "modern" code I've
> looked at. It leaves the legitimate merging in perl alone.
>
> #2 (and even moreso #3) is actually too aggressive, and doesn't catch
> a lot/most of the profitable cases in perl. Consider:
> - a "g_log" global (or, say, LLVM's outs/dbgs/errs), used pretty much everywhere
> - several sets of globals, used in different parts of the program
> (perl's interpreter vs parser)
>
> You'd pick one of the latter sets, and add the "g_log" global to it.
> Now you made it more expensive everywhere you use "g_log", without the
> benefit of base sharing in all the other functions.
>
> So you need to be smart when picking the sets. You can combine some
> of them, using some cost metric. (#4) This is where it gets
> complicated.
>
>
> I'll try measuring some of those, see what happens on benchmarks.
> Again, that shouldn't stop us from enabling GlobalMerge less often.
> Hopefully it's clear that the pass isn't always a win, so -O3 should
> be OK. I'm less comfortable with disabling it on Darwin only, but
> that seems like the obvious next step.
>
> Thanks for the feedback!
>
> -Ahmed
>
>> cheers,
>> --renato
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list