[PATCH] D116231: [InstCombine] (~a & ~b & c) | (~a & ~c & b) --> (b ^ c) & ~a
Stanislav Mekhanoshin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 6 10:11:10 PST 2022
rampitec added a comment.
In D116231#3225213 <https://reviews.llvm.org/D116231#3225213>, @spatel wrote:
> In D116231#3224577 <https://reviews.llvm.org/D116231#3224577>, @foad wrote:
>
>> I don't really have an opinion on the patch, but I'm curious.
>>
>> Given (~a & ~b & c) | (~a & ~c & b), do we make any attempt to pull out the ~a like this: ~a & ((~b & c) | (~c & b)) ? If not, why not? Would that be a good thing to address? Then it's just a case of simplifying the two-variable (~b & c) | (~c & b) -> b ^ c which is easy.
>
> InstCombine does try that transform via InstCombinerImpl::SimplifyAssociativeOrCommutative() and/or InstCombinerImpl::SimplifyUsingDistributiveLaws(). And that works as expected - for example if we alter the 1st modified test in this patch to be like this:
>
> define i32 @not_and_not_and_and_or(i32 %a, i32 %b, i32 %c) {
> %nota = xor i32 %a, -1
> %notb = xor i32 %b, -1
> %and1 = and i32 %nota, %c
> %and2 = and i32 %and1, %notb
> %or1 = or i32 %a, %c
> %not1 = xor i32 %or1, -1
> %and3 = and i32 %not1, %b
> %or3 = or i32 %and2, %and3
> call void @use(i32 %nota)
> call void @use(i32 %notb)
> ret i32 %or3
>
> Then it reduces because we find the 'b' and '~b' values directly in the operands of the 'and' instructions. So this might be a question for "-reassociate" - can we get that pass to arrange the operands such that -instcombine can fold this (without breaking some other pattern)?
Ressociate does that and in fact a simpler case works. The problem is with a more complex case where other subexpression is used elsewhere. For example if (~a & b) is used. In that case reassociate does not do it because it is not beneficial, and it only becomes beneficial when we consider a bigger pattern.
In fact the original motivating case has all possible subexpression permutations in its 255 logical functions, which then lead to mutlti-use cases.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D116231/new/
https://reviews.llvm.org/D116231
More information about the llvm-commits
mailing list