diff options
| author | Craig Topper <craig.topper@intel.com> | 2017-08-14 22:11:43 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2017-08-14 22:11:43 +0000 |
| commit | b1e4b1a0704b426240368b75ddd206852bb03737 (patch) | |
| tree | 8ea7c13da0f30eb2afaf2f6f24a929982dd10d79 /llvm/lib/Analysis | |
| parent | 18728822d295eb470c62e81025055a03ad813fde (diff) | |
| download | bcm5719-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.cpp | 28 |
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; |

