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

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 21 01:00:16 PDT 2021


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


More information about the llvm-commits mailing list