Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- llvm/CodeGen/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_REGISTERBANKINFO_H
15
#define LLVM_CODEGEN_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.
65
    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.
71
    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.
154
    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.
159
    ValueMapping(const PartialMapping *BreakDown, unsigned NumBreakDowns)
160
        : BreakDown(BreakDown), NumBreakDowns(NumBreakDowns) {}
161
 
162
    /// Iterators through the PartialMappings.
163
    const PartialMapping *begin() const { return BreakDown; }
164
    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.
171
    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
 
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.
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
    /// Default constructor.
223
    /// Use this constructor to express that the mapping is invalid.
224
    InstructionMapping() = default;
225
 
226
    /// Get the cost.
227
    unsigned getCost() const { return Cost; }
228
 
229
    /// Get the ID.
230
    unsigned getID() const { return ID; }
231
 
232
    /// Get the number of operands.
233
    unsigned getNumOperands() const { return NumOperands; }
234
 
235
    /// Get the value mapping of the ith operand.
236
    /// \pre The mapping for the ith operand has been set.
237
    /// \pre The ith operand is a register.
238
    const ValueMapping &getOperandMapping(unsigned i) const {
239
      const ValueMapping &ValMapping =
240
          const_cast<InstructionMapping *>(this)->getOperandMapping(i);
241
      return ValMapping;
242
    }
243
 
244
    /// Set the mapping for all the operands.
245
    /// In other words, OpdsMapping should hold at least getNumOperands
246
    /// ValueMapping.
247
    void setOperandsMapping(const ValueMapping *OpdsMapping) {
248
      OperandsMapping = OpdsMapping;
249
    }
250
 
251
    /// Check whether this object is valid.
252
    /// This is a lightweight check for obvious wrong instance.
253
    bool isValid() const {
254
      return getID() != InvalidMappingID && OperandsMapping;
255
    }
256
 
257
    /// Verifiy that this mapping makes sense for \p MI.
258
    /// \pre \p MI must be connected to a MachineFunction.
259
    ///
260
    /// \note This method does not check anything when assertions are disabled.
261
    ///
262
    /// \return True is the check was successful.
263
    bool verify(const MachineInstr &MI) const;
264
 
265
    /// Print this on dbgs() stream.
266
    void dump() const;
267
 
268
    /// Print this on \p OS;
269
    void print(raw_ostream &OS) const;
270
  };
271
 
272
  /// Convenient type to represent the alternatives for mapping an
273
  /// instruction.
274
  /// \todo When we move to TableGen this should be an array ref.
275
  using InstructionMappings = SmallVector<const InstructionMapping *, 4>;
276
 
277
  /// Helper class used to get/create the virtual registers that will be used
278
  /// to replace the MachineOperand when applying a mapping.
