[LLVMdev] Register pressure mechanism in PRE or Smarter rematerialization/split/spiller/coalescing ?
Philip Reames
listmail at philipreames.com
Wed Jul 15 09:57:49 PDT 2015
On 07/15/2015 07:48 AM, Daniel Berlin wrote:
> On Tue, Jul 14, 2015 at 11:43 PM, Lawrence <lawrence at codeaurora.org> wrote:
>> I thought about a little bit more, I think adding Register pressure control in your patch or PRE may be the only choice.
>>
>> Because at least for this case I am looking at, what your patch did is created more relatively complex long live range, rematerialization is not smart enough to undo your change or at least without a lot of work, coalescing only create even longer live range not shorter, Spiller can't help since it's the Spiller created Spill/Reloads due to high register pressure, Splitting can shorten the live ranges, but I don't think it can handle your case without a lot of work.
>>
> 1. As I mentioned, it simply fixes a bug in implementation of one of
> the two PRE's LLVM has. It does not change the PRE algorithm or add
> anything to it. The code had a bug. I fixed the bug :P. PRE is
> *not even adding more code in this case*. The code is already there.
> All it is doing is inserting a phi node. If you transformed your
> code to use memory, and reverted my patch, you'd get the same result,
> because Load PRE will do the same thing. It's what PRE does.
>
> 2. GCC and other compilers have PRE's literally the same thing my
> patch does (you are welcome to verify, i wrote GCC's :P), and
> apparently are smart enough to handle this in RA. So i'm going to
> suggest that it is, in fact, possible to do so, and i'm going to
> further suggest that if we want to match their performance, we need to
> be able to do the same. You can't simply "turn down" any optimization
> that RA may have to deal with. It usually doesn't work in practice.
> This is one of the reasons good RA is so hard.
>
> 3. As I also mentioned, register pressure heuristics in PRE simply do
> not work. They've been tried. By many. With little to no success.
>
> PRE is too high in the stack of optimizations to estimate register
> pressure in any sane fashion. It's pretty much a fools errand. You
> can never tune it to do what you want. *Many* have tried.
>
> Your base level problem here is that all modern PRE algorithms (except
> for min-cut PRE, as I mentioned), are based on a notion of lifetime
> optimality. That is, they extend lifetimes as minimally as possible to
> still eliminate a given redundancy. Ours does the same.
>
> However, this is not an entirely useful metric. Optimizing for some
> other metric is what something like min-cut PRE lets you do.
> But even then, register pressure heuristics are almost certainly not
> the answer.
>
> 4. This was actually already discussed when the patch was submitted,
> and the consensus was "we should just fix RA". Feel free to look at
> the discussion 5 months ago.
+1. If you can show a common pattern created by PRE which our regalloc
doesn't handle well, please file a bug.
>
> I would suggest, if you want to fix this, you take the approach that
> was discussed then.
>
> _______________________________________________
> 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