[llvm] de18fa9 - Revert "[InstSimplify] Bypass no-op `and`-mask, using known bits (PR49543)"

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 21 08:08:19 PDT 2021


Roman,

Not sure we have good docs on this, but the balancing act Nikita 
describes is definitely long standing practice.

Philip

On 4/21/21 1:00 AM, Roman Lebedev via llvm-commits wrote:
> Could you please point me to the relevant quotes in the docs about compile time?
>
> On Wed, Apr 21, 2021 at 10:56 AM Nikita Popov via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: Nikita Popov
>> Date: 2021-04-21T09:55:25+02:00
>> New Revision: de18fa9e52a439798edf89df6fee807908814416
>>
>> URL: https://github.com/llvm/llvm-project/commit/de18fa9e52a439798edf89df6fee807908814416
>> DIFF: https://github.com/llvm/llvm-project/commit/de18fa9e52a439798edf89df6fee807908814416.diff
>>
>> LOG: Revert "[InstSimplify] Bypass no-op `and`-mask, using known bits (PR49543)"
>>
>> This reverts commit ea1a0d7c9ae3e5232a4163fc67efad4aabd51f2b.
>>
>> While this is strictly more powerful, it is also strictly slower.
>> InstSimplify intentionally does not perform many folds that it
>> is allowed to perform, if doing so requires a KnownBits calculation
>> that will be repeated in InstCombine.
>>
>> Maybe it's worthwhile to do this here, but that needs a more
>> explicitly stated motivation, evaluated in a review.
>>
>> Added:
>>
>>
>> Modified:
>>      llvm/lib/Analysis/InstructionSimplify.cpp
>>      llvm/test/Transforms/InstSimplify/AndOrXor.ll
>>
>> Removed:
>>
>>
>>
>> ################################################################################
>> diff  --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
>> index 43441184115f..08f504a0ce37 100644
>> --- a/llvm/lib/Analysis/InstructionSimplify.cpp
>> +++ b/llvm/lib/Analysis/InstructionSimplify.cpp
>> @@ -2081,12 +2081,21 @@ static Value *SimplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
>>     if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::And))
>>       return V;
>>
>> -  // A mask that only clears known zeros of a value is a no-op.
>> +  // A mask that only clears known zeros of a shifted value is a no-op.
>>     Value *X;
>>     const APInt *Mask;
>> +  const APInt *ShAmt;
>>     if (match(Op1, m_APInt(Mask))) {
>> -    KnownBits Known = computeKnownBits(Op0, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
>> -    if ((~*Mask).isSubsetOf(Known.Zero))
>> +    // If all bits in the inverted and shifted mask are clear:
>> +    // and (shl X, ShAmt), Mask --> shl X, ShAmt
>> +    if (match(Op0, m_Shl(m_Value(X), m_APInt(ShAmt))) &&
>> +        (~(*Mask)).lshr(*ShAmt).isNullValue())
>> +      return Op0;
>> +
>> +    // If all bits in the inverted and shifted mask are clear:
>> +    // and (lshr X, ShAmt), Mask --> lshr X, ShAmt
>> +    if (match(Op0, m_LShr(m_Value(X), m_APInt(ShAmt))) &&
>> +        (~(*Mask)).shl(*ShAmt).isNullValue())
>>         return Op0;
>>     }
>>
>> @@ -2171,7 +2180,6 @@ static Value *SimplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
>>     // SimplifyDemandedBits in InstCombine can optimize the general case.
>>     // This pattern aims to help other passes for a common case.
>>     Value *Y, *XShifted;
>> -  const APInt *ShAmt;
>>     if (match(Op1, m_APInt(Mask)) &&
>>         match(Op0, m_c_Or(m_CombineAnd(m_NUWShl(m_Value(X), m_APInt(ShAmt)),
>>                                        m_Value(XShifted)),
>>
>> diff  --git a/llvm/test/Transforms/InstSimplify/AndOrXor.ll b/llvm/test/Transforms/InstSimplify/AndOrXor.ll
>> index 09f6faf3928c..ee94d2f7720e 100644
>> --- a/llvm/test/Transforms/InstSimplify/AndOrXor.ll
>> +++ b/llvm/test/Transforms/InstSimplify/AndOrXor.ll
>> @@ -1192,7 +1192,8 @@ define i8 @noop_and_t0(i8 %x) {
>>   ; CHECK-LABEL: @noop_and_t0(
>>   ; CHECK-NEXT:    [[A:%.*]] = shl i8 [[X:%.*]], 3
>>   ; CHECK-NEXT:    [[B:%.*]] = lshr i8 [[A]], 2
>> -; CHECK-NEXT:    ret i8 [[B]]
>> +; CHECK-NEXT:    [[R:%.*]] = and i8 [[B]], 62
>> +; CHECK-NEXT:    ret i8 [[R]]
>>   ;
>>     %a = shl i8 %x, 3
>>     %b = lshr i8 %a, 2
>> @@ -1203,7 +1204,8 @@ define i8 @noop_and_t1(i8 %x) {
>>   ; CHECK-LABEL: @noop_and_t1(
>>   ; CHECK-NEXT:    [[A:%.*]] = shl i8 [[X:%.*]], 3
>>   ; CHECK-NEXT:    [[B:%.*]] = lshr i8 [[A]], 2
>> -; CHECK-NEXT:    ret i8 [[B]]
>> +; CHECK-NEXT:    [[R:%.*]] = and i8 [[B]], 126
>> +; CHECK-NEXT:    ret i8 [[R]]
>>   ;
>>     %a = shl i8 %x, 3
>>     %b = lshr i8 %a, 2
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list