return false;
if (IsSigned) {
+ // (X srem Y) sdiv Y --> 0
+ if (match(X, m_SRem(m_Value(), m_Specific(Y))))
+ return true;
+
// |X| / |Y| --> 0
//
// We require that 1 operand is a simple constant. That could be extended to
bool IsSigned = Opcode == Instruction::SDiv;
- // (X rem Y) / Y -> 0
- if ((IsSigned && match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) ||
- (!IsSigned && match(Op0, m_URem(m_Value(), m_Specific(Op1)))))
- return Constant::getNullValue(Op0->getType());
-
// (X /u C1) /u C2 -> 0 if C1 * C2 overflow
ConstantInt *C1, *C2;
if (!IsSigned && match(Op0, m_UDiv(m_Value(), m_ConstantInt(C1))) &&
if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q, MaxRecurse))
return V;
- // (X % Y) % Y -> X % Y
- if ((Opcode == Instruction::SRem &&
- match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) ||
- (Opcode == Instruction::URem &&
- match(Op0, m_URem(m_Value(), m_Specific(Op1)))))
- return Op0;
-
// (X << Y) % X -> 0
if (Q.IIQ.UseInstrInfo &&
((Opcode == Instruction::SRem &&