diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-03-09 06:26:03 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-03-09 06:26:03 +0000 |
commit | 84dd4fa2e36f72050f5c46577359f5df0467e3e4 (patch) | |
tree | 008880181f1e1077129fe7c5387df067b92df919 | |
parent | b2fd770136b92637c5f084b743eab29f910288d5 (diff) | |
download | llvm-84dd4fa2e36f72050f5c46577359f5df0467e3e4.tar.gz llvm-84dd4fa2e36f72050f5c46577359f5df0467e3e4.tar.bz2 llvm-84dd4fa2e36f72050f5c46577359f5df0467e3e4.tar.xz |
Add another micro-optimization. Apologies for the lack of refactoring, but I
gave up when I realized I couldn't come up with a good name for what the
refactored function would be, to describe what it does.
This is PR9343 test12, which is test3 with arguments reordered. Whoops!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127318 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 30 | ||||
-rw-r--r-- | test/Transforms/InstSimplify/compare.ll | 8 |
2 files changed, 36 insertions, 2 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 48edc5ceac..2d202f7b98 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -1671,8 +1671,7 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, } } - Value *V; - if (LBO && match(LBO, m_URem(m_Value(V), m_Specific(RHS)))) { + if (LBO && match(LBO, m_URem(m_Value(), m_Specific(RHS)))) { bool KnownNonNegative, KnownNegative; switch (Pred) { default: @@ -1699,6 +1698,33 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, return ConstantInt::getTrue(RHS->getContext()); } } + if (RBO && match(RBO, m_URem(m_Value(), m_Specific(LHS)))) { + bool KnownNonNegative, KnownNegative; + switch (Pred) { + default: + break; + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_SGE: + ComputeSignBit(RHS, KnownNonNegative, KnownNegative, TD); + if (!KnownNonNegative) + break; + // fall-through + case ICmpInst::ICMP_EQ: + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGE: + return ConstantInt::getTrue(RHS->getContext()); + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_SLE: + ComputeSignBit(RHS, KnownNonNegative, KnownNegative, TD); + if (!KnownNonNegative) + break; + // fall-through + case ICmpInst::ICMP_NE: + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_ULE: + return ConstantInt::getFalse(RHS->getContext()); + } + } if (MaxRecurse && LBO && RBO && LBO->getOpcode() == RBO->getOpcode() && LBO->getOperand(1) == RBO->getOperand(1)) { diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll index 7174e7fc61..00a14cc5cc 100644 --- a/test/Transforms/InstSimplify/compare.ll +++ b/test/Transforms/InstSimplify/compare.ll @@ -245,6 +245,14 @@ define i1 @urem5(i16 %X, i32 %Y) { ; CHECK: ret i1 true } +define i1 @urem6(i32 %X, i32 %Y) { +; CHECK: @urem6 + %A = urem i32 %X, %Y + %B = icmp ugt i32 %Y, %A + ret i1 %B +; CHECK: ret i1 true +} + define i1 @srem1(i32 %X) { ; CHECK: @srem1 %A = srem i32 %X, -5 |