[llvm-dev] InstCombine, graph rewriting, Equality saturation

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Mon Sep 11 09:48:41 PDT 2017

On 09/11/2017 10:50 AM, Sean Silva via llvm-dev wrote:
> On Mon, Sep 11, 2017 at 8:14 AM, Daniel Neilson via llvm-dev 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>     Just thinking out loud…. I’m really not familiar with the vast
>     majority of what instcombine does, so please excuse me if my
>     naiveté is too obvious. I can’t help but notice all of the uses of
>     ‘and’ in Daniel B’s description of what instcombine is right now:
>     > On Sep 8, 2017, at 11:27 PM, Daniel Berlin via llvm-dev
>     <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>     >
>     > FWIW, Before getting to "how to do it", I think InstCombine
>     needs an actual goal.
>     > Right now it's "do a bunch of instruction combination and
>     canonicalization and random kinds of semi-local optimization with
>     some weird analysis and other stuff in the middle.
>     > Iterate this as hard as we can"
>     > Nobody can really draw any real dividing line for what should be
>     there or not except based on how easy or expensive it is to shove
>     it in.
>     > That's a recipe for pass creep.
>     This makes me wonder… is it sensible to be talking about splitting
>     up instcombine into multiple separate passes? Would such a thing
>     even be possible? For example, split by functionality into
>     separate passes that each do one of:
>     * instruction combinations
>     * canonicalization
>     * semi-local optimizations
>     * etc…

The problem is that all of these are really the same thing. Almost all 
canonicalizations are also simplifications, the common underlying factor 
being that they're mostly-local transformations that likely enable other 

>      Or something like that.
>      As separate passes, each would probably have a natural way to be
>     implemented effectively and those implementations might vary.
> One obstacle to that is that currently instcombine has an internal 
> fixed-point iteration that it does.
> So when splitting it into separate passes we would need to either add 
> fixed-point iteration to the pass manager running the separate 
> instcombine passes (extending the pass management in this way is 
> doable and has been explored in the past, e.g. 
> https://www.youtube.com/watch?v=c7iP43an5_Q ) or demonstrate/measure 
> that we don't regress without the fixed-point iteration across 
> separate instcombine passes.

I agree, but I'll add that I view the fixed-point iteration here to be 
an asset. It increases the robustness and consistency of the compiler, 
and allows later passes to depend on the canonicalization (*) without 
worrying about phase-ordering effects (**).

(*) In my experience, the largest problem we have in this regard is our 
lack of documentation on what our canonical form is.
(**) To be clear, we still have phase-ordering effects within 
InstCombine. Using a better system for dealing with the rewriting rules, 
I hope, will help. Nevertheless, these effects are much rarer than if we 
ran InstCombine only as discrete passe.

I'd like to see us do more fixed-point iteration in our optimization 
pipeline, and our past work has shown this would be practical (i.e., 
only a few iterations will be needed in practice), but even that won't 
remove the advantages of using a fixed-point iteration within InstCombine.

Regardless, I think that if we had a model for what InstCombine did 
(i.e., as a graph-rewriting system), then it would be clear what could 
be part of that system and what couldn't. Otherwise, I think that the 
real challenge here is figuring out the underlying structural 
foundations to make the process efficient and sound.


> -- Sean Silva
>     -Daniel
>     ---
>     Daniel Neilson, Ph.D.
>     Azul Systems
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170911/23ecd0fb/attachment.html>

More information about the llvm-dev mailing list