From 93fad2f404e0448b2e8a31bbe67481ac654ed962 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 6 Jan 2017 22:58:02 +0000 Subject: [PATCH] [InstSimplify] Optimize away udivs in the presence of range metadata We know that udiv %V, C can be optimized away to 0 if %V is ult C. llvm-svn: 291296 --- lib/Analysis/InstructionSimplify.cpp | 10 ++++++++++ test/Transforms/InstSimplify/div.ll | 15 +++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 test/Transforms/InstSimplify/div.ll diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 7ae7c4ef939..8da2f0981d0 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(SimplifyICmpInst( + ICmpInst::ICMP_ULT, Op0, Op1, Q, MaxRecurse - 1))) { + if (C->isAllOnesValue()) { + return Constant::getNullValue(Op0->getType()); + } + } + } + return nullptr; } diff --git a/test/Transforms/InstSimplify/div.ll b/test/Transforms/InstSimplify/div.ll new file mode 100644 index 00000000000..b8ce34aaa37 --- /dev/null +++ b/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}