diff options
Diffstat (limited to 'lib/Analysis/InstructionSimplify.cpp')
| -rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index b4686a1ff175..8da2f0981d0c 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -1106,6 +1106,16 @@ static Value *SimplifyUDivInst(Value *Op0, Value *Op1, const Query &Q,    if (Value *V = SimplifyDiv(Instruction::UDiv, Op0, Op1, Q, MaxRecurse))      return V; +  // udiv %V, C -> 0 if %V < C +  if (MaxRecurse) { +    if (Constant *C = dyn_cast_or_null<Constant>(SimplifyICmpInst( +            ICmpInst::ICMP_ULT, Op0, Op1, Q, MaxRecurse - 1))) { +      if (C->isAllOnesValue()) { +        return Constant::getNullValue(Op0->getType()); +      } +    } +  } +    return nullptr;  } @@ -1247,6 +1257,16 @@ static Value *SimplifyURemInst(Value *Op0, Value *Op1, const Query &Q,    if (Value *V = SimplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse))      return V; +  // urem %V, C -> %V if %V < C +  if (MaxRecurse) { +    if (Constant *C = dyn_cast_or_null<Constant>(SimplifyICmpInst( +            ICmpInst::ICMP_ULT, Op0, Op1, Q, MaxRecurse - 1))) { +      if (C->isAllOnesValue()) { +        return Op0; +      } +    } +  } +    return nullptr;  }  | 
