[PATCH] D25941: Simplify `x >=u x >> y` and `x >=u x udiv y`

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 26 12:28:19 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL285228: Simplify `x >=u x >> y` and `x >=u x udiv y` (authored by sanjoy).

Changed prior to commit:
  https://reviews.llvm.org/D25941?vs=75721&id=75927#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D25941

Files:
  llvm/trunk/lib/Analysis/InstructionSimplify.cpp
  llvm/trunk/test/Transforms/InstSimplify/compare.ll


Index: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp
@@ -2857,6 +2857,17 @@
       return getTrue(ITy);
   }
 
+  // x >=u x >> y
+  // x >=u x udiv y.
+  if (RBO && (match(RBO, m_LShr(m_Specific(LHS), m_Value())) ||
+              match(RBO, m_UDiv(m_Specific(LHS), m_Value())))) {
+    // icmp pred X, (X op Y)
+    if (Pred == ICmpInst::ICMP_ULT)
+      return getFalse(ITy);
+    if (Pred == ICmpInst::ICMP_UGE)
+      return getTrue(ITy);
+  }
+
   // handle:
   //   CI2 << X == CI
   //   CI2 << X != CI
Index: llvm/trunk/test/Transforms/InstSimplify/compare.ll
===================================================================
--- llvm/trunk/test/Transforms/InstSimplify/compare.ll
+++ llvm/trunk/test/Transforms/InstSimplify/compare.ll
@@ -409,6 +409,22 @@
 ; CHECK: ret i1 false
 }
 
+define i1 @lshr6(i32 %X, i32 %Y) {
+; CHECK-LABEL: @lshr6(
+  %A = lshr i32 %X, %Y
+  %C = icmp ult i32 %X, %A
+  ret i1 %C
+; CHECK: ret i1 false
+}
+
+define i1 @lshr7(i32 %X, i32 %Y) {
+; CHECK-LABEL: @lshr7(
+  %A = lshr i32 %X, %Y
+  %C = icmp uge i32 %X, %A
+  ret i1 %C
+; CHECK: ret i1 true
+}
+
 define i1 @ashr1(i32 %x) {
 ; CHECK-LABEL: @ashr1(
   %s = ashr i32 -1, %x
@@ -583,6 +599,22 @@
 ; CHECK: ret i1 %C
 }
 
+define i1 @udiv7(i32 %X, i32 %Y) {
+; CHECK-LABEL: @udiv7(
+  %A = udiv i32 %X, %Y
+  %C = icmp ult i32 %X, %A
+  ret i1 %C
+; CHECK: ret i1 false
+}
+
+define i1 @udiv8(i32 %X, i32 %Y) {
+; CHECK-LABEL: @udiv8(
+  %A = udiv i32 %X, %Y
+  %C = icmp uge i32 %X, %A
+  ret i1 %C
+; CHECK: ret i1 true
+}
+
 define i1 @mul1(i32 %X) {
 ; CHECK-LABEL: @mul1(
 ; Square of a non-zero number is non-zero if there is no overflow.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25941.75927.patch
Type: text/x-patch
Size: 1820 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161026/125a2560/attachment.bin>


More information about the llvm-commits mailing list