[llvm] r248073 - [InstCombine] FoldICmpCstShrCst didn't handle icmps of -1 in the ashr case correctly

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 18 17:52:22 PDT 2015


This should have been squashed with r248074, the test for this change is
there.

On Fri, Sep 18, 2015 at 5:48 PM, David Majnemer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: majnemer
> Date: Fri Sep 18 19:48:26 2015
> New Revision: 248073
>
> URL: http://llvm.org/viewvc/llvm-project?rev=248073&view=rev
> Log:
> [InstCombine] FoldICmpCstShrCst didn't handle icmps of -1 in the ashr case
> correctly
>
> Modified:
>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=248073&r1=248072&r2=248073&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Fri Sep
> 18 19:48:26 2015
> @@ -1074,18 +1074,22 @@ Instruction *InstCombiner::FoldICmpCstSh
>    if (AP1 == AP2)
>      return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
>
> -  // Get the distance between the highest bit that's set.
>    int Shift;
> -  // Both the constants are negative, take their positive to calculate
> log.
>    if (IsAShr && AP1.isNegative())
> -    // Get the ones' complement of AP2 and AP1 when computing the
> distance.
> -    Shift = (~AP2).logBase2() - (~AP1).logBase2();
> +    Shift = AP1.countLeadingOnes() - AP2.countLeadingOnes();
>    else
> -    Shift = AP2.logBase2() - AP1.logBase2();
> +    Shift = AP1.countLeadingZeros() - AP2.countLeadingZeros();
>
>    if (Shift > 0) {
> -    if (IsAShr ? AP1 == AP2.ashr(Shift) : AP1 == AP2.lshr(Shift))
> +    if (IsAShr && AP1 == AP2.ashr(Shift)) {
> +      // There are multiple solutions if we are comparing against -1 and
> the LHS
> +      // of the ashr is not a power of two..
> +      if (AP1.isAllOnesValue() && !AP2.isPowerOf2())
> +        return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(),
> Shift));
>        return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
> +    } else if (AP1 == AP2.lshr(Shift)) {
> +      return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
> +    }
>    }
>    // Shifting const2 will never be equal to const1.
>    return getConstant(false);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150918/803b464d/attachment.html>


More information about the llvm-commits mailing list