279
  class OperandsMapper {
280
    /// The OpIdx-th cell contains the index in NewVRegs where the VRegs of the
281
    /// OpIdx-th operand starts. -1 means we do not have such mapping yet.
282
    /// Note: We use a SmallVector to avoid heap allocation for most cases.
283
    SmallVector<int, 8> OpToNewVRegIdx;
284
 
285
    /// Hold the registers that will be used to map MI with InstrMapping.
286
    SmallVector<Register, 8> NewVRegs;
287
 
288
    /// Current MachineRegisterInfo, used to create new virtual registers.
289
    MachineRegisterInfo &MRI;
290
 
291
    /// Instruction being remapped.
292
    MachineInstr &MI;
293
 
294
    /// New mapping of the instruction.
295
    const InstructionMapping &InstrMapping;
296
 
297
    /// Constant value identifying that the index in OpToNewVRegIdx
298
    /// for an operand has not been set yet.
299
    static const int DontKnowIdx;
300
 
301
    /// Get the range in NewVRegs to store all the partial
302
    /// values for the \p OpIdx-th operand.
303
    ///
304
    /// \return The iterator range for the space created.
305
    //
306
    /// \pre getMI().getOperand(OpIdx).isReg()
307
    iterator_range<SmallVectorImpl<Register>::iterator>
308
    getVRegsMem(unsigned OpIdx);
309
 
310
    /// Get the end iterator for a range starting at \p StartIdx and
311
    /// spannig \p NumVal in NewVRegs.
312
    /// \pre StartIdx + NumVal <= NewVRegs.size()
313
    SmallVectorImpl<Register>::const_iterator
314
    getNewVRegsEnd(unsigned StartIdx, unsigned NumVal) const;
315
    SmallVectorImpl<Register>::iterator getNewVRegsEnd(unsigned StartIdx,
316
                                                       unsigned NumVal);
317
 
318
  public:
319
    /// Create an OperandsMapper that will hold the information to apply \p
320
    /// InstrMapping to \p MI.
321
    /// \pre InstrMapping.verify(MI)
322
    OperandsMapper(MachineInstr &MI, const InstructionMapping &InstrMapping,
323
                   MachineRegisterInfo &MRI);
324
 
325
    /// \name Getters.
326
    /// @{
327
    /// The MachineInstr being remapped.
328
    MachineInstr &getMI() const { return MI; }
329
 
330
    /// The final mapping of the instruction.
331
    const InstructionMapping &getInstrMapping() const { return InstrMapping; }
332
 
333
    /// The MachineRegisterInfo we used to realize the mapping.
334
    MachineRegisterInfo &getMRI() const { return MRI; }
335
    /// @}
336
 
337
    /// Create as many new virtual registers as needed for the mapping of the \p
338
    /// OpIdx-th operand.
339
    /// The number of registers is determined by the number of breakdown for the
340
    /// related operand in the instruction mapping.
341
    /// The type of the new registers is a plain scalar of the right size.
342
    /// The proper type is expected to be set when the mapping is applied to
343
    /// the instruction(s) that realizes the mapping.
344
    ///
345
    /// \pre getMI().getOperand(OpIdx).isReg()
346
    ///
347
    /// \post All the partial mapping of the \p OpIdx-th operand have been
348
    /// assigned a new virtual register.
349
    void createVRegs(unsigned OpIdx);
350
 
351
    /// Set the virtual register of the \p PartialMapIdx-th partial mapping of
352
    /// the OpIdx-th operand to \p NewVReg.
353
    ///
354
    /// \pre getMI().getOperand(OpIdx).isReg()
355
    /// \pre getInstrMapping().getOperandMapping(OpIdx).BreakDown.size() >
356
    /// PartialMapIdx
357
    /// \pre NewReg != 0
358
    ///
359
    /// \post the \p PartialMapIdx-th register of the value mapping of the \p
360
    /// OpIdx-th operand has been set.
361
    void setVRegs(unsigned OpIdx, unsigned PartialMapIdx, Register NewVReg);
362
 
363
    /// Get all the virtual registers required to map the \p OpIdx-th operand of
364
    /// the instruction.
365
    ///
366
    /// This return an empty range when createVRegs or setVRegs has not been
367
    /// called.
368
    /// The iterator may be invalidated by a call to setVRegs or createVRegs.
369
    ///
370
    /// When \p ForDebug is true, we will not check that the list of new virtual
371
    /// registers does not contain uninitialized values.
372
    ///
373
    /// \pre getMI().getOperand(OpIdx).isReg()
374
    /// \pre ForDebug || All partial mappings have been set a register
375
    iterator_range<SmallVectorImpl<Register>::const_iterator>
376
    getVRegs(unsigned OpIdx, bool ForDebug = false) const;
377
 
378
    /// Print this operands mapper on dbgs() stream.
379
    void dump() const;
380
 
381
    /// Print this operands mapper on \p OS stream.
382
    void print(raw_ostream &OS, bool ForDebug = false) const;
383
  };
384
 
385
protected:
386
  /// Hold the set of supported register banks.
