diff --git a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h index bc9f952146c2..d9814962d11d 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h @@ -595,7 +595,7 @@ bool InstructionSelector::executeMatchTable( case GIM_CheckPointerToAny: { int64_t InsnID = MatchTable[CurrentIdx++]; int64_t OpIdx = MatchTable[CurrentIdx++]; - uint64_t SizeInBits = MatchTable[CurrentIdx++]; + int64_t SizeInBits = MatchTable[CurrentIdx++]; DEBUG_WITH_TYPE(TgtInstructionSelector::getName(), dbgs() << CurrentIdx << ": GIM_CheckPointerToAny(MIs[" diff --git a/llvm/include/llvm/Support/LowLevelTypeImpl.h b/llvm/include/llvm/Support/LowLevelTypeImpl.h index 379e37101e9a..0660bcd8256c 100644 --- a/llvm/include/llvm/Support/LowLevelTypeImpl.h +++ b/llvm/include/llvm/Support/LowLevelTypeImpl.h @@ -67,7 +67,7 @@ public: 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}; } @@ -100,14 +100,12 @@ public: return EC.isScalar() ? ScalarTy : LLT::vector(EC, ScalarTy); } - static LLT scalarOrVector(ElementCount EC, uint64_t ScalarSize) { - assert(ScalarSize <= std::numeric_limits::max() && - "Not enough bits in LLT to represent size"); - return scalarOrVector(EC, LLT::scalar(static_cast(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) {} @@ -150,19 +148,18 @@ public: } /// 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 { @@ -202,11 +199,11 @@ public: 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"); @@ -336,10 +333,8 @@ private: 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::max() && - "Not enough bits in LLT to represent size"); this->IsPointer = IsPointer; this->IsVector = IsVector; if (!IsVector) { diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 42c63849910e..cbe456824587 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1565,7 +1565,7 @@ bool IRTranslator::translateMemFunc(const CallInst &CI, Register SrcReg = getOrCreateVReg(**AI); LLT SrcTy = MRI->getType(SrcReg); if (SrcTy.isPointer()) - MinPtrSize = std::min(SrcTy.getSizeInBits(), MinPtrSize); + MinPtrSize = std::min(SrcTy.getSizeInBits(), MinPtrSize); SrcRegs.push_back(SrcReg); } diff --git a/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp b/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp index 820694b72fc1..753b380faf44 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp @@ -258,8 +258,7 @@ static bool matchBitfieldExtractFromSExtInReg( m_OneNonDBGUse(m_any_of(m_GAShr(m_Reg(ShiftSrc), m_ICst(ShiftImm)), m_GLShr(m_Reg(ShiftSrc), m_ICst(ShiftImm)))))) return false; - if (ShiftImm < 0 || - static_cast(ShiftImm + Width) > Ty.getSizeInBits()) + if (ShiftImm < 0 || ShiftImm + Width > Ty.getSizeInBits()) return false; MatchInfo = [=](MachineIRBuilder &B) { auto Cst1 = B.buildConstant(Ty, ShiftImm); diff --git a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp index 9ff75b8f183b..e27c6e4e955a 100644 --- a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp +++ b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp @@ -81,9 +81,6 @@ TEST(LowLevelTypeTest, Vector) { EXPECT_EQ(EC, VTy.getElementCount()); if (!EC.isScalable()) EXPECT_EQ(S * EC.getFixedValue(), VTy.getSizeInBits()); - else - EXPECT_EQ(TypeSize::Scalable(S * EC.getKnownMinValue()), - VTy.getSizeInBits()); // Test equality operators. EXPECT_TRUE(VTy == VTy); diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp index 693073672fc1..497854ababfe 100644 --- a/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -182,13 +182,7 @@ public: 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; } @@ -3794,8 +3788,7 @@ Optional GlobalISelEmitter::getMemSizeBitsFromPredicate(const TreePred return None; // Align so unusual types like i1 don't get rounded down. - return llvm::alignTo( - static_cast(MemTyOrNone->get().getSizeInBits()), 8); + return llvm::alignTo(MemTyOrNone->get().getSizeInBits(), 8); } Expected GlobalISelEmitter::addBuiltinPredicates(