mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
move decomposeBitTestICmp() to Transforms/Utils; NFC
As noted in https://reviews.llvm.org/D22537 , we can use this functionality in visitSelectInstWithICmp() and InstSimplify, but currently we have duplicated code. llvm-svn: 276140
This commit is contained in:
parent
b7c8cbfa86
commit
d160a578e0
@ -60,6 +60,11 @@ namespace llvm {
|
||||
/// equality comparison (which is signless).
|
||||
bool PredicatesFoldable(CmpInst::Predicate p1, CmpInst::Predicate p2);
|
||||
|
||||
/// Decompose an icmp into the form ((X & Y) pred Z) if possible. The returned
|
||||
/// predicate is either == or !=. Returns false if decomposition fails.
|
||||
bool decomposeBitTestICmp(const ICmpInst *I, CmpInst::Predicate &Pred,
|
||||
Value *&X, Value *&Y, Value *&Z);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -524,53 +524,6 @@ static unsigned conjugateICmpMask(unsigned Mask) {
|
||||
return NewMask;
|
||||
}
|
||||
|
||||
/// Decompose an icmp into the form ((X & Y) pred Z) if possible.
|
||||
/// The returned predicate is either == or !=. Returns false if
|
||||
/// decomposition fails.
|
||||
static bool decomposeBitTestICmp(const ICmpInst *I, ICmpInst::Predicate &Pred,
|
||||
Value *&X, Value *&Y, Value *&Z) {
|
||||
ConstantInt *C = dyn_cast<ConstantInt>(I->getOperand(1));
|
||||
if (!C)
|
||||
return false;
|
||||
|
||||
switch (I->getPredicate()) {
|
||||
default:
|
||||
return false;
|
||||
case ICmpInst::ICMP_SLT:
|
||||
// X < 0 is equivalent to (X & SignBit) != 0.
|
||||
if (!C->isZero())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), APInt::getSignBit(C->getBitWidth()));
|
||||
Pred = ICmpInst::ICMP_NE;
|
||||
break;
|
||||
case ICmpInst::ICMP_SGT:
|
||||
// X > -1 is equivalent to (X & SignBit) == 0.
|
||||
if (!C->isAllOnesValue())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), APInt::getSignBit(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->getValue().isPowerOf2())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), -C->getValue());
|
||||
Pred = ICmpInst::ICMP_EQ;
|
||||
break;
|
||||
case ICmpInst::ICMP_UGT:
|
||||
// X >u 2^n-1 is equivalent to (X & ~(2^n-1)) != 0.
|
||||
if (!(C->getValue() + 1).isPowerOf2())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), ~C->getValue());
|
||||
Pred = ICmpInst::ICMP_NE;
|
||||
break;
|
||||
}
|
||||
|
||||
X = I->getOperand(0);
|
||||
Z = ConstantInt::getNullValue(C->getType());
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E)
|
||||
/// Return the set of pattern classes (from MaskedICmpType)
|
||||
/// that both LHS and RHS satisfy.
|
||||
|
@ -62,3 +62,47 @@ bool llvm::PredicatesFoldable(ICmpInst::Predicate p1, ICmpInst::Predicate p2) {
|
||||
(CmpInst::isSigned(p1) && ICmpInst::isEquality(p2)) ||
|
||||
(CmpInst::isSigned(p2) && ICmpInst::isEquality(p1));
|
||||
}
|
||||
|
||||
bool llvm::decomposeBitTestICmp(const ICmpInst *I, CmpInst::Predicate &Pred,
|
||||
Value *&X, Value *&Y, Value *&Z) {
|
||||
ConstantInt *C = dyn_cast<ConstantInt>(I->getOperand(1));
|
||||
if (!C)
|
||||
return false;
|
||||
|
||||
switch (I->getPredicate()) {
|
||||
default:
|
||||
return false;
|
||||
case ICmpInst::ICMP_SLT:
|
||||
// X < 0 is equivalent to (X & SignBit) != 0.
|
||||
if (!C->isZero())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), APInt::getSignBit(C->getBitWidth()));
|
||||
Pred = ICmpInst::ICMP_NE;
|
||||
break;
|
||||
case ICmpInst::ICMP_SGT:
|
||||
// X > -1 is equivalent to (X & SignBit) == 0.
|
||||
if (!C->isAllOnesValue())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), APInt::getSignBit(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->getValue().isPowerOf2())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), -C->getValue());
|
||||
Pred = ICmpInst::ICMP_EQ;
|
||||
break;
|
||||
case ICmpInst::ICMP_UGT:
|
||||
// X >u 2^n-1 is equivalent to (X & ~(2^n-1)) != 0.
|
||||
if (!(C->getValue() + 1).isPowerOf2())
|
||||
return false;
|
||||
Y = ConstantInt::get(I->getContext(), ~C->getValue());
|
||||
Pred = ICmpInst::ICMP_NE;
|
||||
break;
|
||||
}
|
||||
|
||||
X = I->getOperand(0);
|
||||
Z = ConstantInt::getNullValue(C->getType());
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user