[llvm-commits] [SignlessTypes] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

Reid Spencer reid at x10sys.com
Thu Oct 19 21:27:45 PDT 2006



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.520.2.2 -> 1.520.2.3
---
Log message:

Initial patch for DIV -> SDIV/UDIV


---
Diffs of the changes:  (+13 -10)

 InstructionCombining.cpp |   23 +++++++++++++----------
 1 files changed, 13 insertions(+), 10 deletions(-)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.520.2.2 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.520.2.3
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.520.2.2	Thu Oct 19 19:34:44 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Thu Oct 19 23:27:17 2006
@@ -1975,11 +1975,11 @@
       }
 
       // 0 - (X sdiv C)  -> (X sdiv -C)
-      if (Op1I->getOpcode() == Instruction::Div)
+      if (Op1I->getOpcode() == Instruction::SDiv)
         if (ConstantInt *CSI = dyn_cast<ConstantInt>(Op0))
-          if (CSI->getType()->isSigned() && CSI->isNullValue())
+          if (CSI->isNullValue())
             if (Constant *DivRHS = dyn_cast<Constant>(Op1I->getOperand(1)))
-              return BinaryOperator::createDiv(Op1I->getOperand(0),
+              return BinaryOperator::createSDiv(Op1I->getOperand(0),
                                                ConstantExpr::getNeg(DivRHS));
 
       // X - X*C --> X * (1-C)
@@ -2174,11 +2174,13 @@
       return BinaryOperator::createNeg(Op0);
 
     if (Instruction *LHS = dyn_cast<Instruction>(Op0))
-      if (LHS->getOpcode() == Instruction::Div)
+      if (LHS->getOpcode() == Instruction::SDiv || 
+          LHS->getOpcode()==Instruction::UDiv)
         if (ConstantInt *LHSRHS = dyn_cast<ConstantInt>(LHS->getOperand(1))) {
           // (X / C1) / C2  -> X / (C1*C2)
-          return BinaryOperator::createDiv(LHS->getOperand(0),
-                                           ConstantExpr::getMul(RHS, LHSRHS));
+          return BinaryOperator::create(
+            Instruction::BinaryOps(LHS->getOpcode()), LHS->getOperand(0),
+                                           ConstantExpr::getMul(RHS, LHSRHS),"");
         }
 
     // Check to see if this is an unsigned division with an exact power of 2,
@@ -2195,7 +2197,7 @@
     // -X/C -> X/-C
     if (RHS->getType()->isSigned())
       if (Value *LHSNeg = dyn_castNegVal(Op0))
-        return BinaryOperator::createDiv(LHSNeg, ConstantExpr::getNeg(RHS));
+        return BinaryOperator::createSDiv(LHSNeg, ConstantExpr::getNeg(RHS));
 
     if (!RHS->isNullValue()) {
       if (SelectInst *SI = dyn_cast<SelectInst>(Op0))
@@ -2279,7 +2281,7 @@
         RHS = ConstantExpr::getCast(R, NTy);
       else
         RHS = InsertNewInstBefore(new CastInst(Op1, NTy, Op1->getName()), I);
-      Instruction *Div = BinaryOperator::createDiv(LHS, RHS, I.getName());
+      Instruction *Div = BinaryOperator::createUDiv(LHS, RHS, I.getName());
       InsertNewInstBefore(Div, I);
       return new CastInst(Div, I.getType());
     }      
@@ -3722,7 +3724,7 @@
 static bool MulWithOverflow(ConstantInt *&Result, ConstantInt *In1,
                             ConstantInt *In2) {
   Result = cast<ConstantInt>(ConstantExpr::getMul(In1, In2));
-  return !In2->isNullValue() && ConstantExpr::getDiv(Result, In2) != In1;
+  return !In2->isNullValue() && ConstantExpr::getUDiv(Result, In2) != In1;
 }
 
 static bool isPositive(ConstantInt *C) {
@@ -4379,7 +4381,8 @@
         }
         break;
 
-      case Instruction::Div:
+      case Instruction::SDiv:
+      case Instruction::UDiv:
         // Fold: (div X, C1) op C2 -> range check
         if (ConstantInt *DivRHS = dyn_cast<ConstantInt>(LHSI->getOperand(1))) {
           // Fold this div into the comparison, producing a range check.






More information about the llvm-commits mailing list