Add another micro-optimization. Apologies for the lack of refactoring, but I
authorNick Lewycky <nicholas@mxc.ca>
Wed, 9 Mar 2011 06:26:03 +0000 (06:26 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Wed, 9 Mar 2011 06:26:03 +0000 (06:26 +0000)
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

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/compare.ll

index 48edc5ceacac2f9f51e78751a73094f3840a17a7..2d202f7b9834814ba743556bfa8a1b66bd281f86 100644 (file)
@@ -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)) {
index 7174e7fc61aae9f4be177a8b82a25c756a3df89b..00a14cc5cc644a5473968097d3ba67abe05eb78e 100644 (file)
@@ -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