[PATCH] D159056: [InstCombine] Make `isFreeToInvert` check recursively.

Noah Goldstein via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 29 14:36:41 PDT 2023


goldstein.w.n added a comment.

In D159056#4626378 <https://reviews.llvm.org/D159056#4626378>, @goldstein.w.n wrote:

> In D159056#4624311 <https://reviews.llvm.org/D159056#4624311>, @nikic wrote:
>
>> The change itself looks fine to me, but the test changes don't look particularly compelling...
>
> Okay,
>
> So the regression is fundementally because for `i1` select we canonicalize: 
> `select C, false, A` -> `select ~C, A, false` 
> and 
> `select C, A, true` -> `select ~C, true, A`.
> This is to put the select into logical and/or form which is necessary for
> A LOT of simplifications.
>
> I started a preliminary patch to only do the canonicalization if it wouldn't
> add a new instruction and the test results look good (maybe 30-40 tests
> save 1-5 instructions, no regressions). That being said, I think a large
> part of the reason for this is the vast majority of our test cases are
> very simple so we usually get away with a free canonicalzation, and most
> of the cases we just don't canonicalize the tests are only a few instructions
> long and aren't really banging and logical and/or patterns.
>
> The easy solution here is to create the canonicalized version -> run
> the simplifications -> if we simplify return that, otherwise pop canonicalized
> version. But thats not really a good coding pattern.
>
> The other approach is to go through all and/or logic and update it to
> also recognize `!and` and `!or`.
>
> Or maybe another reasonable possibility?

Another thought it that even it

> What do you think?
>
> Edit: Personally feel like pushing/popping at the very least makes more
> sense than creating known unnecessary instructions.

This actually isn't so easy.

In D159056#4626378 <https://reviews.llvm.org/D159056#4626378>, @goldstein.w.n wrote:

> In D159056#4624311 <https://reviews.llvm.org/D159056#4624311>, @nikic wrote:
>
>> The change itself looks fine to me, but the test changes don't look particularly compelling...
>
> Okay,
>
> So the regression is fundementally because for `i1` select we canonicalize: 
> `select C, false, A` -> `select ~C, A, false` 
> and 
> `select C, A, true` -> `select ~C, true, A`.
> This is to put the select into logical and/or form which is necessary for
> A LOT of simplifications.
>
> I started a preliminary patch to only do the canonicalization if it wouldn't
> add a new instruction and the test results look good (maybe 30-40 tests
> save 1-5 instructions, no regressions). That being said, I think a large
> part of the reason for this is the vast majority of our test cases are
> very simple so we usually get away with a free canonicalzation, and most
> of the cases we just don't canonicalize the tests are only a few instructions
> long and aren't really banging and logical and/or patterns.
>
> The easy solution here is to create the canonicalized version -> run
> the simplifications -> if we simplify return that, otherwise pop canonicalized
> version. But thats not really a good coding pattern.
>
> The other approach is to go through all and/or logic and update it to
> also recognize `!and` and `!or`.
>
> Or maybe another reasonable possibility?

Another thought is that even if it costs an extra instruction logical and/or form
is more canonical and can be cleaned up elsewhere (i.e at selectiondaglowering).

> What do you think?
>
> Edit: Personally feel like pushing/popping at the very least makes more
> sense than creating known unnecessary instructions.




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D159056/new/

https://reviews.llvm.org/D159056



More information about the llvm-commits mailing list