[llvm] r277738 - [InstCombine] use m_APInt to allow icmp eq (op X, Y), C folds for splat constant vectors
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 4 11:01:41 PDT 2016
I mis-titled this commit. The enhancement for vectors is in *InstSimplify*
not InstCombine, so this should have been:
[InstSimplify] use m_APInt to allow icmp eq (op X, Y), C folds for splat
constant vectors
On Thu, Aug 4, 2016 at 11:48 AM, Sanjay Patel via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: spatel
> Date: Thu Aug 4 12:48:04 2016
> New Revision: 277738
>
> URL: http://llvm.org/viewvc/llvm-project?rev=277738&view=rev
> Log:
> [InstCombine] use m_APInt to allow icmp eq (op X, Y), C folds for splat
> constant vectors
>
> I'm removing a misplaced pair of more specific folds from InstCombine in
> this patch as well,
> so we know where those folds are happening in InstSimplify.
>
>
> Modified:
> llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> llvm/trunk/test/Transforms/InstSimplify/compare.ll
>
> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Analysis/InstructionSimplify.cpp?rev=277738&r1=277737&r2=277738&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Aug 4 12:48:04
> 2016
> @@ -3121,17 +3121,16 @@ static Value *SimplifyICmpInst(unsigned
> // If a bit is known to be zero for A and known to be one for B,
> // then A and B cannot be equal.
> if (ICmpInst::isEquality(Pred)) {
> - if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) {
> - uint32_t BitWidth = CI->getBitWidth();
> + const APInt *RHSVal;
> + if (match(RHS, m_APInt(RHSVal))) {
> + unsigned BitWidth = RHSVal->getBitWidth();
> APInt LHSKnownZero(BitWidth, 0);
> APInt LHSKnownOne(BitWidth, 0);
> computeKnownBits(LHS, LHSKnownZero, LHSKnownOne, Q.DL, /*Depth=*/0,
> Q.AC,
> Q.CxtI, Q.DT);
> - const APInt &RHSVal = CI->getValue();
> - if (((LHSKnownZero & RHSVal) != 0) || ((LHSKnownOne & ~RHSVal) !=
> 0))
> - return Pred == ICmpInst::ICMP_EQ
> - ? ConstantInt::getFalse(CI->getContext())
> - : ConstantInt::getTrue(CI->getContext());
> + if (((LHSKnownZero & *RHSVal) != 0) || ((LHSKnownOne & ~(*RHSVal))
> != 0))
> + return Pred == ICmpInst::ICMP_EQ ? ConstantInt::getFalse(ITy)
> + : ConstantInt::getTrue(ITy);
> }
> }
>
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Transforms/InstCombine/InstCombineCompares.cpp?rev=
> 277738&r1=277737&r2=277738&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Thu
> Aug 4 12:48:04 2016
> @@ -2277,14 +2277,8 @@ Instruction *InstCombiner::foldICmpEqual
> }
> break;
> case Instruction::Or:
> - // If bits are being or'd in that are not present in the constant we
> - // are comparing against, then the comparison could never succeed!
> // FIXME: Vectors are excluded by ConstantInt.
> if (ConstantInt *BOC = dyn_cast<ConstantInt>(BOp1)) {
> - Constant *NotCI = ConstantExpr::getNot(RHS);
> - if (!ConstantExpr::getAnd(BOC, NotCI)->isNullValue())
> - return replaceInstUsesWith(ICI, Builder->getInt1(isICMP_NE));
> -
> // Comparing if all bits outside of a constant mask are set?
> // Replace (X | C) == -1 with (X & ~C) == ~C.
> // This removes the -1 constant.
> @@ -2299,11 +2293,6 @@ Instruction *InstCombiner::foldICmpEqual
> case Instruction::And:
> // FIXME: Vectors are excluded by ConstantInt.
> if (ConstantInt *BOC = dyn_cast<ConstantInt>(BOp1)) {
> - // If bits are being compared against that are and'd out, then the
> - // comparison can never succeed!
> - if ((*RHSV & ~BOC->getValue()) != 0)
> - return replaceInstUsesWith(ICI, Builder->getInt1(isICMP_NE));
> -
> // If we have ((X & C) == C), turn it into ((X & C) != 0).
> if (RHS == BOC && RHSV->isPowerOf2())
> return new ICmpInst(isICMP_NE ? ICmpInst::ICMP_EQ :
> ICmpInst::ICMP_NE,
>
> Modified: llvm/trunk/test/Transforms/InstSimplify/compare.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> Transforms/InstSimplify/compare.ll?rev=277738&r1=
> 277737&r2=277738&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/Transforms/InstSimplify/compare.ll (original)
> +++ llvm/trunk/test/Transforms/InstSimplify/compare.ll Thu Aug 4
> 12:48:04 2016
> @@ -1,3 +1,4 @@
> +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
> ; RUN: opt < %s -instsimplify -S | FileCheck %s
> target datalayout = "p:32:32"
>
> @@ -1017,9 +1018,7 @@ define i1 @icmp_eq_const(i32 %a) {
> ; FIXME: Vectors should fold the same way.
> define <2 x i1> @icmp_eq_const_vec(<2 x i32> %a) {
> ; CHECK-LABEL: @icmp_eq_const_vec(
> -; CHECK-NEXT: [[B:%.*]] = mul nsw <2 x i32> %a, <i32 -2, i32 -2>
> -; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i32> [[B]], <i32 1, i32 1>
> -; CHECK-NEXT: ret <2 x i1> [[C]]
> +; CHECK-NEXT: ret <2 x i1> zeroinitializer
> ;
> %b = mul nsw <2 x i32> %a, <i32 -2, i32 -2>
> %c = icmp eq <2 x i32> %b, <i32 1, i32 1>
> @@ -1038,9 +1037,7 @@ define i1 @icmp_ne_const(i32 %a) {
> ; FIXME: Vectors should fold the same way.
> define <2 x i1> @icmp_ne_const_vec(<2 x i32> %a) {
> ; CHECK-LABEL: @icmp_ne_const_vec(
> -; CHECK-NEXT: [[B:%.*]] = mul nsw <2 x i32> %a, <i32 -2, i32 -2>
> -; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i32> [[B]], <i32 1, i32 1>
> -; CHECK-NEXT: ret <2 x i1> [[C]]
> +; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
> ;
> %b = mul nsw <2 x i32> %a, <i32 -2, i32 -2>
> %c = icmp ne <2 x i32> %b, <i32 1, i32 1>
>
>
> _______________________________________________
> 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/20160804/4ca38eb9/attachment.html>
More information about the llvm-commits
mailing list