summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-08-14 22:11:43 +0000
committerCraig Topper <craig.topper@intel.com>2017-08-14 22:11:43 +0000
commitb1e4b1a0704b426240368b75ddd206852bb03737 (patch)
tree8ea7c13da0f30eb2afaf2f6f24a929982dd10d79 /llvm/lib/Analysis
parent18728822d295eb470c62e81025055a03ad813fde (diff)
downloadbcm5719-llvm-b1e4b1a0704b426240368b75ddd206852bb03737.tar.gz
bcm5719-llvm-b1e4b1a0704b426240368b75ddd206852bb03737.zip
[InstSimplify] Teach decomposeBitTestICmp to handle non-canonical compares
This adds support non-canonical compare predicates. InstSimplify can't rely on canonicalization to have occurred. Differential Revision: https://reviews.llvm.org/D36646 llvm-svn: 310893
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r--llvm/lib/Analysis/CmpInstAnalysis.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/CmpInstAnalysis.cpp b/llvm/lib/Analysis/CmpInstAnalysis.cpp
index 079811fe9a2..c879b8729dc 100644
--- a/llvm/lib/Analysis/CmpInstAnalysis.cpp
+++ b/llvm/lib/Analysis/CmpInstAnalysis.cpp
@@ -81,6 +81,13 @@ bool llvm::decomposeBitTestICmp(Value *LHS, Value *RHS,
Mask = APInt::getSignMask(C->getBitWidth());
Pred = ICmpInst::ICMP_NE;
break;
+ case ICmpInst::ICMP_SLE:
+ // X <= -1 is equivalent to (X & SignMask) != 0.
+ if (!C->isAllOnesValue())
+ return false;
+ Mask = APInt::getSignMask(C->getBitWidth());
+ Pred = ICmpInst::ICMP_NE;
+ break;
case ICmpInst::ICMP_SGT:
// X > -1 is equivalent to (X & SignMask) == 0.
if (!C->isAllOnesValue())
@@ -88,6 +95,13 @@ bool llvm::decomposeBitTestICmp(Value *LHS, Value *RHS,
Mask = APInt::getSignMask(C->getBitWidth());
Pred = ICmpInst::ICMP_EQ;
break;
+ case ICmpInst::ICMP_SGE:
+ // X >= 0 is equivalent to (X & SignMask) == 0.
+ if (!C->isNullValue())
+ return false;
+ Mask = APInt::getSignMask(C->getBitWidth());
+ Pred = ICmpInst::ICMP_EQ;
+ break;
case ICmpInst::ICMP_ULT:
// X <u 2^n is equivalent to (X & ~(2^n-1)) == 0.
if (!C->isPowerOf2())
@@ -95,6 +109,13 @@ bool llvm::decomposeBitTestICmp(Value *LHS, Value *RHS,
Mask = -*C;
Pred = ICmpInst::ICMP_EQ;
break;
+ case ICmpInst::ICMP_ULE:
+ // X <=u 2^n-1 is equivalent to (X & ~(2^n-1)) == 0.
+ if (!(*C + 1).isPowerOf2())
+ return false;
+ Mask = ~*C;
+ Pred = ICmpInst::ICMP_EQ;
+ break;
case ICmpInst::ICMP_UGT:
// X >u 2^n-1 is equivalent to (X & ~(2^n-1)) != 0.
if (!(*C + 1).isPowerOf2())
@@ -102,6 +123,13 @@ bool llvm::decomposeBitTestICmp(Value *LHS, Value *RHS,
Mask = ~*C;
Pred = ICmpInst::ICMP_NE;
break;
+ case ICmpInst::ICMP_UGE:
+ // X >=u 2^n is equivalent to (X & ~(2^n-1)) != 0.
+ if (!C->isPowerOf2())
+ return false;
+ Mask = -*C;
+ Pred = ICmpInst::ICMP_NE;
+ break;
}
X = LHS;
OpenPOWER on IntegriCloud