[llvm-dev] failing to optimize boolean ops on cmps

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 14 11:22:36 PDT 2017


On 07/14/2017 12:44 PM, Sanjay Patel wrote:
>
>
> On Fri, Jul 14, 2017 at 10:54 AM, Daniel Berlin <dberlin at dberlin.org 
> <mailto:dberlin at dberlin.org>> wrote:
>
>
>
>         I think you're done when you get everything that you have that
>         fits into a model of local transformations and that should be
>         run to a fixed point.
>
>
>     Sure, but to point out what you certainly already know, that's
>     almost every optimization you can think of in a compiler.
>     For example, I can do PRE this way with no issue (IE generate
>     optimal results).
>     Same with reassociation, most CSE, etc.
>
>     A very large set of global stuff can be done by "local transform
>     repeated until fixpoint is reached". It's just not optimal time-wise.
>
>         Certainly an interesting question, but I suspect that the
>         practical answer is "what's in InstCombine."
>
>
>     At least to me, that's clearly the wrong answer, because
>     instcombine already does a lot of non-local stuff that could be
>     done better elsewhere.
>
>
> Let me bring the discussion back to this particular example. This *is* 
> a local optimization; it's the most basic 2-variable boolean logic 
> optimization that's not an instsimplify (where we return a constant or 
> an existing value).
>
> I see 3 possibilities (let me know if there are others):
> 1. Hard: Declare instcombine bankrupt and closed for business because 
> it has already gone over the cliff. We should not add the new matcher 
> type. We should go further and remove the existing combine [ ((~A & B) 
> | A) -> (A | B) ] too because that's the responsibility of some other 
> pass. This might be the best theoretical solution, but practically 
> impossible until someone reinvents instcombine as multiple different 
> passes that have the same optimization power that we have today?
>
> 2. Medium: Take the suggestion from PR27431 ( 
> https://bugs.llvm.org/show_bug.cgi?id=27431 ) to have CSE or GVN 
> replace an inverted compare predicate with an xor of an existing 
> compare. I think this would mean abandoning 
> https://reviews.llvm.org/D35182 and maybe removing that transform 
> altogether to avoid conflicting with the expected canonical form that 
> includes an xor. How this plays out with the rest of instcombine's 
> existing folds and other IR transforms is not clear to me yet.
>
> 3. Easy: Add the new matcher and use it. It's then one 2-line patch 
> after another to ensure that instcombine won't miss these pattern 
> variants no matter what form they come in with. We acknowledge the 
> added mass to instcombine, but live with it for the perf gains...and 
> wait for the now better-performing machines to rewrite the whole thing 
> for us. :)

Not sure about this last part. It is really going to require work by us 
to rewrite things. :-) In the mean time, I think we should go ahead with 
this.

  -Hal

>

-- 
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/20170714/0a619002/attachment.html>


More information about the llvm-dev mailing list