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