[RegisterBankInfo] Implement the verify method for the ValueMapping helper class.
authorQuentin Colombet <qcolombet@apple.com>
Wed, 6 Apr 2016 16:40:23 +0000 (16:40 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Wed, 6 Apr 2016 16:40:23 +0000 (16:40 +0000)
The method checks that the value is fully defined accross the different partial
mappings and that the partial mappings are compatible between each other.

llvm-svn: 265556

llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h
llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp

index 6ec3eea..5932d34 100644 (file)
@@ -64,8 +64,8 @@ public:
   struct ValueMapping {
     /// How the value is broken down between the different register banks.
     SmallVector<PartialMapping, 2> BreakDown;
-    /// Verify that this mapping makes sense.
-    void verify() const;
+    /// Verify that this mapping makes sense for a value of \p ExpectedBitWidth.
+    void verify(unsigned ExpectedBitWidth) const;
   };
 
   /// Helper class that represents how the value of an instruction may be
index ef8cbea..b07688a 100644 (file)
@@ -210,10 +210,22 @@ void RegisterBankInfo::PartialMapping::print(raw_ostream &OS) const {
     OS << "nullptr";
 }
 
-void RegisterBankInfo::ValueMapping::verify() const {
-  // Check that all the partial mapping have the same bitwidth.
-  // Check that the union of the partial mappings covers the whole value.
-  // Check that each register bank is big enough to hold the partial value.
+void RegisterBankInfo::ValueMapping::verify(unsigned ExpectedBitWidth) const {
+  assert(!BreakDown.empty() && "Value mapped nowhere?!");
+  unsigned ValueBitWidth = BreakDown.back().Mask.getBitWidth();
+  assert(ValueBitWidth == ExpectedBitWidth && "BitWidth does not match");
+  APInt ValueMask(ValueBitWidth, 0);
+  for (const RegisterBankInfo::PartialMapping &PartMap : BreakDown) {
+    // Check that all the partial mapping have the same bitwidth.
+    assert(PartMap.Mask.getBitWidth() == ValueBitWidth &&
+           "Value does not have the same size accross the partial mappings");
+    // Check that the union of the partial mappings covers the whole value.
+    ValueMask |= PartMap.Mask;
+    // Check that each register bank is big enough to hold the partial value:
+    // this check is done by PartialMapping::verify
+    PartMap.verify();
+  }
+  assert(ValueMask.isAllOnesValue() && "Value is not fully mapped");
 }
 
 void RegisterBankInfo::InstructionMapping::verify(