[llvm] r285228 - 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:18:44 PDT 2016
Author: sanjoy
Date: Wed Oct 26 14:18:43 2016
New Revision: 285228
URL: http://llvm.org/viewvc/llvm-project?rev=285228&view=rev
Log:
Simplify `x >=u x >> y` and `x >=u x udiv y`
Summary:
Extends InstSimplify to handle both `x >=u x >> y` and `x >=u x udiv y`.
This is a folloup of rL258422 and
https://github.com/rust-lang/rust/pull/30917 where llvm failed to
optimize away the bounds checking in a binary search.
Patch by Arthur Silva!
Reviewers: sanjoy
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D25941
Modified:
llvm/trunk/lib/Analysis/InstructionSimplify.cpp
llvm/trunk/test/Transforms/InstSimplify/compare.ll
Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=285228&r1=285227&r2=285228&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Wed Oct 26 14:18:43 2016
@@ -2857,6 +2857,17 @@ static Value *SimplifyICmpInst(unsigned
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
Modified: llvm/trunk/test/Transforms/InstSimplify/compare.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/compare.ll?rev=285228&r1=285227&r2=285228&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/compare.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/compare.ll Wed Oct 26 14:18:43 2016
@@ -409,6 +409,22 @@ define i1 @lshr5(i32 %X, i32 %Y) {
; 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 @@ define i1 @udiv6(i32 %X) nounwind {
; 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.
More information about the llvm-commits
mailing list