mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
[InstCombine] Add an InstCombine specific wrapper around isKnownToBeAPowerOfTwo to shorten code. NFC
We have wrappers for several other ValueTracking methods that take care of passing all of the analysis and assumption cache parameters. This extends it to isKnownToBeAPowerOfTwo. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303924 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d163591138
commit
32c2620ed2
@ -1610,17 +1610,13 @@ Value *InstCombiner::foldOrOfICmps(ICmpInst *LHS, ICmpInst *RHS,
|
||||
Value *Mask = nullptr;
|
||||
Value *Masked = nullptr;
|
||||
if (LAnd->getOperand(0) == RAnd->getOperand(0) &&
|
||||
isKnownToBeAPowerOfTwo(LAnd->getOperand(1), DL, false, 0, &AC, CxtI,
|
||||
&DT) &&
|
||||
isKnownToBeAPowerOfTwo(RAnd->getOperand(1), DL, false, 0, &AC, CxtI,
|
||||
&DT)) {
|
||||
isKnownToBeAPowerOfTwo(LAnd->getOperand(1), false, 0, CxtI) &&
|
||||
isKnownToBeAPowerOfTwo(RAnd->getOperand(1), false, 0, CxtI)) {
|
||||
Mask = Builder->CreateOr(LAnd->getOperand(1), RAnd->getOperand(1));
|
||||
Masked = Builder->CreateAnd(LAnd->getOperand(0), Mask);
|
||||
} else if (LAnd->getOperand(1) == RAnd->getOperand(1) &&
|
||||
isKnownToBeAPowerOfTwo(LAnd->getOperand(0), DL, false, 0, &AC,
|
||||
CxtI, &DT) &&
|
||||
isKnownToBeAPowerOfTwo(RAnd->getOperand(0), DL, false, 0, &AC,
|
||||
CxtI, &DT)) {
|
||||
isKnownToBeAPowerOfTwo(LAnd->getOperand(0), false, 0, CxtI) &&
|
||||
isKnownToBeAPowerOfTwo(RAnd->getOperand(0), false, 0, CxtI)) {
|
||||
Mask = Builder->CreateOr(LAnd->getOperand(0), RAnd->getOperand(0));
|
||||
Masked = Builder->CreateAnd(LAnd->getOperand(1), Mask);
|
||||
}
|
||||
|
@ -4503,7 +4503,7 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
// if A is a power of 2.
|
||||
if (match(Op0, m_And(m_Value(A), m_Not(m_Value(B)))) &&
|
||||
match(Op1, m_Zero()) &&
|
||||
isKnownToBeAPowerOfTwo(A, DL, false, 0, &AC, &I, &DT) && I.isEquality())
|
||||
isKnownToBeAPowerOfTwo(A, false, 0, &I) && I.isEquality())
|
||||
return new ICmpInst(I.getInversePredicate(),
|
||||
Builder->CreateAnd(A, B),
|
||||
Op1);
|
||||
|
@ -540,6 +540,12 @@ public:
|
||||
return llvm::computeKnownBits(V, DL, Depth, &AC, CxtI, &DT);
|
||||
}
|
||||
|
||||
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero = false,
|
||||
unsigned Depth = 0,
|
||||
const Instruction *CxtI = nullptr) {
|
||||
return llvm::isKnownToBeAPowerOfTwo(V, DL, OrZero, Depth, &AC, CxtI, &DT);
|
||||
}
|
||||
|
||||
bool MaskedValueIsZero(const Value *V, const APInt &Mask, unsigned Depth = 0,
|
||||
const Instruction *CxtI = nullptr) const {
|
||||
return llvm::MaskedValueIsZero(V, Mask, DL, Depth, &AC, CxtI, &DT);
|
||||
|
@ -47,9 +47,7 @@ static Value *simplifyValueKnownNonZero(Value *V, InstCombiner &IC,
|
||||
// inexact. Similarly for <<.
|
||||
BinaryOperator *I = dyn_cast<BinaryOperator>(V);
|
||||
if (I && I->isLogicalShift() &&
|
||||
isKnownToBeAPowerOfTwo(I->getOperand(0), IC.getDataLayout(), false, 0,
|
||||
&IC.getAssumptionCache(), &CxtI,
|
||||
&IC.getDominatorTree())) {
|
||||
IC.isKnownToBeAPowerOfTwo(I->getOperand(0), false, 0, &CxtI)) {
|
||||
// We know that this is an exact/nuw shift and that the input is a
|
||||
// non-zero context as well.
|
||||
if (Value *V2 = simplifyValueKnownNonZero(I->getOperand(0), IC, CxtI)) {
|
||||
@ -1240,7 +1238,7 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
|
||||
return BO;
|
||||
}
|
||||
|
||||
if (isKnownToBeAPowerOfTwo(Op1, DL, /*OrZero*/ true, 0, &AC, &I, &DT)) {
|
||||
if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/ true, 0, &I)) {
|
||||
// X sdiv (1 << Y) -> X udiv (1 << Y) ( -> X u>> Y)
|
||||
// Safe because the only negative value (1 << Y) can take on is
|
||||
// INT_MIN, and X sdiv INT_MIN == X udiv INT_MIN == 0 if X doesn't have
|
||||
@ -1487,7 +1485,7 @@ Instruction *InstCombiner::visitURem(BinaryOperator &I) {
|
||||
I.getType());
|
||||
|
||||
// X urem Y -> X and Y-1, where Y is a power of 2,
|
||||
if (isKnownToBeAPowerOfTwo(Op1, DL, /*OrZero*/ true, 0, &AC, &I, &DT)) {
|
||||
if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/ true, 0, &I)) {
|
||||
Constant *N1 = Constant::getAllOnesValue(I.getType());
|
||||
Value *Add = Builder->CreateAdd(Op1, N1);
|
||||
return BinaryOperator::CreateAnd(Op0, Add);
|
||||
|
Loading…
Reference in New Issue
Block a user