<div dir="ltr">Forgot to 'git add' the moved files when I reapplied the patch for commit. Fixed in r310870.</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Mon, Aug 14, 2017 at 11:49 AM, Craig Topper via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ctopper<br>
Date: Mon Aug 14 11:49:42 2017<br>
New Revision: 310869<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=310869&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=310869&view=rev</a><br>
Log:<br>
[InstSimplify][InstCombine] Modify the interface of decomposeBitTestICmp and use it in the InstSimplify<br>
<br>
This addresses a fixme in InstSimplify about using decomposeBitTest. This also fixes InstSimplify to handle ugt and ult compares too.<br>
<br>
I've modified the interface a little to return only the APInt version of the mask that InstSimplify needs. InstCombine now has a small wrapper routine to create a Constant out of it. I've also dropped the returning of 0 since InstSimplify doesn't need that. So InstCombine creates a zero constant itself.<br>
<br>
I also had to make decomposeBitTest support vectors since InstSimplify needs that.<br>
<br>
As InstSimplify can't use something from the Transforms library, I've moved the CmpInstAnalysis code to the Analysis library.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D36593" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D36593</a><br>
<br>
Removed:<br>
    llvm/trunk/include/llvm/<wbr>Transforms/Utils/<wbr>CmpInstAnalysis.h<br>
    llvm/trunk/lib/Transforms/<wbr>Utils/CmpInstAnalysis.cpp<br>
Modified:<br>
    llvm/trunk/lib/Analysis/<wbr>CMakeLists.txt<br>
    llvm/trunk/lib/Analysis/<wbr>InstructionSimplify.cpp<br>
    llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp<br>
    llvm/trunk/lib/Transforms/<wbr>Utils/CMakeLists.txt<br>
    llvm/trunk/test/Transforms/<wbr>InstSimplify/select.ll<br>
