From 6a9fdfaec8b1a88c32dfbac70207e1e1de689f81 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 11 Oct 2004 19:40:04 +0000 Subject: Reenable the transform, turning X/-10 < 1 into X > -10 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16918 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index f663ae6..763ffe1 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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(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) -- cgit v1.1