[PATCH] D126617: [InstCombine] Optimize shl+lshr+and conversion pattern

chenglin.bi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 31 20:38:41 PDT 2022


bcl5980 added a comment.

In D126617#3547933 <https://reviews.llvm.org/D126617#3547933>, @spatel wrote:

> In D126617#3547436 <https://reviews.llvm.org/D126617#3547436>, @bcl5980 wrote:
>
>> In D126617#3547120 <https://reviews.llvm.org/D126617#3547120>, @spatel wrote:
>>
>>> I still think we should split this patch up as 2 independent transforms.
>>>
>>> The opposite shifts transform doesn't seem like it should be a power-of-2-mask transform. Can we handle that using demanded bits instead? Double-check (you can pre-commit more tests as needed), but I don't think this patch will handle these related folds:
>>> https://alive2.llvm.org/ce/z/SNmj5M
>>
>> Thanks for the mention. Is this transform you want ?
>> https://alive2.llvm.org/ce/z/-C8L9U
>> If yes, I will send a new patch to do this.
>
> Yes, the first pre-condition looks correct. We don't actually care what the final instruction in the sequence is - it just has to remove demand of the high bits. The last instruction could be a trunc for example, so we should have tests with that too:
> https://alive2.llvm.org/ce/z/ZCgqj5
>
> We already look for that pattern in InstCombine's demanded bits. So I think we just need to add a transform like this:
>
>   diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>   index 278db05f65d1..c0d92fc27bb6 100644
>   --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>   +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>   @@ -630,6 +630,18 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
>                ComputeNumSignBits(I->getOperand(0), Depth + 1, CxtI);
>            if (SignBits >= NumHiDemandedBits)
>              return I->getOperand(0);
>   +
>   +        // If we can pre-shift a left-shifted constant to the right without
>   +        // losing any low bits (we already know we don't demand the high bits):
>   +        // (C << X) >> SA --> (C >> SA) << X
>   +        Value *X;
>   +        const APInt *C;
>   +        if (match(I->getOperand(0), m_Shl(m_APInt(C), m_Value(X))) &&
>   +            C->countTrailingZeros() >= ShiftAmt) {
>   +          Constant *ShiftC = ConstantInt::get(I->getType(), C->lshr(ShiftAmt));
>   +          Instruction *Shl = BinaryOperator::CreateShl(ShiftC, X);
>   +          return InsertNewInstWith(Shl, *I);
>   +        }
>          }
>    
>          // Unsigned shift right.

Wow, that's cool. A very general solution.


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

https://reviews.llvm.org/D126617



More information about the llvm-commits mailing list