Changes in directory llvm/lib/Transforms/Scalar:
PredicateSimplifier.cpp updated: 1.59 -> 1.60 --- Log message: Clean up this code and fix subtract miscompile. --- Diffs of the changes: (+22 -18) PredicateSimplifier.cpp | 40 ++++++++++++++++++++++------------------ 1 files changed, 22 insertions(+), 18 deletions(-) Index: llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp diff -u llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.59 llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.60 --- llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.59 Sat Mar 17 20:09:32 2007 +++ llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp Sun Mar 18 17:58:46 2007 @@ -1543,13 +1543,26 @@ // "%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 @@ 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 @@ 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 @@ // 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 @@ 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: _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits