From 2a51ea0c0e6a70a79f9e2bb0bc319a78fdf1afb6 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sun, 18 Mar 2007 22:58:46 +0000 Subject: [PATCH] Clean up this code and fix subtract miscompile. llvm-svn: 35146 --- lib/Transforms/Scalar/PredicateSimplifier.cpp | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index f6d8878265f..072110642e8 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -1543,13 +1543,26 @@ namespace { // "%x = mul i32 %y, 0" then %x EQ 0 Instruction::BinaryOps Opcode = BO->getOpcode(); + const Type *Ty = BO->getType(); + assert(!Ty->isFPOrFPVector() && "Float in work queue!"); + + Constant *Zero = Constant::getNullValue(Ty); + Constant *AllOnes = ConstantInt::getAllOnesValue(Ty); switch (Opcode) { default: break; case Instruction::Sub: + if (Op1 == Zero) { + add(BO, Op0, ICmpInst::ICMP_EQ, NewContext); + return; + } + break; + case Instruction::Or: + if (Op0 == AllOnes || Op1 == AllOnes) { + add(BO, AllOnes, ICmpInst::ICMP_EQ, NewContext); + return; + } // fall-through case Instruction::Add: - case Instruction::Or: { - Constant *Zero = Constant::getNullValue(BO->getType()); if (Op0 == Zero) { add(BO, Op1, ICmpInst::ICMP_EQ, NewContext); return; @@ -1557,9 +1570,8 @@ namespace { add(BO, Op0, ICmpInst::ICMP_EQ, NewContext); return; } - } break; - case Instruction::And: { - Constant *AllOnes = ConstantInt::getAllOnesValue(BO->getType()); + break; + case Instruction::And: if (Op0 == AllOnes) { add(BO, Op1, ICmpInst::ICMP_EQ, NewContext); return; @@ -1567,17 +1579,13 @@ namespace { add(BO, Op0, ICmpInst::ICMP_EQ, NewContext); return; } - } break; - case Instruction::Mul: { - Constant *Zero = Constant::getNullValue(BO->getType()); - if (Op0 == Zero) { - add(BO, Zero, ICmpInst::ICMP_EQ, NewContext); - return; - } else if (Op1 == Zero) { + // fall-through + case Instruction::Mul: + if (Op0 == Zero || Op1 == Zero) { add(BO, Zero, ICmpInst::ICMP_EQ, NewContext); return; } - } break; + break; } // "%x = add i32 %y, %z" and %x EQ %y then %z EQ 0 @@ -1585,9 +1593,6 @@ namespace { // 1. Repeat all of the above, with order of operands reversed. // "%x = udiv i32 %y, %z" and %x EQ %y then %z EQ 1 - const Type *Ty = BO->getType(); - assert(!Ty->isFPOrFPVector() && "Float in work queue!"); - Value *Known = Op0, *Unknown = Op1; if (Known != BO) std::swap(Known, Unknown); if (Known == BO) { @@ -1596,8 +1601,7 @@ namespace { case Instruction::Xor: case Instruction::Add: case Instruction::Sub: - add(Unknown, Constant::getNullValue(Ty), ICmpInst::ICMP_EQ, - NewContext); + add(Unknown, Zero, ICmpInst::ICMP_EQ, NewContext); break; case Instruction::UDiv: case Instruction::SDiv: