diff options
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/div.ll | 15 | 
2 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 7ae7c4ef939..8da2f0981d0 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/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;  } diff --git a/llvm/test/Transforms/InstSimplify/div.ll b/llvm/test/Transforms/InstSimplify/div.ll new file mode 100644 index 00000000000..b8ce34aaa37 --- /dev/null +++ b/llvm/test/Transforms/InstSimplify/div.ll @@ -0,0 +1,15 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s + +declare i32 @external() + +define i32 @div1() { +; CHECK-LABEL: @div1( +; CHECK:         [[CALL:%.*]] = call i32 @external(), !range !0 +; CHECK-NEXT:    ret i32 0 +; +  %call = call i32 @external(), !range !0 +  %urem = udiv i32 %call, 3 +  ret i32 %urem +} + +!0 = !{i32 0, i32 3}  | 

