1 //===- llvm/CodeGen/GlobalISel/RegisterBankInfo.h ---------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file This file declares the API for the register bank info. 11 /// This API is responsible for handling the register banks. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CODEGEN_GLOBALISEL_REGISTERBANKINFO_H 16 #define LLVM_CODEGEN_GLOBALISEL_REGISTERBANKINFO_H 17 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/Hashing.h" 20 #include "llvm/ADT/SmallVector.h" 21 #include "llvm/ADT/iterator_range.h" 22 #include "llvm/Support/ErrorHandling.h" 23 #include <cassert> 24 #include <initializer_list> 25 #include <memory> 26 27 namespace llvm { 28 29 class MachineInstr; 30 class MachineRegisterInfo; 31 class raw_ostream; 32 class RegisterBank; 33 class TargetInstrInfo; 34 class TargetRegisterClass; 35 class TargetRegisterInfo; 36 37 /// Holds all the information related to register banks. 38 class RegisterBankInfo { 39 public: 40 /// Helper struct that represents how a value is partially mapped 41 /// into a register. 42 /// The StartIdx and Length represent what region of the orginal 43 /// value this partial mapping covers. 44 /// This can be represented as a Mask of contiguous bit starting 45 /// at StartIdx bit and spanning Length bits. 46 /// StartIdx is the number of bits from the less significant bits. 47 struct PartialMapping { 48 /// Number of bits at which this partial mapping starts in the 49 /// original value. The bits are counted from less significant 50 /// bits to most significant bits. 51 unsigned StartIdx; 52 53 /// Length of this mapping in bits. This is how many bits this 54 /// partial mapping covers in the original value: 55 /// from StartIdx to StartIdx + Length -1. 56 unsigned Length; 57 58 /// Register bank where the partial value lives. 59 const RegisterBank *RegBank; 60 61 PartialMapping() = default; 62 63 /// Provide a shortcut for quickly building PartialMapping. PartialMappingPartialMapping64 PartialMapping(unsigned StartIdx, unsigned Length, 65 const RegisterBank &RegBank) 66 : StartIdx(StartIdx), Length(Length), RegBank(&RegBank) {} 67 68 /// \return the index of in the original value of the most 69 /// significant bit that this partial mapping covers. getHighBitIdxPartialMapping70 unsigned getHighBitIdx() const { return StartIdx + Length - 1; } 71 72 /// Print this partial mapping on dbgs() stream. 73 void dump() const; 74 75 /// Print this partial mapping on \p OS; 76 void print(raw_ostream &OS) const; 77 78 /// Check that the Mask is compatible with the RegBank. 79 /// Indeed, if the RegBank cannot accomadate the "active bits" of the mask, 80 /// there is no way this mapping is valid. 81 /// 82 /// \note This method does not check anything when assertions are disabled. 83 /// 84 /// \return True is the check was successful. 85 bool verify() const; 86 }; 87 88 /// Helper struct that represents how a value is mapped through 89 /// different register banks. 90 /// 91 /// \note: So far we do not have any users of the complex mappings 92 /// (mappings with more than one partial mapping), but when we do, 93 /// we would have needed to duplicate partial mappings. 94 /// The alternative could be to use an array of pointers of partial 95 /// mapping (i.e., PartialMapping **BreakDown) and duplicate the 96 /// pointers instead. 97 /// 98 /// E.g., 99 /// Let say we have a 32-bit add and a <2 x 32-bit> vadd. We 100 /// can expand the 101 /// <2 x 32-bit> add into 2 x 32-bit add. 102 /// 103 /// Currently the TableGen-like file would look like: 104 /// \code 105 /// PartialMapping[] = { 106 /// /*32-bit add*/ {0, 32, GPR}, 107 /// /*2x32-bit add*/ {0, 32, GPR}, {0, 32, GPR}, // <-- Same entry 3x 108 /// /*<2x32-bit> vadd {0, 64, VPR} 109 /// }; // PartialMapping duplicated. 110 /// 111 /// ValueMapping[] { 112 /// /*plain 32-bit add*/ {&PartialMapping[0], 1}, 113 /// /*expanded vadd on 2xadd*/ {&PartialMapping[1], 2}, 114 /// /*plain <2x32-bit> vadd*/ {&PartialMapping[3], 1} 115 /// }; 116 /// \endcode 117 /// 118 /// With the array of pointer, we would have: 119 /// \code 120 /// PartialMapping[] = { 121 /// /*32-bit add*/ {0, 32, GPR}, 122 /// /*<2x32-bit> vadd {0, 64, VPR} 123 /// }; // No more duplication. 124 /// 125 /// BreakDowns[] = { 126 /// /*AddBreakDown*/ &PartialMapping[0], 127 /// /*2xAddBreakDown*/ &PartialMapping[0], &PartialMapping[0], 128 /// /*VAddBreakDown*/ &PartialMapping[1] 129 /// }; // Addresses of PartialMapping duplicated (smaller). 130 /// 131 /// ValueMapping[] { 132 /// /*plain 32-bit add*/ {&BreakDowns[0], 1}, 133 /// /*expanded vadd on 2xadd*/ {&BreakDowns[1], 2}, 134 /// /*plain <2x32-bit> vadd*/ {&BreakDowns[3], 1} 135 /// }; 136 /// \endcode 137 /// 138 /// Given that a PartialMapping is actually small, the code size 139 /// impact is actually a degradation. Moreover the compile time will 140 /// be hit by the additional indirection. 141 /// If PartialMapping gets bigger we may reconsider. 142 struct ValueMapping { 143 /// How the value is broken down between the different register banks. 144 const PartialMapping *BreakDown; 145 146 /// Number of partial mapping to break down this value. 147 unsigned NumBreakDowns; 148 149 /// The default constructor creates an invalid (isValid() == false) 150 /// instance. ValueMappingValueMapping151 ValueMapping() : ValueMapping(nullptr, 0) {} 152 153 /// Initialize a ValueMapping with the given parameter. 154 /// \p BreakDown needs to have a life time at least as long 155 /// as this instance. ValueMappingValueMapping156 ValueMapping(const PartialMapping *BreakDown, unsigned NumBreakDowns) 157 : BreakDown(BreakDown), NumBreakDowns(NumBreakDowns) {} 158 159 /// Iterators through the PartialMappings. beginValueMapping160 const PartialMapping *begin() const { return BreakDown; } endValueMapping161 const PartialMapping *end() const { return BreakDown + NumBreakDowns; } 162 163 /// Check if this ValueMapping is valid. isValidValueMapping164 bool isValid() const { return BreakDown && NumBreakDowns; } 165 166 /// Verify that this mapping makes sense for a value of 167 /// \p MeaningfulBitWidth. 168 /// \note This method does not check anything when assertions are disabled. 169 /// 170 /// \return True is the check was successful. 171 bool verify(unsigned MeaningfulBitWidth) const; 172 173 /// Print this on dbgs() stream. 174 void dump() const; 175 176 /// Print this on \p OS; 177 void print(raw_ostream &OS) const; 178 }; 179 180 /// Helper class that represents how the value of an instruction may be 181 /// mapped and what is the related cost of such mapping. 182 class InstructionMapping { 183 /// Identifier of the mapping. 184 /// This is used to communicate between the target and the optimizers 185 /// which mapping should be realized. 186 unsigned ID = InvalidMappingID; 187 188 /// Cost of this mapping. 189 unsigned Cost = 0; 190 191 /// Mapping of all the operands. 192 const ValueMapping *OperandsMapping; 193 194 /// Number of operands. 195 unsigned NumOperands = 0; 196 getOperandMapping(unsigned i)197 const ValueMapping &getOperandMapping(unsigned i) { 198 assert(i < getNumOperands() && "Out of bound operand"); 199 return OperandsMapping[i]; 200 } 201 202 public: 203 /// Constructor for the mapping of an instruction. 204 /// \p NumOperands must be equal to number of all the operands of 205 /// the related instruction. 206 /// The rationale is that it is more efficient for the optimizers 207 /// to be able to assume that the mapping of the ith operand is 208 /// at the index i. 209 /// 210 /// \pre ID != InvalidMappingID InstructionMapping(unsigned ID,unsigned Cost,const ValueMapping * OperandsMapping,unsigned NumOperands)211 InstructionMapping(unsigned ID, unsigned Cost, 212 const ValueMapping *OperandsMapping, 213 unsigned NumOperands) 214 : ID(ID), Cost(Cost), OperandsMapping(OperandsMapping), 215 NumOperands(NumOperands) { 216 assert(getID() != InvalidMappingID && 217 "Use the default constructor for invalid mapping"); 218 } 219 220 /// Default constructor. 221 /// Use this constructor to express that the mapping is invalid. 222 InstructionMapping() = default; 223 224 /// Get the cost. getCost()225 unsigned getCost() const { return Cost; } 226 227 /// Get the ID. getID()228 unsigned getID() const { return ID; } 229 230 /// Get the number of operands. getNumOperands()231 unsigned getNumOperands() const { return NumOperands; } 232 233 /// Get the value mapping of the ith operand. 234 /// \pre The mapping for the ith operand has been set. 235 /// \pre The ith operand is a register. getOperandMapping(unsigned i)236 const ValueMapping &getOperandMapping(unsigned i) const { 237 const ValueMapping &ValMapping = 238 const_cast<InstructionMapping *>(this)->getOperandMapping(i); 239 return ValMapping; 240 } 241 242 /// Set the mapping for all the operands. 243 /// In other words, OpdsMapping should hold at least getNumOperands 244 /// ValueMapping. setOperandsMapping(const ValueMapping * OpdsMapping)245 void setOperandsMapping(const ValueMapping *OpdsMapping) { 246 OperandsMapping = OpdsMapping; 247 } 248 249 /// Check whether this object is valid. 250 /// This is a lightweight check for obvious wrong instance. isValid()251 bool isValid() const { 252 return getID() != InvalidMappingID && OperandsMapping; 253 } 254 255 /// Verifiy that this mapping makes sense for \p MI. 256 /// \pre \p MI must be connected to a MachineFunction. 257 /// 258 /// \note This method does not check anything when assertions are disabled. 259 /// 260 /// \return True is the check was successful. 261 bool verify(const MachineInstr &MI) const; 262 263 /// Print this on dbgs() stream. 264 void dump() const; 265 266 /// Print this on \p OS; 267 void print(raw_ostream &OS) const; 268 }; 269 270 /// Convenient type to represent the alternatives for mapping an 271 /// instruction. 272 /// \todo When we move to TableGen this should be an array ref. 273 using InstructionMappings = SmallVector<const InstructionMapping *, 4>; 274 275 /// Helper class used to get/create the virtual registers that will be used 276 /// to replace the MachineOperand when applying a mapping. 277 class OperandsMapper { 278 /// The OpIdx-th cell contains the index in NewVRegs where the VRegs of the 279 /// OpIdx-th operand starts. -1 means we do not have such mapping yet. 280 /// Note: We use a SmallVector to avoid heap allocation for most cases. 281 SmallVector<int, 8> OpToNewVRegIdx; 282 283 /// Hold the registers that will be used to map MI with InstrMapping. 284 SmallVector<unsigned, 8> NewVRegs; 285 286 /// Current MachineRegisterInfo, used to create new virtual registers. 287 MachineRegisterInfo &MRI; 288 289 /// Instruction being remapped. 290 MachineInstr &MI; 291 292 /// New mapping of the instruction. 293 const InstructionMapping &InstrMapping; 294 295 /// Constant value identifying that the index in OpToNewVRegIdx 296 /// for an operand has not been set yet. 297 static const int DontKnowIdx; 298 299 /// Get the range in NewVRegs to store all the partial 300 /// values for the \p OpIdx-th operand. 301 /// 302 /// \return The iterator range for the space created. 303 // 304 /// \pre getMI().getOperand(OpIdx).isReg() 305 iterator_range<SmallVectorImpl<unsigned>::iterator> 306 getVRegsMem(unsigned OpIdx); 307 308 /// Get the end iterator for a range starting at \p StartIdx and 309 /// spannig \p NumVal in NewVRegs. 310 /// \pre StartIdx + NumVal <= NewVRegs.size() 311 SmallVectorImpl<unsigned>::const_iterator 312 getNewVRegsEnd(unsigned StartIdx, unsigned NumVal) const; 313 SmallVectorImpl<unsigned>::iterator getNewVRegsEnd(unsigned StartIdx, 314 unsigned NumVal); 315 316 public: 317 /// Create an OperandsMapper that will hold the information to apply \p 318 /// InstrMapping to \p MI. 319 /// \pre InstrMapping.verify(MI) 320 OperandsMapper(MachineInstr &MI, const InstructionMapping &InstrMapping, 321 MachineRegisterInfo &MRI); 322 323 /// \name Getters. 324 /// @{ 325 /// The MachineInstr being remapped. getMI()326 MachineInstr &getMI() const { return MI; } 327 328 /// The final mapping of the instruction. getInstrMapping()329 const InstructionMapping &getInstrMapping() const { return InstrMapping; } 330 331 /// The MachineRegisterInfo we used to realize the mapping. getMRI()332 MachineRegisterInfo &getMRI() const { return MRI; } 333 /// @} 334 335 /// Create as many new virtual registers as needed for the mapping of the \p 336 /// OpIdx-th operand. 337 /// The number of registers is determined by the number of breakdown for the 338 /// related operand in the instruction mapping. 339 /// The type of the new registers is a plain scalar of the right size. 340 /// The proper type is expected to be set when the mapping is applied to 341 /// the instruction(s) that realizes the mapping. 342 /// 343 /// \pre getMI().getOperand(OpIdx).isReg() 344 /// 345 /// \post All the partial mapping of the \p OpIdx-th operand have been 346 /// assigned a new virtual register. 347 void createVRegs(unsigned OpIdx); 348 349 /// Set the virtual register of the \p PartialMapIdx-th partial mapping of 350 /// the OpIdx-th operand to \p NewVReg. 351 /// 352 /// \pre getMI().getOperand(OpIdx).isReg() 353 /// \pre getInstrMapping().getOperandMapping(OpIdx).BreakDown.size() > 354 /// PartialMapIdx 355 /// \pre NewReg != 0 356 /// 357 /// \post the \p PartialMapIdx-th register of the value mapping of the \p 358 /// OpIdx-th operand has been set. 359 void setVRegs(unsigned OpIdx, unsigned PartialMapIdx, unsigned NewVReg); 360 361 /// Get all the virtual registers required to map the \p OpIdx-th operand of 362 /// the instruction. 363 /// 364 /// This return an empty range when createVRegs or setVRegs has not been 365 /// called. 366 /// The iterator may be invalidated by a call to setVRegs or createVRegs. 367 /// 368 /// When \p ForDebug is true, we will not check that the list of new virtual 369 /// registers does not contain uninitialized values. 370 /// 371 /// \pre getMI().getOperand(OpIdx).isReg() 372 /// \pre ForDebug || All partial mappings have been set a register 373 iterator_range<SmallVectorImpl<unsigned>::const_iterator> 374 getVRegs(unsigned OpIdx, bool ForDebug = false) const; 375 376 /// Print this operands mapper on dbgs() stream. 377 void dump() const; 378 379 /// Print this operands mapper on \p OS stream. 380 void print(raw_ostream &OS, bool ForDebug = false) const; 381 }; 382 383 protected: 384 /// Hold the set of supported register banks. 385 RegisterBank **RegBanks; 386 387 /// Total number of register banks. 388 unsigned NumRegBanks; 389 390 /// Keep dynamically allocated PartialMapping in a separate map. 391 /// This shouldn't be needed when everything gets TableGen'ed. 392 mutable DenseMap<unsigned, std::unique_ptr<const PartialMapping>> 393 MapOfPartialMappings; 394 395 /// Keep dynamically allocated ValueMapping in a separate map. 396 /// This shouldn't be needed when everything gets TableGen'ed. 397 mutable DenseMap<unsigned, std::unique_ptr<const ValueMapping>> 398 MapOfValueMappings; 399 400 /// Keep dynamically allocated array of ValueMapping in a separate map. 401 /// This shouldn't be needed when everything gets TableGen'ed. 402 mutable DenseMap<unsigned, std::unique_ptr<ValueMapping[]>> 403 MapOfOperandsMappings; 404 405 /// Keep dynamically allocated InstructionMapping in a separate map. 406 /// This shouldn't be needed when everything gets TableGen'ed. 407 mutable DenseMap<unsigned, std::unique_ptr<const InstructionMapping>> 408 MapOfInstructionMappings; 409 410 /// Getting the minimal register class of a physreg is expensive. 411 /// Cache this information as we get it. 412 mutable DenseMap<unsigned, const TargetRegisterClass *> PhysRegMinimalRCs; 413 414 /// Create a RegisterBankInfo that can accommodate up to \p NumRegBanks 415 /// RegisterBank instances. 416 RegisterBankInfo(RegisterBank **RegBanks, unsigned NumRegBanks); 417 418 /// This constructor is meaningless. 419 /// It just provides a default constructor that can be used at link time 420 /// when GlobalISel is not built. 421 /// That way, targets can still inherit from this class without doing 422 /// crazy gymnastic to avoid link time failures. 423 /// \note That works because the constructor is inlined. RegisterBankInfo()424 RegisterBankInfo() { 425 llvm_unreachable("This constructor should not be executed"); 426 } 427 428 /// Get the register bank identified by \p ID. getRegBank(unsigned ID)429 RegisterBank &getRegBank(unsigned ID) { 430 assert(ID < getNumRegBanks() && "Accessing an unknown register bank"); 431 return *RegBanks[ID]; 432 } 433 434 /// Get the MinimalPhysRegClass for Reg. 435 /// \pre Reg is a physical register. 436 const TargetRegisterClass & 437 getMinimalPhysRegClass(unsigned Reg, const TargetRegisterInfo &TRI) const; 438 439 /// Try to get the mapping of \p MI. 440 /// See getInstrMapping for more details on what a mapping represents. 441 /// 442 /// Unlike getInstrMapping the returned InstructionMapping may be invalid 443 /// (isValid() == false). 444 /// This means that the target independent code is not smart enough 445 /// to get the mapping of \p MI and thus, the target has to provide the 446 /// information for \p MI. 447 /// 448 /// This implementation is able to get the mapping of: 449 /// - Target specific instructions by looking at the encoding constraints. 450 /// - Any instruction if all the register operands have already been assigned 451 /// a register, a register class, or a register bank. 452 /// - Copies and phis if at least one of the operands has been assigned a 453 /// register, a register class, or a register bank. 454 /// In other words, this method will likely fail to find a mapping for 455 /// any generic opcode that has not been lowered by target specific code. 456 const InstructionMapping &getInstrMappingImpl(const MachineInstr &MI) const; 457 458 /// Get the uniquely generated PartialMapping for the 459 /// given arguments. 460 const PartialMapping &getPartialMapping(unsigned StartIdx, unsigned Length, 461 const RegisterBank &RegBank) const; 462 463 /// \name Methods to get a uniquely generated ValueMapping. 464 /// @{ 465 466 /// The most common ValueMapping consists of a single PartialMapping. 467 /// Feature a method for that. 468 const ValueMapping &getValueMapping(unsigned StartIdx, unsigned Length, 469 const RegisterBank &RegBank) const; 470 471 /// Get the ValueMapping for the given arguments. 472 const ValueMapping &getValueMapping(const PartialMapping *BreakDown, 473 unsigned NumBreakDowns) const; 474 /// @} 475 476 /// \name Methods to get a uniquely generated array of ValueMapping. 477 /// @{ 478 479 /// Get the uniquely generated array of ValueMapping for the 480 /// elements of between \p Begin and \p End. 481 /// 482 /// Elements that are nullptr will be replaced by 483 /// invalid ValueMapping (ValueMapping::isValid == false). 484 /// 485 /// \pre The pointers on ValueMapping between \p Begin and \p End 486 /// must uniquely identify a ValueMapping. Otherwise, there is no 487 /// guarantee that the return instance will be unique, i.e., another 488 /// OperandsMapping could have the same content. 489 template <typename Iterator> 490 const ValueMapping *getOperandsMapping(Iterator Begin, Iterator End) const; 491 492 /// Get the uniquely generated array of ValueMapping for the 493 /// elements of \p OpdsMapping. 494 /// 495 /// Elements of \p OpdsMapping that are nullptr will be replaced by 496 /// invalid ValueMapping (ValueMapping::isValid == false). 497 const ValueMapping *getOperandsMapping( 498 const SmallVectorImpl<const ValueMapping *> &OpdsMapping) const; 499 500 /// Get the uniquely generated array of ValueMapping for the 501 /// given arguments. 502 /// 503 /// Arguments that are nullptr will be replaced by invalid 504 /// ValueMapping (ValueMapping::isValid == false). 505 const ValueMapping *getOperandsMapping( 506 std::initializer_list<const ValueMapping *> OpdsMapping) const; 507 /// @} 508 509 /// \name Methods to get a uniquely generated InstructionMapping. 510 /// @{ 511 512 private: 513 /// Method to get a uniquely generated InstructionMapping. 514 const InstructionMapping & 515 getInstructionMappingImpl(bool IsInvalid, unsigned ID = InvalidMappingID, 516 unsigned Cost = 0, 517 const ValueMapping *OperandsMapping = nullptr, 518 unsigned NumOperands = 0) const; 519 520 public: 521 /// Method to get a uniquely generated InstructionMapping. 522 const InstructionMapping & getInstructionMapping(unsigned ID,unsigned Cost,const ValueMapping * OperandsMapping,unsigned NumOperands)523 getInstructionMapping(unsigned ID, unsigned Cost, 524 const ValueMapping *OperandsMapping, 525 unsigned NumOperands) const { 526 return getInstructionMappingImpl(/*IsInvalid*/ false, ID, Cost, 527 OperandsMapping, NumOperands); 528 } 529 530 /// Method to get a uniquely generated invalid InstructionMapping. getInvalidInstructionMapping()531 const InstructionMapping &getInvalidInstructionMapping() const { 532 return getInstructionMappingImpl(/*IsInvalid*/ true); 533 } 534 /// @} 535 536 /// Get the register bank for the \p OpIdx-th operand of \p MI form 537 /// the encoding constraints, if any. 538 /// 539 /// \return A register bank that covers the register class of the 540 /// related encoding constraints or nullptr if \p MI did not provide 541 /// enough information to deduce it. 542 const RegisterBank * 543 getRegBankFromConstraints(const MachineInstr &MI, unsigned OpIdx, 544 const TargetInstrInfo &TII, 545 const TargetRegisterInfo &TRI) const; 546 547 /// Helper method to apply something that is like the default mapping. 548 /// Basically, that means that \p OpdMapper.getMI() is left untouched 549 /// aside from the reassignment of the register operand that have been 550 /// remapped. 551 /// 552 /// The type of all the new registers that have been created by the 553 /// mapper are properly remapped to the type of the original registers 554 /// they replace. In other words, the semantic of the instruction does 555 /// not change, only the register banks. 556 /// 557 /// If the mapping of one of the operand spans several registers, this 558 /// method will abort as this is not like a default mapping anymore. 559 /// 560 /// \pre For OpIdx in {0..\p OpdMapper.getMI().getNumOperands()) 561 /// the range OpdMapper.getVRegs(OpIdx) is empty or of size 1. 562 static void applyDefaultMapping(const OperandsMapper &OpdMapper); 563 564 /// See ::applyMapping. applyMappingImpl(const OperandsMapper & OpdMapper)565 virtual void applyMappingImpl(const OperandsMapper &OpdMapper) const { 566 llvm_unreachable("The target has to implement that part"); 567 } 568 569 public: 570 virtual ~RegisterBankInfo() = default; 571 572 /// Get the register bank identified by \p ID. getRegBank(unsigned ID)573 const RegisterBank &getRegBank(unsigned ID) const { 574 return const_cast<RegisterBankInfo *>(this)->getRegBank(ID); 575 } 576 577 /// Get the register bank of \p Reg. 578 /// If Reg has not been assigned a register, a register class, 579 /// or a register bank, then this returns nullptr. 580 /// 581 /// \pre Reg != 0 (NoRegister) 582 const RegisterBank *getRegBank(unsigned Reg, const MachineRegisterInfo &MRI, 583 const TargetRegisterInfo &TRI) const; 584 585 /// Get the total number of register banks. getNumRegBanks()586 unsigned getNumRegBanks() const { return NumRegBanks; } 587 588 /// Get a register bank that covers \p RC. 589 /// 590 /// \pre \p RC is a user-defined register class (as opposed as one 591 /// generated by TableGen). 592 /// 593 /// \note The mapping RC -> RegBank could be built while adding the 594 /// coverage for the register banks. However, we do not do it, because, 595 /// at least for now, we only need this information for register classes 596 /// that are used in the description of instruction. In other words, 597 /// there are just a handful of them and we do not want to waste space. 598 /// 599 /// \todo This should be TableGen'ed. 600 virtual const RegisterBank & getRegBankFromRegClass(const TargetRegisterClass & RC)601 getRegBankFromRegClass(const TargetRegisterClass &RC) const { 602 llvm_unreachable("The target must override this method"); 603 } 604 605 /// Get the cost of a copy from \p B to \p A, or put differently, 606 /// get the cost of A = COPY B. Since register banks may cover 607 /// different size, \p Size specifies what will be the size in bits 608 /// that will be copied around. 609 /// 610 /// \note Since this is a copy, both registers have the same size. copyCost(const RegisterBank & A,const RegisterBank & B,unsigned Size)611 virtual unsigned copyCost(const RegisterBank &A, const RegisterBank &B, 612 unsigned Size) const { 613 // Optimistically assume that copies are coalesced. I.e., when 614 // they are on the same bank, they are free. 615 // Otherwise assume a non-zero cost of 1. The targets are supposed 616 // to override that properly anyway if they care. 617 return &A != &B; 618 } 619 620 /// Constrain the (possibly generic) virtual register \p Reg to \p RC. 621 /// 622 /// \pre \p Reg is a virtual register that either has a bank or a class. 623 /// \returns The constrained register class, or nullptr if there is none. 624 /// \note This is a generic variant of MachineRegisterInfo::constrainRegClass 625 /// \note Use MachineRegisterInfo::constrainRegAttrs instead for any non-isel 626 /// purpose, including non-select passes of GlobalISel 627 static const TargetRegisterClass * 628 constrainGenericRegister(unsigned Reg, const TargetRegisterClass &RC, 629 MachineRegisterInfo &MRI); 630 631 /// Identifier used when the related instruction mapping instance 632 /// is generated by target independent code. 633 /// Make sure not to use that identifier to avoid possible collision. 634 static const unsigned DefaultMappingID; 635 636 /// Identifier used when the related instruction mapping instance 637 /// is generated by the default constructor. 638 /// Make sure not to use that identifier. 639 static const unsigned InvalidMappingID; 640 641 /// Get the mapping of the different operands of \p MI 642 /// on the register bank. 643 /// This mapping should be the direct translation of \p MI. 644 /// In other words, when \p MI is mapped with the returned mapping, 645 /// only the register banks of the operands of \p MI need to be updated. 646 /// In particular, neither the opcode nor the type of \p MI needs to be 647 /// updated for this direct mapping. 648 /// 649 /// The target independent implementation gives a mapping based on 650 /// the register classes for the target specific opcode. 651 /// It uses the ID RegisterBankInfo::DefaultMappingID for that mapping. 652 /// Make sure you do not use that ID for the alternative mapping 653 /// for MI. See getInstrAlternativeMappings for the alternative 654 /// mappings. 655 /// 656 /// For instance, if \p MI is a vector add, the mapping should 657 /// not be a scalarization of the add. 658 /// 659 /// \post returnedVal.verify(MI). 660 /// 661 /// \note If returnedVal does not verify MI, this would probably mean 662 /// that the target does not support that instruction. 663 virtual const InstructionMapping & 664 getInstrMapping(const MachineInstr &MI) const; 665 666 /// Get the alternative mappings for \p MI. 667 /// Alternative in the sense different from getInstrMapping. 668 virtual InstructionMappings 669 getInstrAlternativeMappings(const MachineInstr &MI) const; 670 671 /// Get the possible mapping for \p MI. 672 /// A mapping defines where the different operands may live and at what cost. 673 /// For instance, let us consider: 674 /// v0(16) = G_ADD <2 x i8> v1, v2 675 /// The possible mapping could be: 676 /// 677 /// {/*ID*/VectorAdd, /*Cost*/1, /*v0*/{(0xFFFF, VPR)}, /*v1*/{(0xFFFF, VPR)}, 678 /// /*v2*/{(0xFFFF, VPR)}} 679 /// {/*ID*/ScalarAddx2, /*Cost*/2, /*v0*/{(0x00FF, GPR),(0xFF00, GPR)}, 680 /// /*v1*/{(0x00FF, GPR),(0xFF00, GPR)}, 681 /// /*v2*/{(0x00FF, GPR),(0xFF00, GPR)}} 682 /// 683 /// \note The first alternative of the returned mapping should be the 684 /// direct translation of \p MI current form. 685 /// 686 /// \post !returnedVal.empty(). 687 InstructionMappings getInstrPossibleMappings(const MachineInstr &MI) const; 688 689 /// Apply \p OpdMapper.getInstrMapping() to \p OpdMapper.getMI(). 690 /// After this call \p OpdMapper.getMI() may not be valid anymore. 691 /// \p OpdMapper.getInstrMapping().getID() carries the information of 692 /// what has been chosen to map \p OpdMapper.getMI(). This ID is set 693 /// by the various getInstrXXXMapping method. 694 /// 695 /// Therefore, getting the mapping and applying it should be kept in 696 /// sync. applyMapping(const OperandsMapper & OpdMapper)697 void applyMapping(const OperandsMapper &OpdMapper) const { 698 // The only mapping we know how to handle is the default mapping. 699 if (OpdMapper.getInstrMapping().getID() == DefaultMappingID) 700 return applyDefaultMapping(OpdMapper); 701 // For other mapping, the target needs to do the right thing. 702 // If that means calling applyDefaultMapping, fine, but this 703 // must be explicitly stated. 704 applyMappingImpl(OpdMapper); 705 } 706 707 /// Get the size in bits of \p Reg. 708 /// Utility method to get the size of any registers. Unlike 709 /// MachineRegisterInfo::getSize, the register does not need to be a 710 /// virtual register. 711 /// 712 /// \pre \p Reg != 0 (NoRegister). 713 unsigned getSizeInBits(unsigned Reg, const MachineRegisterInfo &MRI, 714 const TargetRegisterInfo &TRI) const; 715 716 /// Check that information hold by this instance make sense for the 717 /// given \p TRI. 718 /// 719 /// \note This method does not check anything when assertions are disabled. 720 /// 721 /// \return True is the check was successful. 722 bool verify(const TargetRegisterInfo &TRI) const; 723 }; 724 725 inline raw_ostream & 726 operator<<(raw_ostream &OS, 727 const RegisterBankInfo::PartialMapping &PartMapping) { 728 PartMapping.print(OS); 729 return OS; 730 } 731 732 inline raw_ostream & 733 operator<<(raw_ostream &OS, const RegisterBankInfo::ValueMapping &ValMapping) { 734 ValMapping.print(OS); 735 return OS; 736 } 737 738 inline raw_ostream & 739 operator<<(raw_ostream &OS, 740 const RegisterBankInfo::InstructionMapping &InstrMapping) { 741 InstrMapping.print(OS); 742 return OS; 743 } 744 745 inline raw_ostream & 746 operator<<(raw_ostream &OS, const RegisterBankInfo::OperandsMapper &OpdMapper) { 747 OpdMapper.print(OS, /*ForDebug*/ false); 748 return OS; 749 } 750 751 /// Hashing function for PartialMapping. 752 /// It is required for the hashing of ValueMapping. 753 hash_code hash_value(const RegisterBankInfo::PartialMapping &PartMapping); 754 755 } // end namespace llvm 756 757 #endif // LLVM_CODEGEN_GLOBALISEL_REGISTERBANKINFO_H 758