387
  RegisterBank **RegBanks;
388
 
389
  /// Total number of register banks.
390
  unsigned NumRegBanks;
391
 
392
  /// Keep dynamically allocated PartialMapping in a separate map.
393
  /// This shouldn't be needed when everything gets TableGen'ed.
394
  mutable DenseMap<unsigned, std::unique_ptr<const PartialMapping>>
395
      MapOfPartialMappings;
396
 
397
  /// Keep dynamically allocated ValueMapping in a separate map.
398
  /// This shouldn't be needed when everything gets TableGen'ed.
399
  mutable DenseMap<unsigned, std::unique_ptr<const ValueMapping>>
400
      MapOfValueMappings;
401
 
402
  /// Keep dynamically allocated array of ValueMapping in a separate map.
403
  /// This shouldn't be needed when everything gets TableGen'ed.
404
  mutable DenseMap<unsigned, std::unique_ptr<ValueMapping[]>>
405
      MapOfOperandsMappings;
406
 
407
  /// Keep dynamically allocated InstructionMapping in a separate map.
408
  /// This shouldn't be needed when everything gets TableGen'ed.
409
  mutable DenseMap<unsigned, std::unique_ptr<const InstructionMapping>>
410
      MapOfInstructionMappings;
411
 
412
  /// Getting the minimal register class of a physreg is expensive.
413
  /// Cache this information as we get it.
414
  mutable DenseMap<unsigned, const TargetRegisterClass *> PhysRegMinimalRCs;
415
 
416
  /// Create a RegisterBankInfo that can accommodate up to \p NumRegBanks
417
  /// RegisterBank instances.
418
  RegisterBankInfo(RegisterBank **RegBanks, unsigned NumRegBanks);
419
 
420
  /// This constructor is meaningless.
421
  /// It just provides a default constructor that can be used at link time
422
  /// when GlobalISel is not built.
423
  /// That way, targets can still inherit from this class without doing
424
  /// crazy gymnastic to avoid link time failures.
425
  /// \note That works because the constructor is inlined.
426
  RegisterBankInfo() {
427
    llvm_unreachable("This constructor should not be executed");
428
  }
429
 
430
  /// Get the register bank identified by \p ID.
431
  RegisterBank &getRegBank(unsigned ID) {
432
    assert(ID < getNumRegBanks() && "Accessing an unknown register bank");
433
    return *RegBanks[ID];
434
  }
435
 
436
  /// Get the MinimalPhysRegClass for Reg.
437
  /// \pre Reg is a physical register.
438
  const TargetRegisterClass &
439
  getMinimalPhysRegClass(Register Reg, const TargetRegisterInfo &TRI) const;
440
 
441
  /// Try to get the mapping of \p MI.
442
  /// See getInstrMapping for more details on what a mapping represents.
443
  ///
444
  /// Unlike getInstrMapping the returned InstructionMapping may be invalid
445
  /// (isValid() == false).
446
  /// This means that the target independent code is not smart enough
447
  /// to get the mapping of \p MI and thus, the target has to provide the
448
  /// information for \p MI.
449
  ///
450
  /// This implementation is able to get the mapping of:
451
  /// - Target specific instructions by looking at the encoding constraints.
452
  /// - Any instruction if all the register operands have already been assigned
453
  ///   a register, a register class, or a register bank.
454
  /// - Copies and phis if at least one of the operands has been assigned a
455
  ///   register, a register class, or a register bank.
456
  /// In other words, this method will likely fail to find a mapping for
457
  /// any generic opcode that has not been lowered by target specific code.
458
  const InstructionMapping &getInstrMappingImpl(const MachineInstr &MI) const;
459
 
460
  /// Get the uniquely generated PartialMapping for the
461
  /// given arguments.
462
  const PartialMapping &getPartialMapping(unsigned StartIdx, unsigned Length,
463
                                          const RegisterBank &RegBank) const;
464
 
465
  /// \name Methods to get a uniquely generated ValueMapping.
