[LLVMdev] [RFC] Invariants in LLVM
Philip Reames
listmail at philipreames.com
Thu Jul 17 15:55:31 PDT 2014
On 07/17/2014 02:44 PM, Chandler Carruth wrote:
> On Thu, Jul 17, 2014 at 5:31 PM, Philip Reames
> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>
> 3. An "llvm.invariant" has zero code generation cost. Given that,
> a lot of pattern matching and profitability heuristics will need
> adjusted to ignore them.
>
>
> FWIW, this has been the fundamental point of contention in the entire
> design. I've discussed this several times with Andy, Hal, and others.
> I'll try to summarize a few points here, although getting all of the
> points is beyond me. Also, this is *my* takeaway, I'm probably not
> doing justice to other positions here, but hopefully others will chime in.
>
> IMO, this cannot be avoided. This is *the* tradeoff of encoding
> assumptions: you risk the complexity of the assumption you are
> expressing imposing more optimization costs than you get in
> simplifications due to the extra information. I think we should just
> make this very clear in the documentation, and then not worry about it
> too much. The idea is to only use this to express really important,
> and impossible to deduce invariants of the program or high-level
> abstraction in the IR. Unless it has really significant effects, it
> isn't worth it, don't do it. =/ It may not be the most theoretically
> satisfying result, but I think it is practical.
>
> The other ideas have been to try to use some metadata encoding scheme
> to partition the abstraction from the actual IR. However, all of these
> IMO degenerate to specifying a "shadow IR" -- an entirely different IR
> that we still have to canonicalize, optimize, and pattern match, but
> which is somehow different and separated from the actual IR. I think
> the complexity of this is tremendously higher and would be a real
> problem long-term. I also don't think that the gain is worth the tradeoff.
This is a convincing argument; I find myself agreeing.
>
> I worry about the maintenance cost of this in the optimizer.
>
>
> As long as we don't go "crazy" trying to recover the performance, it
> should be OK. Hal has already put together the patches needed for his
> current approach. We'll likely have to tweak this approach a little,
> but we don't need to go throguh and change every single hasOneUse()
> check to do something special with these invariants (or assumptions).
>
> I can see a couple of possibilities here:
> - Canonicalize the placement of "llvm.invariants: at the end of
> each basic block. This at least reduces the patterns to be matched.
>
>
> I think that the use of use-def SSA graph information makes the
> placement of these unimportant.
I suspect that we also match on "empty" or "near empty" basic blocks in
numerous places. We'll need to handle that case.
> On the flip side, sinking the invariant below a call which might
> unwind would reduce scope over which the invariant applies.
You're right; I'd failed to consider this case. Suggestion withdrawn. :)
>
> - Remove the invariant instructions entirely from the in flight
> IR. Use the "llvm.invariant" instruction only for serialization,
> but have the conditions stored directly on the basic blocks when
> in memory. This would reduce the pattern matching problem, but at
> cost of extra complexity.
>
>
> This is very similar to the metadata approach -- it boils down to
> needing to have and hold a reasonably complete "IR" which isn't the
> actual IR.
I see your point and agree.
I think I'm convinced this is a cost we're just going to have to pay.
I'm not thrilled about that, but I agree it seems to beat the alternatives.
>
>
> 4. How will the presence of "llvm.invariants" effect things like
> code placement? I could see have lots of extra users (which are
> dropped late in the optimizer) causing somewhat surprising
> results. (i.e. we perform CSE, instruction gets placed
> differently, performance differs)
>
>
> Somewhat surprising, but I suspect it won't be terribly different.
> These won't make past codegen prep (and maybe removed even before LSR
> or such) and so shouldn't really change the scheduling within a basic
> block.
I suspect we need data on this one. This is not something which should
hold the submission in any way, but it would be interesting to study
long term.
Philip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140717/9811f9ac/attachment.html>
More information about the llvm-dev
mailing list