From 04905d75e75dc5300c8e786b36972c6092d03beb Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Fri, 23 Sep 2016 00:14:34 +0000 Subject: [PATCH] [RegisterBankInfo] Check that the mapping covers the interesting bits. In the verify method of the ValueMapping class we used to check that the mapping exactly matches the bits of the input value. This is problematic for statically allocated mappings because we would need a different mapping for each different size of the value that maps on one instruction. For instance, with such scheme, we would need a different mapping for a value of size 1, 5, 23 whereas they all end up on a 32-bit wide instruction. Therefore, change the verifier to check that the meaningful bits are covered by the mapping instead of matching them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282214 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h | 5 +++-- lib/CodeGen/GlobalISel/RegisterBankInfo.cpp | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h b/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h index 658f2c71b92..761f50f2190 100644 --- a/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h +++ b/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h @@ -95,11 +95,12 @@ public: const PartialMapping *begin() const { return BreakDown; } const PartialMapping *end() const { return BreakDown + NumBreakDowns; } - /// Verify that this mapping makes sense for a value of \p ExpectedBitWidth. + /// Verify that this mapping makes sense for a value of + /// \p MeaningFulBitWidth. /// \note This method does not check anything when assertions are disabled. /// /// \return True is the check was successful. - bool verify(unsigned ExpectedBitWidth) const; + bool verify(unsigned MeaningFulBitWidth) const; /// Print this on dbgs() stream. void dump() const; diff --git a/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp b/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp index 43a12627dee..291441ae930 100644 --- a/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp +++ b/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp @@ -422,7 +422,7 @@ void RegisterBankInfo::PartialMapping::print(raw_ostream &OS) const { OS << "nullptr"; } -bool RegisterBankInfo::ValueMapping::verify(unsigned ExpectedBitWidth) const { +bool RegisterBankInfo::ValueMapping::verify(unsigned MeaningFulBitWidth) const { assert(NumBreakDowns && "Value mapped nowhere?!"); unsigned OrigValueBitWidth = 0; for (const RegisterBankInfo::PartialMapping &PartMap : *this) { @@ -434,7 +434,8 @@ bool RegisterBankInfo::ValueMapping::verify(unsigned ExpectedBitWidth) const { OrigValueBitWidth = std::max(OrigValueBitWidth, PartMap.getHighBitIdx() + 1); } - assert(OrigValueBitWidth == ExpectedBitWidth && "BitWidth does not match"); + assert(OrigValueBitWidth >= MeaningFulBitWidth && + "Meaningful bits not covered by the mapping"); APInt ValueMask(OrigValueBitWidth, 0); for (const RegisterBankInfo::PartialMapping &PartMap : *this) { // Check that the union of the partial mappings covers the whole value, -- 2.50.1