466
  /// @{
467
 
468
  /// The most common ValueMapping consists of a single PartialMapping.
469
  /// Feature a method for that.
470
  const ValueMapping &getValueMapping(unsigned StartIdx, unsigned Length,
471
                                      const RegisterBank &RegBank) const;
472
 
473
  /// Get the ValueMapping for the given arguments.
474
  const ValueMapping &getValueMapping(const PartialMapping *BreakDown,
475
                                      unsigned NumBreakDowns) const;
476
  /// @}
477
 
478
  /// \name Methods to get a uniquely generated array of ValueMapping.
479
  /// @{
480
 
481
  /// Get the uniquely generated array of ValueMapping for the
482
  /// elements of between \p Begin and \p End.
483
  ///
484
  /// Elements that are nullptr will be replaced by
485
  /// invalid ValueMapping (ValueMapping::isValid == false).
486
  ///
487
  /// \pre The pointers on ValueMapping between \p Begin and \p End
488
  /// must uniquely identify a ValueMapping. Otherwise, there is no
489
  /// guarantee that the return instance will be unique, i.e., another
490
  /// OperandsMapping could have the same content.
491
  template <typename Iterator>
492
  const ValueMapping *getOperandsMapping(Iterator Begin, Iterator End) const;
493
 
494
  /// Get the uniquely generated array of ValueMapping for the
495
  /// elements of \p OpdsMapping.
496
  ///
497
  /// Elements of \p OpdsMapping that are nullptr will be replaced by
498
  /// invalid ValueMapping (ValueMapping::isValid == false).
499
  const ValueMapping *getOperandsMapping(
500
      const SmallVectorImpl<const ValueMapping *> &OpdsMapping) const;
501
 
502
  /// Get the uniquely generated array of ValueMapping for the
503
  /// given arguments.
504
  ///
505
  /// Arguments that are nullptr will be replaced by invalid
506
  /// ValueMapping (ValueMapping::isValid == false).
507
  const ValueMapping *getOperandsMapping(
508
      std::initializer_list<const ValueMapping *> OpdsMapping) const;
509
  /// @}
510
 
511
  /// \name Methods to get a uniquely generated InstructionMapping.
512
  /// @{
513
 
514
private:
515
  /// Method to get a uniquely generated InstructionMapping.
516
  const InstructionMapping &
517
  getInstructionMappingImpl(bool IsInvalid, unsigned ID = InvalidMappingID,
518
                            unsigned Cost = 0,
519
                            const ValueMapping *OperandsMapping = nullptr,
520
                            unsigned NumOperands = 0) const;
521
 
522
public:
523
  /// Method to get a uniquely generated InstructionMapping.
524
  const InstructionMapping &
525
  getInstructionMapping(unsigned ID, unsigned Cost,
526
                        const ValueMapping *OperandsMapping,
527
                        unsigned NumOperands) const {
528
    return getInstructionMappingImpl(/*IsInvalid*/ false, ID, Cost,
529
                                     OperandsMapping, NumOperands);
530
  }
531
 
532
  /// Method to get a uniquely generated invalid InstructionMapping.
533
  const InstructionMapping &getInvalidInstructionMapping() const {
534
    return getInstructionMappingImpl(/*IsInvalid*/ true);
535
  }
536
  /// @}
537
 
538
  /// Get the register bank for the \p OpIdx-th operand of \p MI form
539
  /// the encoding constraints, if any.
540
  ///
541
  /// \return A register bank that covers the register class of the
542
  /// related encoding constraints or nullptr if \p MI did not provide
543
  /// enough information to deduce it.
544
  const RegisterBank *
545
  getRegBankFromConstraints(const MachineInstr &MI, unsigned OpIdx,
546
                            const TargetInstrInfo &TII,
547
                            const MachineRegisterInfo &MRI) const;
548
 
549
  /// Helper method to apply something that is like the default mapping.