<br>
Removed: llvm/trunk/include/llvm/<wbr>Transforms/Utils/<wbr>CmpInstAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/CmpInstAnalysis.h?rev=310868&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Transforms/Utils/<wbr>CmpInstAnalysis.h?rev=310868&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Transforms/Utils/<wbr>CmpInstAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Transforms/Utils/<wbr>CmpInstAnalysis.h (removed)<br>
@@ -1,70 +0,0 @@<br>
-//===-- CmpInstAnalysis.h - Utils to help fold compare insts ----*- C++ -*-===//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-//<br>
-// This file holds routines to help analyse compare instructions<br>
-// and fold them into constants or other compare instructions<br>
-//<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-<br>
-#ifndef LLVM_TRANSFORMS_UTILS_<wbr>CMPINSTANALYSIS_H<br>
-#define LLVM_TRANSFORMS_UTILS_<wbr>CMPINSTANALYSIS_H<br>
-<br>
-#include "llvm/IR/InstrTypes.h"<br>
-<br>
-namespace llvm {<br>
-  class ICmpInst;<br>
-  class Value;<br>
-<br>
-  /// Encode a icmp predicate into a three bit mask. These bits are carefully<br>
-  /// arranged to allow folding of expressions such as:<br>
-  ///<br>
-  ///      (A < B) | (A > B) --> (A != B)<br>
-  ///<br>
-  /// Note that this is only valid if the first and second predicates have the<br>
-  /// same sign. It is illegal to do: (A u< B) | (A s> B)<br>
-  ///<br>
-  /// Three bits are used to represent the condition, as follows:<br>
-  ///   0  A > B<br>
-  ///   1  A == B<br>
-  ///   2  A < B<br>
-  ///<br>
-  /// <=>  Value  Definition<br>
-  /// 000     0   Always false<br>
-  /// 001     1   A >  B<br>
-  /// 010     2   A == B<br>
-  /// 011     3   A >= B<br>
-  /// 100     4   A <  B<br>
-  /// 101     5   A != B<br>
-  /// 110     6   A <= B<br>
-  /// 111     7   Always true<br>
-  ///<br>
-  unsigned getICmpCode(const ICmpInst *ICI, bool InvertPred = false);<br>
-<br>
-  /// This is the complement of getICmpCode, which turns an opcode and two<br>
-  /// operands into either a constant true or false, or the predicate for a new<br>
-  /// ICmp instruction. The sign is passed in to determine which kind of<br>
-  /// predicate to use in the new icmp instruction.<br>
-  /// Non-NULL return value will be a true or false constant.<br>
-  /// NULL return means a new ICmp is needed. The predicate for which is output<br>
-  /// in NewICmpPred.<br>
-  Value *getICmpValue(bool Sign, unsigned Code, Value *LHS, Value *RHS,<br>
-                      CmpInst::Predicate &NewICmpPred);<br>
-<br>
-  /// Return true if both predicates match sign or if at least one of them is an<br>
-  /// equality comparison (which is signless).<br>
-  bool PredicatesFoldable(CmpInst::<wbr>Predicate p1, CmpInst::Predicate p2);<br>
-<br>
-  /// Decompose an icmp into the form ((X & Y) pred Z) if possible. The returned<br>
-  /// predicate is either == or !=. Returns false if decomposition fails.<br>
-  bool decomposeBitTestICmp(const ICmpInst *I, CmpInst::Predicate &Pred,<br>
-                            Value *&X, Value *&Y, Value *&Z);<br>
-<br>
-} // end namespace llvm<br>
-<br>
-#endif<br>
<br>
Modified: llvm/trunk/lib/Analysis/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CMakeLists.txt?rev=310869&r1=310868&r2=310869&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/CMakeLists.txt?rev=<wbr>310869&r1=310868&r2=310869&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Analysis/<wbr>CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/Analysis/<wbr>CMakeLists.txt Mon Aug 14 11:49:42 2017<br>
@@ -18,6 +18,7 @@ add_llvm_library(LLVMAnalysis<br>
   CallGraphSCCPass.cpp<br>
   CallPrinter.cpp<br>
   CaptureTracking.cpp<br>
+  CmpInstAnalysis.cpp<br>
   CostModel.cpp<br>
   CodeMetrics.cpp<br>
   ConstantFolding.cpp<br>
<br>
Modified: llvm/trunk/lib/Analysis/<wbr>InstructionSimplify.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=310869&r1=310868&r2=310869&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/InstructionSimplify.<wbr>cpp?rev=310869&r1=310868&r2=<wbr>310869&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Analysis/<wbr>InstructionSimplify.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/<wbr>InstructionSimplify.cpp Mon Aug 14 11:49:42 2017<br>
@@ -23,6 +23,7 @@<br>
 #include "llvm/Analysis/AliasAnalysis.<wbr>h"<br>
 #include "llvm/Analysis/<wbr>AssumptionCache.h"<br>
 #include "llvm/Analysis/<wbr>CaptureTracking.h"<br>
+#include "llvm/Analysis/<wbr>CmpInstAnalysis.h"<br>
 #include "llvm/Analysis/<wbr>ConstantFolding.h"<br>
 #include "llvm/Analysis/<wbr>LoopAnalysisManager.h"<br>
 #include "llvm/Analysis/MemoryBuiltins.<wbr>h"<br>
@@ -3620,32 +3621,29 @@ static Value *simplifySelectBitTest(Valu<br>
<br>
 /// An alternative way to test if a bit is set or not uses sgt/slt instead of<br>
 /// eq/ne.<br>
-static Value *simplifySelectWithFakeICmpEq(<wbr>Value *CmpLHS, Value *TrueVal,<br>
-                                           Value *FalseVal,<br>
-                                           bool TrueWhenUnset) {<br>
+static Value *simplifySelectWithFakeICmpEq(<wbr>Value *CmpLHS, Value *CmpRHS,<br>
+                                           ICmpInst::Predicate Pred,<br>
+                                           Value *TrueVal, Value *FalseVal) {<br>
+  Value *X;<br>
+  APInt Mask;<br>
+  if (!decomposeBitTestICmp(CmpLHS, CmpRHS, Pred, X, Mask))<br>
+    return nullptr;<br>
+<br>
   unsigned BitWidth = TrueVal->getType()-><wbr>getScalarSizeInBits();<br>
   if (!BitWidth)<br>
     return nullptr;<br>
<br>
-  APInt MinSignedValue;<br>
-  Value *X;<br>
-  if (match(CmpLHS, m_Trunc(m_Value(X))) && (X == TrueVal || X == FalseVal)) {<br>
+  Value *ExtX;<br>
+  if (match(X, m_Trunc(m_Value(ExtX))) &&<br>
+      (ExtX == TrueVal || ExtX == FalseVal)) {<br>
     // icmp slt (trunc X), 0  <--> icmp ne (and X, C), 0<br>
     // icmp sgt (trunc X), -1 <--> icmp eq (and X, C), 0<br>
-    unsigned DestSize = CmpLHS->getType()-><wbr>getScalarSizeInBits();<br>
-    MinSignedValue = APInt::getSignedMinValue(<wbr>DestSize).zext(BitWidth);<br>
-  } else {<br>
-    // icmp slt X, 0  <--> icmp ne (and X, C), 0<br>
-    // icmp sgt X, -1 <--> icmp eq (and X, C), 0<br>
-    X = CmpLHS;<br>
-    MinSignedValue = APInt::getSignedMinValue(<wbr>BitWidth);<br>
+    X = ExtX;<br>
+    Mask = Mask.zext(BitWidth);<br>
   }<br>
<br>
-  if (Value *V = simplifySelectBitTest(TrueVal, FalseVal, X, &MinSignedValue,<br>
-                                       TrueWhenUnset))<br>
-    return V;<br>
-<br>
-  return nullptr;<br>
+  return simplifySelectBitTest(TrueVal, FalseVal, X, &Mask,<br>
+                               Pred == ICmpInst::ICMP_EQ);<br>
 }<br>
<br>
 /// Try to simplify a select instruction when its condition operand is an<br>
@@ -3658,9 +3656,6 @@ static Value *simplifySelectWithICmpCond<br>
   if (!match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))<br>
     return nullptr;<br>
<br>
-  // FIXME: This code is nearly duplicated in InstCombine. Using/refactoring<br>
-  // decomposeBitTestICmp() might help.<br>
-  // FIXME this should support ICMP_SLE/SGE forms as well<br>
   if (ICmpInst::isEquality(Pred) && match(CmpRHS, m_Zero())) {<br>
     Value *X;<br>
     const APInt *Y;<br>
@@ -3668,18 +3663,13 @@ static Value *simplifySelectWithICmpCond<br>
       if (Value *V = simplifySelectBitTest(TrueVal, FalseVal, X, Y,<br>
                                            Pred == ICmpInst::ICMP_EQ))<br>
         return V;<br>
-  } else if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, m_Zero())) {<br>
-    // Comparing signed-less-than 0 checks if the sign bit is set.<br>
-    if (Value *V = simplifySelectWithFakeICmpEq(<wbr>CmpLHS, TrueVal, FalseVal,<br>
-                                                false))<br>
-      return V;<br>
-  } else if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, m_AllOnes())) {<br>
-    // Comparing signed-greater-than -1 checks if the sign bit is not set.<br>
-    if (Value *V = simplifySelectWithFakeICmpEq(<wbr>CmpLHS, TrueVal, FalseVal,<br>
-                                                true))<br>
-      return V;<br>
   }<br>
