From df4aee09f88c10856e970a2906ba1b2c9b1fc7bd Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Wed, 6 Apr 2016 18:24:34 +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: 265581 --- 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 f78df07..ff57905 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 1a4ce00..8287a15 100644 --- a/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp @@ -30,6 +30,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