From 5b7ba5092c26b70057251af965ba7a850262e993 Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Thu, 7 Apr 2016 17:30:18 +0000 Subject: [PATCH] [RegisterBankInfo] Provide a default constructor for InstructionMapping helper class. The default constructor creates invalid (isValid() == false) instances and may be used to communicate that a mapping was not found. llvm-svn: 265699 --- llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h | 17 +++++++++++++++++ llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp | 1 + 2 files changed, 18 insertions(+) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h index 9077758..e510975 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h @@ -96,11 +96,19 @@ public: /// The rationale is that it is more efficient for the optimizers /// to be able to assume that the mapping of the ith operand is /// at the index i. + /// + /// \pre ID != InvalidMappingID InstructionMapping(unsigned ID, unsigned Cost, unsigned NumOperands) : ID(ID), Cost(Cost), NumOperands(NumOperands) { + assert(getID() != InvalidMappingID && + "Use the default constructor for invalid mapping"); OperandsMapping.reset(new ValueMapping[getNumOperands()]); } + /// Default constructor. + /// Use this constructor to express that the mapping is invalid. + InstructionMapping() : ID(InvalidMappingID), Cost(0), NumOperands(0) {} + /// Get the cost. unsigned getCost() const { return Cost; } @@ -120,6 +128,10 @@ public: getOperandMapping(i) = ValMapping; } + /// Check whether this object is valid. + /// This is a lightweight check for obvious wrong instance. + bool isValid() const { return getID() != InvalidMappingID; } + /// Verifiy that this mapping makes sense for \p MI. void verify(const MachineInstr &MI) const; }; @@ -224,6 +236,11 @@ public: /// Make sure not to use that identifier to avoid possible collision. static const unsigned DefaultMappingID; + /// Identifier used when the related instruction mapping instance + /// is generated by the default constructor. + /// Make sure not to use that identifier. + static const unsigned InvalidMappingID; + /// Get the mapping of the different operands of \p MI /// on the register bank. /// This mapping should be the direct translation of \p MI. diff --git a/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp b/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp index d8f97b1..a13d2a8 100644 --- a/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp @@ -31,6 +31,7 @@ using namespace llvm; const unsigned RegisterBankInfo::DefaultMappingID = UINT_MAX; +const unsigned RegisterBankInfo::InvalidMappingID = UINT_MAX - 1; /// Get the size in bits of the \p OpIdx-th operand of \p MI. /// -- 2.7.4