Add helper function for getting true/false constants in a uniform

way for i1 and vector of i1 types.  Use these to make some code
more self-documenting.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136079 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands 2011-07-26 15:03:53 +00:00
parent b3aa4715c1
commit f56138d4ae

View File

@ -48,6 +48,26 @@ static Value *SimplifyOrInst(Value *, Value *, const TargetData *,
static Value *SimplifyXorInst(Value *, Value *, const TargetData *,
const DominatorTree *, unsigned);
/// getFalse - For a boolean type, or a vector of boolean type, return false, or
/// a vector with every element false, as appropriate for the type.
static Constant *getFalse(Type *Ty) {
assert((Ty->isIntegerTy(1) ||
(Ty->isVectorTy() &&
cast<VectorType>(Ty)->getElementType()->isIntegerTy(1))) &&
"Expected i1 type or a vector of i1!");
return Constant::getNullValue(Ty);
}
/// getTrue - For a boolean type, or a vector of boolean type, return true, or
/// a vector with every element true, as appropriate for the type.
static Constant *getTrue(Type *Ty) {
assert((Ty->isIntegerTy(1) ||
(Ty->isVectorTy() &&
cast<VectorType>(Ty)->getElementType()->isIntegerTy(1))) &&
"Expected i1 type or a vector of i1!");
return Constant::getAllOnesValue(Ty);
}
/// ValueDominatesPHI - Does the given value dominate the specified phi node?
static bool ValueDominatesPHI(Value *V, PHINode *P, const DominatorTree *DT) {
Instruction *I = dyn_cast<Instruction>(V);
@ -1478,48 +1498,46 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
default:
assert(false && "Unknown ICmp predicate!");
case ICmpInst::ICMP_ULT:
// getNullValue also works for vectors, unlike getFalse.
return Constant::getNullValue(ITy);
return getFalse(ITy);
case ICmpInst::ICMP_UGE:
// getAllOnesValue also works for vectors, unlike getTrue.
return ConstantInt::getAllOnesValue(ITy);
return getTrue(ITy);
case ICmpInst::ICMP_EQ:
case ICmpInst::ICMP_ULE:
if (isKnownNonZero(LHS, TD))
return Constant::getNullValue(ITy);
return getFalse(ITy);
break;
case ICmpInst::ICMP_NE:
case ICmpInst::ICMP_UGT:
if (isKnownNonZero(LHS, TD))
return ConstantInt::getAllOnesValue(ITy);
return getTrue(ITy);
break;
case ICmpInst::ICMP_SLT:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return ConstantInt::getAllOnesValue(ITy);
return getTrue(ITy);
if (LHSKnownNonNegative)
return Constant::getNullValue(ITy);
return getFalse(ITy);
break;
case ICmpInst::ICMP_SLE:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return ConstantInt::getAllOnesValue(ITy);
return getTrue(ITy);
if (LHSKnownNonNegative && isKnownNonZero(LHS, TD))
return Constant::getNullValue(ITy);
return getFalse(ITy);
break;
case ICmpInst::ICMP_SGE:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return Constant::getNullValue(ITy);
return getFalse(ITy);
if (LHSKnownNonNegative)
return ConstantInt::getAllOnesValue(ITy);
return getTrue(ITy);
break;
case ICmpInst::ICMP_SGT:
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, TD);
if (LHSKnownNegative)
return Constant::getNullValue(ITy);
return getFalse(ITy);
if (LHSKnownNonNegative && isKnownNonZero(LHS, TD))
return ConstantInt::getAllOnesValue(ITy);
return getTrue(ITy);
break;
}
}
@ -1811,8 +1829,7 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_EQ:
case ICmpInst::ICMP_UGT:
case ICmpInst::ICMP_UGE:
// getNullValue also works for vectors, unlike getFalse.
return Constant::getNullValue(ITy);
return getFalse(ITy);
case ICmpInst::ICMP_SLT:
case ICmpInst::ICMP_SLE:
ComputeSignBit(LHS, KnownNonNegative, KnownNegative, TD);
@ -1822,8 +1839,7 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_NE:
case ICmpInst::ICMP_ULT:
case ICmpInst::ICMP_ULE:
// getAllOnesValue also works for vectors, unlike getTrue.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
}
}
if (RBO && match(RBO, m_URem(m_Value(), m_Specific(LHS)))) {
@ -1840,8 +1856,7 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_NE:
case ICmpInst::ICMP_UGT:
case ICmpInst::ICMP_UGE:
// getAllOnesValue also works for vectors, unlike getTrue.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
case ICmpInst::ICMP_SLT:
case ICmpInst::ICMP_SLE:
ComputeSignBit(RHS, KnownNonNegative, KnownNegative, TD);
@ -1851,8 +1866,7 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
case ICmpInst::ICMP_EQ:
case ICmpInst::ICMP_ULT:
case ICmpInst::ICMP_ULE:
// getNullValue also works for vectors, unlike getFalse.
return Constant::getNullValue(ITy);
return getFalse(ITy);
}
}
@ -1955,10 +1969,10 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
}
case CmpInst::ICMP_SGE:
// Always true.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
case CmpInst::ICMP_SLT:
// Always false.
return Constant::getNullValue(ITy);
return getFalse(ITy);
}
}
@ -2025,10 +2039,10 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
}
case CmpInst::ICMP_UGE:
// Always true.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
case CmpInst::ICMP_ULT:
// Always false.
return Constant::getNullValue(ITy);
return getFalse(ITy);
}
}
@ -2040,40 +2054,40 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
// max(x, ?) pred min(x, ?).
if (Pred == CmpInst::ICMP_SGE)
// Always true.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
if (Pred == CmpInst::ICMP_SLT)
// Always false.
return Constant::getNullValue(ITy);
return getFalse(ITy);
} else if (match(LHS, m_SMin(m_Value(A), m_Value(B))) &&
match(RHS, m_SMax(m_Value(C), m_Value(D))) &&
(A == C || A == D || B == C || B == D)) {
// min(x, ?) pred max(x, ?).
if (Pred == CmpInst::ICMP_SLE)
// Always true.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
if (Pred == CmpInst::ICMP_SGT)
// Always false.
return Constant::getNullValue(ITy);
return getFalse(ITy);
} else if (match(LHS, m_UMax(m_Value(A), m_Value(B))) &&
match(RHS, m_UMin(m_Value(C), m_Value(D))) &&
(A == C || A == D || B == C || B == D)) {
// max(x, ?) pred min(x, ?).
if (Pred == CmpInst::ICMP_UGE)
// Always true.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
if (Pred == CmpInst::ICMP_ULT)
// Always false.
return Constant::getNullValue(ITy);
return getFalse(ITy);
} else if (match(LHS, m_UMin(m_Value(A), m_Value(B))) &&
match(RHS, m_UMax(m_Value(C), m_Value(D))) &&
(A == C || A == D || B == C || B == D)) {
// min(x, ?) pred max(x, ?).
if (Pred == CmpInst::ICMP_ULE)
// Always true.
return Constant::getAllOnesValue(ITy);
return getTrue(ITy);
if (Pred == CmpInst::ICMP_UGT)
// Always false.
return Constant::getNullValue(ITy);
return getFalse(ITy);
}
// If the comparison is with the result of a select instruction, check whether