From b5e7463711b705e4c2a549327131af8fb50d4bd9 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 25 Sep 2017 21:15:00 +0000 Subject: [PATCH] [InstCombine] Move an optimization from foldICmpAndConstConst to foldICmpUsingKnownBits All this optimization cares about is knowing how many low bits of LHS is known to be zero and whether that means that the result is 0 or greater than the RHS constant. It doesn't matter where the zeros in the low bits came from. So we don't need to specifically look for an AND. Instead we can use known bits. Differential Revision: https://reviews.llvm.org/D38195 llvm-svn: 314153 --- .../InstCombine/InstCombineCompares.cpp | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index f38618e85e8..0c434a54cbe 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1714,22 +1714,6 @@ Instruction *InstCombiner::foldICmpAndConstConst(ICmpInst &Cmp, } } - // (X & C2) > C1 --> (X & C2) != 0, if any bit set in (X & C2) will produce a - // result greater than C1. Also handle (X & C2) < C1 --> (X & C2) == 0. - if (!C2->isNullValue()) { - unsigned NumTZ = C2->countTrailingZeros(); - if (Cmp.getPredicate() == ICmpInst::ICMP_UGT && - NumTZ >= C1->getActiveBits()) { - Constant *Zero = Constant::getNullValue(And->getType()); - return new ICmpInst(ICmpInst::ICMP_NE, And, Zero); - } - if (Cmp.getPredicate() == ICmpInst::ICMP_ULT && - NumTZ >= C1->ceilLogBase2()) { - Constant *Zero = Constant::getNullValue(And->getType()); - return new ICmpInst(ICmpInst::ICMP_EQ, And, Zero); - } - } - return nullptr; } @@ -4221,6 +4205,11 @@ Instruction *InstCombiner::foldICmpUsingKnownBits(ICmpInst &I) { if (Op1Min == Op0Min + 1) return new ICmpInst(ICmpInst::ICMP_EQ, Op0, ConstantInt::get(Op0->getType(), Op1Min - 1)); + // X X == 0, if the number of zero bits in the bottom of X + // exceeds the log2 of C. + if (Op0Known.countMinTrailingZeros() >= Op1Min.ceilLogBase2()) + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, + Constant::getNullValue(Op1->getType())); } break; } @@ -4237,6 +4226,11 @@ Instruction *InstCombiner::foldICmpUsingKnownBits(ICmpInst &I) { if (Op1Min == Op0Max - 1) return new ICmpInst(ICmpInst::ICMP_EQ, Op0, ConstantInt::get(Op1->getType(), Op1Min + 1)); + // X >u C --> X != 0, if the number of zero bits in the bottom of X + // exceeds the log2 of C. + if (Op0Known.countMinTrailingZeros() >= Op1Min.getActiveBits()) + return new ICmpInst(ICmpInst::ICMP_NE, Op0, + Constant::getNullValue(Op1->getType())); } break; }