<br>
+  // Check for other compares that behave like bit test.<br>
+  if (Value *V = simplifySelectWithFakeICmpEq(<wbr>CmpLHS, CmpRHS, Pred,<br>
+                                              TrueVal, FalseVal))<br>
+    return V;<br>
+<br>
   if (CondVal->hasOneUse()) {<br>
     const APInt *C;<br>
     if (match(CmpRHS, m_APInt(C))) {<br>
<br>
Modified: llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=310869&r1=310868&r2=310869&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/InstCombine/<wbr>InstCombineAndOrXor.cpp?rev=<wbr>310869&r1=310868&r2=310869&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp Mon Aug 14 11:49:42 2017<br>
@@ -12,11 +12,11 @@<br>
 //===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
<br>
 #include "InstCombineInternal.h"<br>
+#include "llvm/Analysis/<wbr>CmpInstAnalysis.h"<br>
 #include "llvm/Analysis/<wbr>InstructionSimplify.h"<br>
 #include "llvm/IR/ConstantRange.h"<br>
 #include "llvm/IR/Intrinsics.h"<br>
 #include "llvm/IR/PatternMatch.h"<br>
-#include "llvm/Transforms/Utils/<wbr>CmpInstAnalysis.h"<br>
 #include "llvm/Transforms/Utils/Local.<wbr>h"<br>
 using namespace llvm;<br>
 using namespace PatternMatch;<br>
@@ -292,6 +292,18 @@ static unsigned conjugateICmpMask(unsign<br>
   return NewMask;<br>
 }<br>
<br>
+// Adapts the external decomposeBitTestICmp for local use.<br>
+static bool decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate &Pred,<br>
+                                 Value *&X, Value *&Y, Value *&Z) {<br>
+  APInt Mask;<br>
+  if (!llvm::decomposeBitTestICmp(<wbr>LHS, RHS, Pred, X, Mask))<br>
+    return false;<br>
+<br>
+  Y = ConstantInt::get(X->getType(), Mask);<br>
+  Z = ConstantInt::get(X->getType(), 0);<br>
+  return true;<br>
+}<br>
+<br>
 /// Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E).<br>
 /// Return the set of pattern classes (from MaskedICmpType) that both LHS and<br>
 /// RHS satisfy.<br>
@@ -316,7 +328,7 @@ static unsigned getMaskedTypeForICmpPair<br>
   Value *L2 = LHS->getOperand(1);<br>
   Value *L11, *L12, *L21, *L22;<br>
   // Check whether the icmp can be decomposed into a bit test.<br>
-  if (decomposeBitTestICmp(LHS, PredL, L11, L12, L2)) {<br>
+  if (decomposeBitTestICmp(L1, L2, PredL, L11, L12, L2)) {<br>
     L21 = L22 = L1 = nullptr;<br>
   } else {<br>
     // Look for ANDs in the LHS icmp.<br>
@@ -347,7 +359,7 @@ static unsigned getMaskedTypeForICmpPair<br>
   Value *R2 = RHS->getOperand(1);<br>
   Value *R11, *R12;<br>
   bool Ok = false;<br>
-  if (decomposeBitTestICmp(RHS, PredR, R11, R12, R2)) {<br>
+  if (decomposeBitTestICmp(R1, R2, PredR, R11, R12, R2)) {<br>
     if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {<br>
       A = R11;<br>
       D = R12;<br>
<br>
Modified: llvm/trunk/lib/Transforms/<wbr>Utils/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CMakeLists.txt?rev=310869&r1=310868&r2=310869&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Utils/CMakeLists.<wbr>txt?rev=310869&r1=310868&r2=<wbr>310869&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>Utils/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>Utils/CMakeLists.txt Mon Aug 14 11:49:42 2017<br>
@@ -7,7 +7,6 @@ add_llvm_library(<wbr>LLVMTransformUtils<br>
   BypassSlowDivision.cpp<br>
   CloneFunction.cpp<br>
   CloneModule.cpp<br>
-  CmpInstAnalysis.cpp<br>
   CodeExtractor.cpp<br>
   CtorUtils.cpp<br>
   DemoteRegToStack.cpp<br>
<br>
Removed: llvm/trunk/lib/Transforms/<wbr>Utils/CmpInstAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CmpInstAnalysis.cpp?rev=310868&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Utils/<wbr>CmpInstAnalysis.cpp?rev=<wbr>310868&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>Utils/CmpInstAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>Utils/CmpInstAnalysis.cpp (removed)<br>
@@ -1,108 +0,0 @@<br>
-//===- CmpInstAnalysis.cpp - Utils to help fold compares ---------------===//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-//<br>
-// This file holds routines to help analyse compare instructions<br>
-// and fold them into constants or other compare instructions<br>
-//<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-<br>
-#include "llvm/Transforms/Utils/<wbr>CmpInstAnalysis.h"<br>
-#include "llvm/IR/Constants.h"<br>
-#include "llvm/IR/Instructions.h"<br>
-<br>
-using namespace llvm;<br>
-<br>
-unsigned llvm::getICmpCode(const ICmpInst *ICI, bool InvertPred) {<br>
-  ICmpInst::Predicate Pred = InvertPred ? ICI->getInversePredicate()<br>
-                                        : ICI->getPredicate();<br>
-  switch (Pred) {<br>
-      // False -> 0<br>
-    case ICmpInst::ICMP_UGT: return 1;  // 001<br>
-    case ICmpInst::ICMP_SGT: return 1;  // 001<br>
-    case ICmpInst::ICMP_EQ:  return 2;  // 010<br>
-    case ICmpInst::ICMP_UGE: return 3;  // 011<br>
-    case ICmpInst::ICMP_SGE: return 3;  // 011<br>
-    case ICmpInst::ICMP_ULT: return 4;  // 100<br>
-    case ICmpInst::ICMP_SLT: return 4;  // 100<br>
-    case ICmpInst::ICMP_NE:  return 5;  // 101<br>
-    case ICmpInst::ICMP_ULE: return 6;  // 110<br>
-    case ICmpInst::ICMP_SLE: return 6;  // 110<br>
-      // True -> 7<br>
-    default:<br>
-      llvm_unreachable("Invalid ICmp predicate!");<br>
-  }<br>
-}<br>
-<br>
-Value *llvm::getICmpValue(bool Sign, unsigned Code, Value *LHS, Value *RHS,<br>
-                          CmpInst::Predicate &NewICmpPred) {<br>
-  switch (Code) {<br>
-    default: llvm_unreachable("Illegal ICmp code!");<br>
-    case 0: // False.<br>
-      return ConstantInt::get(CmpInst::<wbr>makeCmpResultType(LHS-><wbr>getType()), 0);<br>
-    case 1: NewICmpPred = Sign ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; break;<br>
-    case 2: NewICmpPred = ICmpInst::ICMP_EQ; break;<br>
-    case 3: NewICmpPred = Sign ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE; break;<br>
-    case 4: NewICmpPred = Sign ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; break;<br>
-    case 5: NewICmpPred = ICmpInst::ICMP_NE; break;<br>
-    case 6: NewICmpPred = Sign ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE; break;<br>
-    case 7: // True.<br>
-      return ConstantInt::get(CmpInst::<wbr>makeCmpResultType(LHS-><wbr>getType()), 1);<br>
-  }<br>
-  return nullptr;<br>
-}<br>
-<br>
-bool llvm::PredicatesFoldable(<wbr>ICmpInst::Predicate p1, ICmpInst::Predicate p2) {<br>
-  return (CmpInst::isSigned(p1) == CmpInst::isSigned(p2)) ||<br>
-         (CmpInst::isSigned(p1) && ICmpInst::isEquality(p2)) ||<br>
-         (CmpInst::isSigned(p2) && ICmpInst::isEquality(p1));<br>
-}<br>
-<br>
-bool llvm::decomposeBitTestICmp(<wbr>const ICmpInst *I, CmpInst::Predicate &Pred,<br>
-                                Value *&X, Value *&Y, Value *&Z) {<br>
-  ConstantInt *C = dyn_cast<ConstantInt>(I-><wbr>getOperand(1));<br>
-  if (!C)<br>
-    return false;<br>
-<br>
-  switch (I->getPredicate()) {<br>
-  default:<br>
-    return false;<br>
-  case ICmpInst::ICMP_SLT:<br>
-    // X < 0 is equivalent to (X & SignMask) != 0.<br>
-    if (!C->isZero())<br>
-      return false;<br>
-    Y = ConstantInt::get(I-><wbr>getContext(), APInt::getSignMask(C-><wbr>getBitWidth()));<br>
-    Pred = ICmpInst::ICMP_NE;<br>
-    break;<br>
-  case ICmpInst::ICMP_SGT:<br>
-    // X > -1 is equivalent to (X & SignMask) == 0.<br>
-    if (!C->isMinusOne())<br>
-      return false;<br>
-    Y = ConstantInt::get(I-><wbr>getContext(), APInt::getSignMask(C-><wbr>getBitWidth()));<br>
-    Pred = ICmpInst::ICMP_EQ;<br>
-    break;<br>
-  case ICmpInst::ICMP_ULT:<br>
-    // X <u 2^n is equivalent to (X & ~(2^n-1)) == 0.<br>
-    if (!C->getValue().isPowerOf2())<br>
-      return false;<br>
-    Y = ConstantInt::get(I-><wbr>getContext(), -C->getValue());<br>
-    Pred = ICmpInst::ICMP_EQ;<br>
-    break;<br>
-  case ICmpInst::ICMP_UGT:<br>
-    // X >u 2^n-1 is equivalent to (X & ~(2^n-1)) != 0.<br>
-    if (!(C->getValue() + 1).isPowerOf2())<br>
-      return false;<br>
-    Y = ConstantInt::get(I-><wbr>getContext(), ~C->getValue());<br>
-    Pred = ICmpInst::ICMP_NE;<br>
-    break;<br>
-  }<br>
-<br>
-  X = I->getOperand(0);<br>
-  Z = ConstantInt::getNullValue(C-><wbr>getType());<br>
-  return true;<br>
-}<br>
<br>
Modified: llvm/trunk/test/Transforms/<wbr>InstSimplify/select.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/select.ll?rev=310869&r1=310868&r2=310869&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/InstSimplify/<wbr>select.ll?rev=310869&r1=<wbr>310868&r2=310869&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/<wbr>InstSimplify/select.ll (original)<br>
+++ llvm/trunk/test/Transforms/<wbr>InstSimplify/select.ll Mon Aug 14 11:49:42 2017<br>
@@ -160,13 +160,10 @@ define <2 x i8> @test11vec(<2 x i8> %X)<br>
   ret <2 x i8> %sel<br>
 }<br>
<br>
-; TODO: we should be able to simplify this<br>
 define i32 @test12(i32 %X) {<br>
 ; CHECK-LABEL: @test12(<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 4<br>
-; CHECK-NEXT:    [[AND:%.*]] = and i32 [[X]], 3<br>
-; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i32 [[X]], i32 [[AND]]<br>
-; CHECK-NEXT:    ret i32 [[COND]]<br>
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[X:%.*]], 3<br>
+; CHECK-NEXT:    ret i32 [[AND]]<br>
 ;<br>
   %cmp = icmp ult i32 %X, 4<br>
   %and = and i32 %X, 3<br>
@@ -189,13 +186,10 @@ define i32 @test12noncanon(i32 %X) {<br>
   ret i32 %cond<br>
 }<br>
<br>
-; TODO: we should be able to simplify this<br>
 define i32 @test13(i32 %X) {<br>
 ; CHECK-LABEL: @test13(<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], 3<br>
-; CHECK-NEXT:    [[AND:%.*]] = and i32 [[X]], 3<br>
-; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i32 [[AND]], i32 [[X]]<br>
-; CHECK-NEXT:    ret i32 [[COND]]<br>
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[X:%.*]], 3<br>
+; CHECK-NEXT:    ret i32 [[AND]]<br>
 ;<br>
   %cmp = icmp ugt i32 %X, 3<br>
   %and = and i32 %X, 3<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>