[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