550
  /// Basically, that means that \p OpdMapper.getMI() is left untouched
551
  /// aside from the reassignment of the register operand that have been
552
  /// remapped.
553
  ///
554
  /// The type of all the new registers that have been created by the
555
  /// mapper are properly remapped to the type of the original registers
556
  /// they replace. In other words, the semantic of the instruction does
557
  /// not change, only the register banks.
558
  ///
559
  /// If the mapping of one of the operand spans several registers, this
560
  /// method will abort as this is not like a default mapping anymore.
561
  ///
562
  /// \pre For OpIdx in {0..\p OpdMapper.getMI().getNumOperands())
563
  ///        the range OpdMapper.getVRegs(OpIdx) is empty or of size 1.
564
  static void applyDefaultMapping(const OperandsMapper &OpdMapper);
565
 
566
  /// See ::applyMapping.
567
  virtual void applyMappingImpl(const OperandsMapper &OpdMapper) const {
568
    llvm_unreachable("The target has to implement that part");
569
  }
570
 
571
public:
572
  virtual ~RegisterBankInfo() = default;
573
 
574
  /// Get the register bank identified by \p ID.
575
  const RegisterBank &getRegBank(unsigned ID) const {
576
    return const_cast<RegisterBankInfo *>(this)->getRegBank(ID);
577
  }
578
 
579
  /// Get the register bank of \p Reg.
580
  /// If Reg has not been assigned a register, a register class,
581
  /// or a register bank, then this returns nullptr.
582
  ///
583
  /// \pre Reg != 0 (NoRegister)
584
  const RegisterBank *getRegBank(Register Reg, const MachineRegisterInfo &MRI,
585
                                 const TargetRegisterInfo &TRI) const;
586
 
587
  /// Get the total number of register banks.
588
  unsigned getNumRegBanks() const { return NumRegBanks; }
589
 
590
  /// Get a register bank that covers \p RC.
591
  ///
592
  /// \pre \p RC is a user-defined register class (as opposed as one
593
  /// generated by TableGen).
594
  ///
595
  /// \note The mapping RC -> RegBank could be built while adding the
596
  /// coverage for the register banks. However, we do not do it, because,
597
  /// at least for now, we only need this information for register classes
598
  /// that are used in the description of instruction. In other words,
599
  /// there are just a handful of them and we do not want to waste space.
600
  ///
601
  /// \todo This should be TableGen'ed.
602
  virtual const RegisterBank &
603
  getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const {
604
    llvm_unreachable("The target must override this method");
605
  }
606
 
607
  /// Get the cost of a copy from \p B to \p A, or put differently,
608
  /// get the cost of A = COPY B. Since register banks may cover
609
  /// different size, \p Size specifies what will be the size in bits
610
  /// that will be copied around.
611
  ///
612
  /// \note Since this is a copy, both registers have the same size.
613
  virtual unsigned copyCost(const RegisterBank &A, const RegisterBank &B,
614
                            unsigned Size) const {
615
    // Optimistically assume that copies are coalesced. I.e., when
616
    // they are on the same bank, they are free.
617
    // Otherwise assume a non-zero cost of 1. The targets are supposed
618
    // to override that properly anyway if they care.
619
    return &A != &B;
620
  }
621
 
622
  /// \returns true if emitting a copy from \p Src to \p Dst is impossible.
623
  bool cannotCopy(const RegisterBank &Dst, const RegisterBank &Src,
624
                  unsigned Size) const {
625
    return copyCost(Dst, Src, Size) == std::numeric_limits<unsigned>::max();
626
  }
627
 
628
  /// Get the cost of using \p ValMapping to decompose a register. This is
629
  /// similar to ::copyCost, except for cases where multiple copy-like
630
  /// operations need to be inserted. If the register is used as a source
631
  /// operand and already has a bank assigned, \p CurBank is non-null.
632
  virtual unsigned
633
  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.
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_REGISTERBANKINFO_H