[llvm] r280112 - [InstCombine] clean up foldICmpDivConstant; NFCI

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 30 10:10:50 PDT 2016


Author: spatel
Date: Tue Aug 30 12:10:49 2016
New Revision: 280112

URL: http://llvm.org/viewvc/llvm-project?rev=280112&view=rev
Log:
[InstCombine] clean up foldICmpDivConstant; NFCI

1. Fix comments to match variable names
2. Remove redundant CmpRHS variable
3. Add FIXME to replace some checks with asserts

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=280112&r1=280111&r2=280112&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Tue Aug 30 12:10:49 2016
@@ -1971,55 +1971,59 @@ Instruction *InstCombiner::foldICmpUDivC
 Instruction *InstCombiner::foldICmpDivConstant(ICmpInst &Cmp,
                                                BinaryOperator *Div,
                                                const APInt *C) {
-  // FIXME: This check restricts all folds under here to scalar types.
+  // FIXME: These checks restrict all folds under here to scalar types.
   ConstantInt *RHS = dyn_cast<ConstantInt>(Cmp.getOperand(1));
   if (!RHS)
     return nullptr;
 
-  // Fold: icmp pred ([us]div X, C1), C2 -> range test
+  ConstantInt *DivRHS = dyn_cast<ConstantInt>(Div->getOperand(1));
+  if (!DivRHS)
+    return nullptr;
+  
+  // Fold: icmp pred ([us]div X, C2), C -> range test
   // Fold this div into the comparison, producing a range check.
   // Determine, based on the divide type, what the range is being
   // checked.  If there is an overflow on the low or high side, remember
   // it, otherwise compute the range [low, hi) bounding the new value.
   // See: InsertRangeTest above for the kinds of replacements possible.
-  ConstantInt *DivRHS = dyn_cast<ConstantInt>(Div->getOperand(1));
-  if (!DivRHS)
+  const APInt *C2;
+  if (!match(Div->getOperand(1), m_APInt(C2)))
     return nullptr;
 
-  ConstantInt *CmpRHS = cast<ConstantInt>(Cmp.getOperand(1));
-
   // FIXME: If the operand types don't match the type of the divide
   // then don't attempt this transform. The code below doesn't have the
   // logic to deal with a signed divide and an unsigned compare (and
-  // vice versa). This is because (x /s C1) <s C2  produces different
-  // results than (x /s C1) <u C2 or (x /u C1) <s C2 or even
-  // (x /u C1) <u C2.  Simply casting the operands and result won't
+  // vice versa). This is because (x /s C2) <s C  produces different
+  // results than (x /s C2) <u C or (x /u C2) <s C or even
+  // (x /u C2) <u C.  Simply casting the operands and result won't
   // work. :(  The if statement below tests that condition and bails
   // if it finds it.
   bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
   if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
     return nullptr;
-  if (DivRHS->isZero())
+
+  // FIXME: These 3 checks can be asserts.
+  if (*C2 == 0)
     return nullptr; // The ProdOV computation fails on divide by zero.
-  if (DivIsSigned && DivRHS->isAllOnesValue())
+  if (DivIsSigned && C2->isAllOnesValue())
     return nullptr; // The overflow computation also screws up here
-  if (DivRHS->isOne()) {
+  if (*C2 == 1) {
     // This eliminates some funny cases with INT_MIN.
     Cmp.setOperand(0, Div->getOperand(0));   // X/1 == X.
     return &Cmp;
   }
 
   // Compute Prod = CI * DivRHS. We are essentially solving an equation
-  // of form X/C1=C2. We solve for X by multiplying C1 (DivRHS) and
-  // C2 (CI). By solving for X we can turn this into a range check
+  // of form X/C2=C. We solve for X by multiplying C2 (DivRHS) and
+  // C (CI). By solving for X we can turn this into a range check
   // instead of computing a divide.
-  Constant *Prod = ConstantExpr::getMul(CmpRHS, DivRHS);
+  Constant *Prod = ConstantExpr::getMul(RHS, DivRHS);
 
   // Determine if the product overflows by seeing if the product is
   // not equal to the divide. Make sure we do the same kind of divide
   // as in the LHS instruction that we're folding.
   bool ProdOV = (DivIsSigned ? ConstantExpr::getSDiv(Prod, DivRHS) :
-                 ConstantExpr::getUDiv(Prod, DivRHS)) != CmpRHS;
+                 ConstantExpr::getUDiv(Prod, DivRHS)) != RHS;
 
   // Get the ICmp opcode
   ICmpInst::Predicate Pred = Cmp.getPredicate();




More information about the llvm-commits mailing list