Reenable the transform, turning X/-10 < 1 into X > -10
authorChris Lattner <sabre@nondot.org>
Mon, 11 Oct 2004 19:40:04 +0000 (19:40 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 11 Oct 2004 19:40:04 +0000 (19:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16918 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index f663ae6137f3a2063e2c7180a0a0bd77a3b8ba54..763ffe1d0199cf0d6c8d1ab5d54ddaa1f017d459 100644 (file)
@@ -2116,6 +2116,8 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
           ConstantInt *Prod;
           bool ProdOV = MulWithOverflow(Prod, CI, DivRHS);
 
+          Instruction::BinaryOps Opcode = I.getOpcode();
+
           if (DivRHS->isNullValue()) {  // Don't hack on divide by zeros.
           } else if (LHSI->getType()->isUnsigned()) {  // udiv
             LoBound = Prod;
@@ -2152,15 +2154,13 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
               HiBound = cast<ConstantInt>(ConstantExpr::getSub(Prod, DivRHS));
             }
 
-            /// FIXME: This code is disabled, because we do not compile the
-            /// divisor case < 0 correctly.  For example, this code is incorrect
-            /// in the case of "X/-10 < 1".
-            LoBound = 0;
+            // Dividing by a negate swaps the condition.
+            Opcode = SetCondInst::getSwappedCondition(Opcode);
           }
 
           if (LoBound) {
             Value *X = LHSI->getOperand(0);
-            switch (I.getOpcode()) {
+            switch (Opcode) {
             default: assert(0 && "Unhandled setcc opcode!");
             case Instruction::SetEQ:
               if (LoOverflow && HiOverflow)