mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-04 02:24:29 +00:00
ConstantInt has some getters which return ConstantInt's or ConstantVector's of
the value splatted into every element. Extend this to getTrue and getFalse which by providing new overloads that take Types that are either i1 or <N x i1>. Use it in InstCombine to add vector support to some code, fixing PR8469! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -326,27 +326,53 @@ ConstantInt::ConstantInt(const IntegerType *Ty, const APInt& V)
|
||||
assert(V.getBitWidth() == Ty->getBitWidth() && "Invalid constant for type");
|
||||
}
|
||||
|
||||
ConstantInt* ConstantInt::getTrue(LLVMContext &Context) {
|
||||
ConstantInt *ConstantInt::getTrue(LLVMContext &Context) {
|
||||
LLVMContextImpl *pImpl = Context.pImpl;
|
||||
if (!pImpl->TheTrueVal)
|
||||
pImpl->TheTrueVal = ConstantInt::get(Type::getInt1Ty(Context), 1);
|
||||
return pImpl->TheTrueVal;
|
||||
}
|
||||
|
||||
ConstantInt* ConstantInt::getFalse(LLVMContext &Context) {
|
||||
ConstantInt *ConstantInt::getFalse(LLVMContext &Context) {
|
||||
LLVMContextImpl *pImpl = Context.pImpl;
|
||||
if (!pImpl->TheFalseVal)
|
||||
pImpl->TheFalseVal = ConstantInt::get(Type::getInt1Ty(Context), 0);
|
||||
return pImpl->TheFalseVal;
|
||||
}
|
||||
|
||||
Constant *ConstantInt::getTrue(const Type *Ty) {
|
||||
const VectorType *VTy = dyn_cast<VectorType>(Ty);
|
||||
if (!VTy) {
|
||||
assert(Ty->isIntegerTy(1) && "True must be i1 or vector of i1.");
|
||||
return ConstantInt::getTrue(Ty->getContext());
|
||||
}
|
||||
assert(VTy->getElementType()->isIntegerTy(1) &&
|
||||
"True must be vector of i1 or i1.");
|
||||
SmallVector<Constant*, 16> Splat(VTy->getNumElements(),
|
||||
ConstantInt::getTrue(Ty->getContext()));
|
||||
return ConstantVector::get(Splat);
|
||||
}
|
||||
|
||||
Constant *ConstantInt::getFalse(const Type *Ty) {
|
||||
const VectorType *VTy = dyn_cast<VectorType>(Ty);
|
||||
if (!VTy) {
|
||||
assert(Ty->isIntegerTy(1) && "False must be i1 or vector of i1.");
|
||||
return ConstantInt::getFalse(Ty->getContext());
|
||||
}
|
||||
assert(VTy->getElementType()->isIntegerTy(1) &&
|
||||
"False must be vector of i1 or i1.");
|
||||
SmallVector<Constant*, 16> Splat(VTy->getNumElements(),
|
||||
ConstantInt::getFalse(Ty->getContext()));
|
||||
return ConstantVector::get(Splat);
|
||||
}
|
||||
|
||||
|
||||
// Get a ConstantInt from an APInt. Note that the value stored in the DenseMap
|
||||
// as the key, is a DenseMapAPIntKeyInfo::KeyTy which has provided the
|
||||
// operator== and operator!= to ensure that the DenseMap doesn't attempt to
|
||||
// compare APInt's of different widths, which would violate an APInt class
|
||||
// invariant which generates an assertion.
|
||||
ConstantInt *ConstantInt::get(LLVMContext &Context, const APInt& V) {
|
||||
ConstantInt *ConstantInt::get(LLVMContext &Context, const APInt &V) {
|
||||
// Get the corresponding integer type for the bit width of the value.
|
||||
const IntegerType *ITy = IntegerType::get(Context, V.getBitWidth());
|
||||
// get an existing value or the insertion position
|
||||
@ -356,9 +382,8 @@ ConstantInt *ConstantInt::get(LLVMContext &Context, const APInt& V) {
|
||||
return Slot;
|
||||
}
|
||||
|
||||
Constant *ConstantInt::get(const Type* Ty, uint64_t V, bool isSigned) {
|
||||
Constant *C = get(cast<IntegerType>(Ty->getScalarType()),
|
||||
V, isSigned);
|
||||
Constant *ConstantInt::get(const Type *Ty, uint64_t V, bool isSigned) {
|
||||
Constant *C = get(cast<IntegerType>(Ty->getScalarType()), V, isSigned);
|
||||
|
||||
// For vectors, broadcast the value.
|
||||
if (const VectorType *VTy = dyn_cast<VectorType>(Ty))
|
||||
|
Reference in New Issue
Block a user