From b435a4214e5920e56dd2e9fb5fb29bb2d4e98fab Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 17 Sep 2014 04:16:35 +0000 Subject: InstSimplify: Don't allow (x srem y) urem y -> x srem y Let's consider the case where: %x i16 = 32768 %y i16 = 384 %x srem %y = 65408 (%x srem %y) urem %y = 128 llvm-svn: 217939 --- llvm/lib/Analysis/InstructionSimplify.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'llvm/lib') diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 039d8286ecb..f2f67067d15 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1171,10 +1171,12 @@ static Value *SimplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, if (Op0 == Op1) return Constant::getNullValue(Op0->getType()); - // ((X % Y) % Y) -> (X % Y) - if (match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) { + // (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; - } // If the operation is with the result of a select instruction, check whether // operating on either branch of the select always yields the same value. -- cgit v1.2.3