assert(!EC.isScalar() && "invalid number of vector elements");
assert(!ScalarTy.isVector() && "invalid vector element type");
return LLT{ScalarTy.isPointer(), /*isVector=*/true, EC,
- ScalarTy.getSizeInBits().getFixedSize(),
+ ScalarTy.getSizeInBits(),
ScalarTy.isPointer() ? ScalarTy.getAddressSpace() : 0};
}
return EC.isScalar() ? ScalarTy : LLT::vector(EC, ScalarTy);
}
- static LLT scalarOrVector(ElementCount EC, uint64_t ScalarSize) {
- assert(ScalarSize <= std::numeric_limits<unsigned>::max() &&
- "Not enough bits in LLT to represent size");
- return scalarOrVector(EC, LLT::scalar(static_cast<unsigned>(ScalarSize)));
+ static LLT scalarOrVector(ElementCount EC, unsigned ScalarSize) {
+ return scalarOrVector(EC, LLT::scalar(ScalarSize));
}
explicit LLT(bool isPointer, bool isVector, ElementCount EC,
- uint64_t SizeInBits, unsigned AddressSpace) {
+ unsigned SizeInBits, unsigned AddressSpace) {
init(isPointer, isVector, EC, SizeInBits, AddressSpace);
}
explicit LLT() : IsPointer(false), IsVector(false), RawData(0) {}
}
/// Returns the total size of the type. Must only be called on sized types.
- TypeSize getSizeInBits() const {
+ unsigned getSizeInBits() const {
if (isPointer() || isScalar())
- return TypeSize::Fixed(getScalarSizeInBits());
- auto EC = getElementCount();
- return TypeSize(getScalarSizeInBits() * EC.getKnownMinValue(),
- EC.isScalable());
+ return getScalarSizeInBits();
+ // FIXME: This should return a TypeSize in order to work for scalable
+ // vectors.
+ return getScalarSizeInBits() * getElementCount().getKnownMinValue();
}
/// Returns the total size of the type in bytes, i.e. number of whole bytes
/// needed to represent the size in bits. Must only be called on sized types.
- TypeSize getSizeInBytes() const {
- TypeSize BaseSize = getSizeInBits();
- return {(BaseSize.getKnownMinSize() + 7) / 8, BaseSize.isScalable()};
+ unsigned getSizeInBytes() const {
+ return (getSizeInBits() + 7) / 8;
}
LLT getScalarType() const {
getElementType());
}
- assert(getScalarSizeInBits() % Factor == 0);
- return scalar(getScalarSizeInBits() / Factor);
+ assert(getSizeInBits() % Factor == 0);
+ return scalar(getSizeInBits() / Factor);
}
- bool isByteSized() const { return getSizeInBits().isKnownMultipleOf(8); }
+ bool isByteSized() const { return (getSizeInBits() & 7) == 0; }
unsigned getScalarSizeInBits() const {
assert(RawData != 0 && "Invalid Type");
return getMask(FieldInfo) & (RawData >> FieldInfo[1]);
}
- void init(bool IsPointer, bool IsVector, ElementCount EC, uint64_t SizeInBits,
+ void init(bool IsPointer, bool IsVector, ElementCount EC, unsigned SizeInBits,
unsigned AddressSpace) {
- assert(SizeInBits <= std::numeric_limits<unsigned>::max() &&
- "Not enough bits in LLT to represent size");
this->IsPointer = IsPointer;
this->IsVector = IsVector;
if (!IsVector) {
assert((!Ty.isVector() || Ty.isScalable() == Other.Ty.isScalable()) &&
"Unexpected mismatch of scalable property");
- return Ty.isVector()
- ? std::make_tuple(Ty.isScalable(),
- Ty.getSizeInBits().getKnownMinSize()) <
- std::make_tuple(Other.Ty.isScalable(),
- Other.Ty.getSizeInBits().getKnownMinSize())
- : Ty.getSizeInBits().getFixedSize() <
- Other.Ty.getSizeInBits().getFixedSize();
+ return Ty.getSizeInBits() < Other.Ty.getSizeInBits();
}
bool operator==(const LLTCodeGen &B) const { return Ty == B.Ty; }
return None;
// Align so unusual types like i1 don't get rounded down.
- return llvm::alignTo(
- static_cast<unsigned>(MemTyOrNone->get().getSizeInBits()), 8);
+ return llvm::alignTo(MemTyOrNone->get().getSizeInBits(), 8);
}
Expected<InstructionMatcher &> GlobalISelEmitter::addBuiltinPredicates(