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/MachineRegisterInfo.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
// This file defines the MachineRegisterInfo class.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_CODEGEN_MACHINEREGISTERINFO_H
14
#define LLVM_CODEGEN_MACHINEREGISTERINFO_H
15
 
16
#include "llvm/ADT/ArrayRef.h"
17
#include "llvm/ADT/BitVector.h"
18
#include "llvm/ADT/IndexedMap.h"
19
#include "llvm/ADT/PointerUnion.h"
20
#include "llvm/ADT/SmallPtrSet.h"
21
#include "llvm/ADT/SmallVector.h"
22
#include "llvm/ADT/StringSet.h"
23
#include "llvm/ADT/iterator_range.h"
24
#include "llvm/CodeGen/MachineBasicBlock.h"
25
#include "llvm/CodeGen/MachineFunction.h"
26
#include "llvm/CodeGen/MachineInstrBundle.h"
27
#include "llvm/CodeGen/MachineOperand.h"
28
#include "llvm/CodeGen/RegisterBank.h"
29
#include "llvm/CodeGen/TargetRegisterInfo.h"
30
#include "llvm/CodeGen/TargetSubtargetInfo.h"
31
#include "llvm/MC/LaneBitmask.h"
32
#include <cassert>
33
#include <cstddef>
34
#include <cstdint>
35
#include <iterator>
36
#include <memory>
37
#include <utility>
38
#include <vector>
39
 
40
namespace llvm {
41
 
42
class PSetIterator;
43
 
44
/// Convenient type to represent either a register class or a register bank.
45
using RegClassOrRegBank =
46
    PointerUnion<const TargetRegisterClass *, const RegisterBank *>;
47
 
48
/// MachineRegisterInfo - Keep track of information for virtual and physical
49
/// registers, including vreg register classes, use/def chains for registers,
50
/// etc.
51
class MachineRegisterInfo {
52
public:
53
  class Delegate {
54
    virtual void anchor();
55
 
56
  public:
57
    virtual ~Delegate() = default;
58
 
59
    virtual void MRI_NoteNewVirtualRegister(Register Reg) = 0;
60
    virtual void MRI_NotecloneVirtualRegister(Register NewReg,
61
                                              Register SrcReg) {
62
      MRI_NoteNewVirtualRegister(NewReg);
63
    }
64
  };
65
 
66
private:
67
  MachineFunction *MF;
68
  SmallPtrSet<Delegate *, 1> TheDelegates;
69
 
70
  /// True if subregister liveness is tracked.
71
  const bool TracksSubRegLiveness;
72
 
73
  /// VRegInfo - Information we keep for each virtual register.
74
  ///
75
  /// Each element in this list contains the register class of the vreg and the
76
  /// start of the use/def list for the register.
77
  IndexedMap<std::pair<RegClassOrRegBank, MachineOperand *>,
78
             VirtReg2IndexFunctor>
79
      VRegInfo;
80
 
81
  /// Map for recovering vreg name from vreg number.
82
  /// This map is used by the MIR Printer.
83
  IndexedMap<std::string, VirtReg2IndexFunctor> VReg2Name;
84
 
85
  /// StringSet that is used to unique vreg names.
86
  StringSet<> VRegNames;
87
 
88
  /// The flag is true upon \p UpdatedCSRs initialization
89
  /// and false otherwise.
90
  bool IsUpdatedCSRsInitialized = false;
91
 
92
  /// Contains the updated callee saved register list.
93
  /// As opposed to the static list defined in register info,
94
  /// all registers that were disabled are removed from the list.
95
  SmallVector<MCPhysReg, 16> UpdatedCSRs;
96
 
97
  /// RegAllocHints - This vector records register allocation hints for
98
  /// virtual registers. For each virtual register, it keeps a pair of hint
99
  /// type and hints vector making up the allocation hints. Only the first
100
  /// hint may be target specific, and in that case this is reflected by the
101
  /// first member of the pair being non-zero. If the hinted register is
102
  /// virtual, it means the allocator should prefer the physical register
103
  /// allocated to it if any.
104
  IndexedMap<std::pair<Register, SmallVector<Register, 4>>,
105
             VirtReg2IndexFunctor> RegAllocHints;
106
 
107
  /// PhysRegUseDefLists - This is an array of the head of the use/def list for
108
  /// physical registers.
109
  std::unique_ptr<MachineOperand *[]> PhysRegUseDefLists;
110
 
111
  /// getRegUseDefListHead - Return the head pointer for the register use/def
112
  /// list for the specified virtual or physical register.
113
  MachineOperand *&getRegUseDefListHead(Register RegNo) {
114
    if (RegNo.isVirtual())
115
      return VRegInfo[RegNo.id()].second;
116
    return PhysRegUseDefLists[RegNo.id()];
117
  }
118
 
119
  MachineOperand *getRegUseDefListHead(Register RegNo) const {
120
    if (RegNo.isVirtual())
121
      return VRegInfo[RegNo.id()].second;
122
    return PhysRegUseDefLists[RegNo.id()];
123
  }
124
 
125
  /// Get the next element in the use-def chain.
126
  static MachineOperand *getNextOperandForReg(const MachineOperand *MO) {
127
    assert(MO && MO->isReg() && "This is not a register operand!");
128
    return MO->Contents.Reg.Next;
129
  }
130
 
131
  /// UsedPhysRegMask - Additional used physregs including aliases.
132
  /// This bit vector represents all the registers clobbered by function calls.
133
  BitVector UsedPhysRegMask;
134
 
135
  /// ReservedRegs - This is a bit vector of reserved registers.  The target
136
  /// may change its mind about which registers should be reserved.  This
137
  /// vector is the frozen set of reserved registers when register allocation
138
  /// started.
139
  BitVector ReservedRegs;
140
 
141
  using VRegToTypeMap = IndexedMap<LLT, VirtReg2IndexFunctor>;
142
  /// Map generic virtual registers to their low-level type.
143
  VRegToTypeMap VRegToType;
144
 
145
  /// Keep track of the physical registers that are live in to the function.
146
  /// Live in values are typically arguments in registers.  LiveIn values are
147
  /// allowed to have virtual registers associated with them, stored in the
148
  /// second element.
149
  std::vector<std::pair<MCRegister, Register>> LiveIns;
150
 
151
public:
152
  explicit MachineRegisterInfo(MachineFunction *MF);
153
  MachineRegisterInfo(const MachineRegisterInfo &) = delete;
154
  MachineRegisterInfo &operator=(const MachineRegisterInfo &) = delete;
155
 
156
  const TargetRegisterInfo *getTargetRegisterInfo() const {
157
    return MF->getSubtarget().getRegisterInfo();
158
  }
159
 
160
  void resetDelegate(Delegate *delegate) {
161
    // Ensure another delegate does not take over unless the current
162
    // delegate first unattaches itself.
163
    assert(TheDelegates.count(delegate) &&
164
           "Only an existing delegate can perform reset!");
165
    TheDelegates.erase(delegate);
166
  }
167
 
168
  void addDelegate(Delegate *delegate) {
169
    assert(delegate && !TheDelegates.count(delegate) &&
170
           "Attempted to add null delegate, or to change it without "
171
           "first resetting it!");
172
 
173
    TheDelegates.insert(delegate);
174
  }
175
 
176
  void noteNewVirtualRegister(Register Reg) {
177
    for (auto *TheDelegate : TheDelegates)
178
      TheDelegate->MRI_NoteNewVirtualRegister(Reg);
179
  }
180
 
181
  void noteCloneVirtualRegister(Register NewReg, Register SrcReg) {
182
    for (auto *TheDelegate : TheDelegates)
183
      TheDelegate->MRI_NotecloneVirtualRegister(NewReg, SrcReg);
184
  }
185
 
186
  //===--------------------------------------------------------------------===//
187
  // Function State
188
  //===--------------------------------------------------------------------===//
189
 
190
  // isSSA - Returns true when the machine function is in SSA form. Early
191
  // passes require the machine function to be in SSA form where every virtual
192
  // register has a single defining instruction.
193
  //
194
  // The TwoAddressInstructionPass and PHIElimination passes take the machine
195
  // function out of SSA form when they introduce multiple defs per virtual
196
  // register.
197
  bool isSSA() const {
198
    return MF->getProperties().hasProperty(
199
        MachineFunctionProperties::Property::IsSSA);
200
  }
201
 
202
  // leaveSSA - Indicates that the machine function is no longer in SSA form.
203
  void leaveSSA() {
204
    MF->getProperties().reset(MachineFunctionProperties::Property::IsSSA);
205
  }
206
 
207
  /// tracksLiveness - Returns true when tracking register liveness accurately.
208
  /// (see MachineFUnctionProperties::Property description for details)
209
  bool tracksLiveness() const {
210
    return MF->getProperties().hasProperty(
211
        MachineFunctionProperties::Property::TracksLiveness);
212
  }
213
 
214
  /// invalidateLiveness - Indicates that register liveness is no longer being
215
  /// tracked accurately.
216
  ///
217
  /// This should be called by late passes that invalidate the liveness
218
  /// information.
219
  void invalidateLiveness() {
220
    MF->getProperties().reset(
221
        MachineFunctionProperties::Property::TracksLiveness);
222
  }
223
 
224
  /// Returns true if liveness for register class @p RC should be tracked at
225
  /// the subregister level.
226
  bool shouldTrackSubRegLiveness(const TargetRegisterClass &RC) const {
227
    return subRegLivenessEnabled() && RC.HasDisjunctSubRegs;
228
  }
229
  bool shouldTrackSubRegLiveness(Register VReg) const {
230
    assert(VReg.isVirtual() && "Must pass a VReg");
231
    return shouldTrackSubRegLiveness(*getRegClass(VReg));
232
  }
233
  bool subRegLivenessEnabled() const {
234
    return TracksSubRegLiveness;
235
  }
236
 
237
  //===--------------------------------------------------------------------===//
238
  // Register Info
239
  //===--------------------------------------------------------------------===//
240
 
241
  /// Returns true if the updated CSR list was initialized and false otherwise.
242
  bool isUpdatedCSRsInitialized() const { return IsUpdatedCSRsInitialized; }
243
 
244
  /// Returns true if a register can be used as an argument to a function.
245
  bool isArgumentRegister(const MachineFunction &MF, MCRegister Reg) const;
246
 
247
  /// Returns true if a register is a fixed register.
248
  bool isFixedRegister(const MachineFunction &MF, MCRegister Reg) const;
249
 
250
  /// Returns true if a register is a general purpose register.
251
  bool isGeneralPurposeRegister(const MachineFunction &MF,
252
                                MCRegister Reg) const;
253
 
254
  /// Disables the register from the list of CSRs.
255
  /// I.e. the register will not appear as part of the CSR mask.
256
  /// \see UpdatedCalleeSavedRegs.
257
  void disableCalleeSavedRegister(MCRegister Reg);
258
 
259
  /// Returns list of callee saved registers.
260
  /// The function returns the updated CSR list (after taking into account
261
  /// registers that are disabled from the CSR list).
262
  const MCPhysReg *getCalleeSavedRegs() const;
263
 
264
  /// Sets the updated Callee Saved Registers list.
265
  /// Notice that it will override ant previously disabled/saved CSRs.
266
  void setCalleeSavedRegs(ArrayRef<MCPhysReg> CSRs);
267
 
268
  // Strictly for use by MachineInstr.cpp.
269
  void addRegOperandToUseList(MachineOperand *MO);
270
 
271
  // Strictly for use by MachineInstr.cpp.
272
  void removeRegOperandFromUseList(MachineOperand *MO);
273
 
274
  // Strictly for use by MachineInstr.cpp.
275
  void moveOperands(MachineOperand *Dst, MachineOperand *Src, unsigned NumOps);
276
 
277
  /// Verify the sanity of the use list for Reg.
278
  void verifyUseList(Register Reg) const;
279
 
280
  /// Verify the use list of all registers.
281
  void verifyUseLists() const;
282
 
283
  /// reg_begin/reg_end - Provide iteration support to walk over all definitions
284
  /// and uses of a register within the MachineFunction that corresponds to this
285
  /// MachineRegisterInfo object.
286
  template<bool Uses, bool Defs, bool SkipDebug,
287
           bool ByOperand, bool ByInstr, bool ByBundle>
288
  class defusechain_iterator;
289
  template<bool Uses, bool Defs, bool SkipDebug,
290
           bool ByOperand, bool ByInstr, bool ByBundle>
291
  class defusechain_instr_iterator;
292
 
293
  // Make it a friend so it can access getNextOperandForReg().
294
  template<bool, bool, bool, bool, bool, bool>
295
    friend class defusechain_iterator;
296
  template<bool, bool, bool, bool, bool, bool>
297
    friend class defusechain_instr_iterator;
298
 
299
  /// reg_iterator/reg_begin/reg_end - Walk all defs and uses of the specified
300
  /// register.
301
  using reg_iterator =
302
      defusechain_iterator<true, true, false, true, false, false>;
303
  reg_iterator reg_begin(Register RegNo) const {
304
    return reg_iterator(getRegUseDefListHead(RegNo));
305
  }
306
  static reg_iterator reg_end() { return reg_iterator(nullptr); }
307
 
308
  inline iterator_range<reg_iterator> reg_operands(Register Reg) const {
309
    return make_range(reg_begin(Reg), reg_end());
310
  }
311
 
312
  /// reg_instr_iterator/reg_instr_begin/reg_instr_end - Walk all defs and uses
313
  /// of the specified register, stepping by MachineInstr.
314
  using reg_instr_iterator =
315
      defusechain_instr_iterator<true, true, false, false, true, false>;
316
  reg_instr_iterator reg_instr_begin(Register RegNo) const {
317
    return reg_instr_iterator(getRegUseDefListHead(RegNo));
318
  }
319
  static reg_instr_iterator reg_instr_end() {
320
    return reg_instr_iterator(nullptr);
321
  }
322
 
323
  inline iterator_range<reg_instr_iterator>
324
  reg_instructions(Register Reg) const {
325
    return make_range(reg_instr_begin(Reg), reg_instr_end());
326
  }
327
 
328
  /// reg_bundle_iterator/reg_bundle_begin/reg_bundle_end - Walk all defs and uses
329
  /// of the specified register, stepping by bundle.
330
  using reg_bundle_iterator =
331
      defusechain_instr_iterator<true, true, false, false, false, true>;
332
  reg_bundle_iterator reg_bundle_begin(Register RegNo) const {
333
    return reg_bundle_iterator(getRegUseDefListHead(RegNo));
334
  }
335
  static reg_bundle_iterator reg_bundle_end() {
336
    return reg_bundle_iterator(nullptr);
337
  }
338
 
339
  inline iterator_range<reg_bundle_iterator> reg_bundles(Register Reg) const {
340
    return make_range(reg_bundle_begin(Reg), reg_bundle_end());
341
  }
342
 
343
  /// reg_empty - Return true if there are no instructions using or defining the
344
  /// specified register (it may be live-in).
345
  bool reg_empty(Register RegNo) const { return reg_begin(RegNo) == reg_end(); }
346
 
347
  /// reg_nodbg_iterator/reg_nodbg_begin/reg_nodbg_end - Walk all defs and uses
348
  /// of the specified register, skipping those marked as Debug.
349
  using reg_nodbg_iterator =
350
      defusechain_iterator<true, true, true, true, false, false>;
351
  reg_nodbg_iterator reg_nodbg_begin(Register RegNo) const {
352
    return reg_nodbg_iterator(getRegUseDefListHead(RegNo));
353
  }
354
  static reg_nodbg_iterator reg_nodbg_end() {
355
    return reg_nodbg_iterator(nullptr);
356
  }
357
 
358
  inline iterator_range<reg_nodbg_iterator>
359
  reg_nodbg_operands(Register Reg) const {
360
    return make_range(reg_nodbg_begin(Reg), reg_nodbg_end());
361
  }
362
 
363
  /// reg_instr_nodbg_iterator/reg_instr_nodbg_begin/reg_instr_nodbg_end - Walk
364
  /// all defs and uses of the specified register, stepping by MachineInstr,
365
  /// skipping those marked as Debug.
366
  using reg_instr_nodbg_iterator =
367
      defusechain_instr_iterator<true, true, true, false, true, false>;
368
  reg_instr_nodbg_iterator reg_instr_nodbg_begin(Register RegNo) const {
369
    return reg_instr_nodbg_iterator(getRegUseDefListHead(RegNo));
370
  }
371
  static reg_instr_nodbg_iterator reg_instr_nodbg_end() {
372
    return reg_instr_nodbg_iterator(nullptr);
373
  }
374
 
375
  inline iterator_range<reg_instr_nodbg_iterator>
376
  reg_nodbg_instructions(Register Reg) const {
377
    return make_range(reg_instr_nodbg_begin(Reg), reg_instr_nodbg_end());
378
  }
379
 
380
  /// reg_bundle_nodbg_iterator/reg_bundle_nodbg_begin/reg_bundle_nodbg_end - Walk
381
  /// all defs and uses of the specified register, stepping by bundle,
382
  /// skipping those marked as Debug.
383
  using reg_bundle_nodbg_iterator =
384
      defusechain_instr_iterator<true, true, true, false, false, true>;
385
  reg_bundle_nodbg_iterator reg_bundle_nodbg_begin(Register RegNo) const {
386
    return reg_bundle_nodbg_iterator(getRegUseDefListHead(RegNo));
387
  }
388
  static reg_bundle_nodbg_iterator reg_bundle_nodbg_end() {
389
    return reg_bundle_nodbg_iterator(nullptr);
390
  }
391
 
392
  inline iterator_range<reg_bundle_nodbg_iterator>
393
  reg_nodbg_bundles(Register Reg) const {
394
    return make_range(reg_bundle_nodbg_begin(Reg), reg_bundle_nodbg_end());
395
  }
396
 
397
  /// reg_nodbg_empty - Return true if the only instructions using or defining
398
  /// Reg are Debug instructions.
399
  bool reg_nodbg_empty(Register RegNo) const {
400
    return reg_nodbg_begin(RegNo) == reg_nodbg_end();
401
  }
402
 
403
  /// def_iterator/def_begin/def_end - Walk all defs of the specified register.
404
  using def_iterator =
405
      defusechain_iterator<false, true, false, true, false, false>;
406
  def_iterator def_begin(Register RegNo) const {
407
    return def_iterator(getRegUseDefListHead(RegNo));
408
  }
409
  static def_iterator def_end() { return def_iterator(nullptr); }
410
 
411
  inline iterator_range<def_iterator> def_operands(Register Reg) const {
412
    return make_range(def_begin(Reg), def_end());
413
  }
414
 
415
  /// def_instr_iterator/def_instr_begin/def_instr_end - Walk all defs of the
416
  /// specified register, stepping by MachineInst.
417
  using def_instr_iterator =
418
      defusechain_instr_iterator<false, true, false, false, true, false>;
419
  def_instr_iterator def_instr_begin(Register RegNo) const {
420
    return def_instr_iterator(getRegUseDefListHead(RegNo));
421
  }
422
  static def_instr_iterator def_instr_end() {
423
    return def_instr_iterator(nullptr);
424
  }
425
 
426
  inline iterator_range<def_instr_iterator>
427
  def_instructions(Register Reg) const {
428
    return make_range(def_instr_begin(Reg), def_instr_end());
429
  }
430
 
431
  /// def_bundle_iterator/def_bundle_begin/def_bundle_end - Walk all defs of the
432
  /// specified register, stepping by bundle.
433
  using def_bundle_iterator =
434
      defusechain_instr_iterator<false, true, false, false, false, true>;
435
  def_bundle_iterator def_bundle_begin(Register RegNo) const {
436
    return def_bundle_iterator(getRegUseDefListHead(RegNo));
437
  }
438
  static def_bundle_iterator def_bundle_end() {
439
    return def_bundle_iterator(nullptr);
440
  }
441
 
442
  inline iterator_range<def_bundle_iterator> def_bundles(Register Reg) const {
443
    return make_range(def_bundle_begin(Reg), def_bundle_end());
444
  }
445
 
446
  /// def_empty - Return true if there are no instructions defining the
447
  /// specified register (it may be live-in).
448
  bool def_empty(Register RegNo) const { return def_begin(RegNo) == def_end(); }
449
 
450
  StringRef getVRegName(Register Reg) const {
451
    return VReg2Name.inBounds(Reg) ? StringRef(VReg2Name[Reg]) : "";
452
  }
453
 
454
  void insertVRegByName(StringRef Name, Register Reg) {
455
    assert((Name.empty() || VRegNames.find(Name) == VRegNames.end()) &&
456
           "Named VRegs Must be Unique.");
457
    if (!Name.empty()) {
458
      VRegNames.insert(Name);
459
      VReg2Name.grow(Reg);
460
      VReg2Name[Reg] = Name.str();
461
    }
462
  }
463
 
464
  /// Return true if there is exactly one operand defining the specified
465
  /// register.
466
  bool hasOneDef(Register RegNo) const {
467
    return hasSingleElement(def_operands(RegNo));
468
  }
469
 
470
  /// Returns the defining operand if there is exactly one operand defining the
471
  /// specified register, otherwise nullptr.
472
  MachineOperand *getOneDef(Register Reg) const {
473
    def_iterator DI = def_begin(Reg);
474
    if (DI == def_end()) // No defs.
475
      return nullptr;
476
 
477
    def_iterator OneDef = DI;
478
    if (++DI == def_end())
479
      return &*OneDef;
480
    return nullptr; // Multiple defs.
481
  }
482
 
483
  /// use_iterator/use_begin/use_end - Walk all uses of the specified register.
484
  using use_iterator =
485
      defusechain_iterator<true, false, false, true, false, false>;
486
  use_iterator use_begin(Register RegNo) const {
487
    return use_iterator(getRegUseDefListHead(RegNo));
488
  }
489
  static use_iterator use_end() { return use_iterator(nullptr); }
490
 
491
  inline iterator_range<use_iterator> use_operands(Register Reg) const {
492
    return make_range(use_begin(Reg), use_end());
493
  }
494
 
495
  /// use_instr_iterator/use_instr_begin/use_instr_end - Walk all uses of the
496
  /// specified register, stepping by MachineInstr.
497
  using use_instr_iterator =
498
      defusechain_instr_iterator<true, false, false, false, true, false>;
499
  use_instr_iterator use_instr_begin(Register RegNo) const {
500
    return use_instr_iterator(getRegUseDefListHead(RegNo));
501
  }
502
  static use_instr_iterator use_instr_end() {
503
    return use_instr_iterator(nullptr);
504
  }
505
 
506
  inline iterator_range<use_instr_iterator>
507
  use_instructions(Register Reg) const {
508
    return make_range(use_instr_begin(Reg), use_instr_end());
509
  }
510
 
511
  /// use_bundle_iterator/use_bundle_begin/use_bundle_end - Walk all uses of the
512
  /// specified register, stepping by bundle.
513
  using use_bundle_iterator =
514
      defusechain_instr_iterator<true, false, false, false, false, true>;
515
  use_bundle_iterator use_bundle_begin(Register RegNo) const {
516
    return use_bundle_iterator(getRegUseDefListHead(RegNo));
517
  }
518
  static use_bundle_iterator use_bundle_end() {
519
    return use_bundle_iterator(nullptr);
520
  }
521
 
522
  inline iterator_range<use_bundle_iterator> use_bundles(Register Reg) const {
523
    return make_range(use_bundle_begin(Reg), use_bundle_end());
524
  }
525
 
526
  /// use_empty - Return true if there are no instructions using the specified
527
  /// register.
528
  bool use_empty(Register RegNo) const { return use_begin(RegNo) == use_end(); }
529
 
530
  /// hasOneUse - Return true if there is exactly one instruction using the
531
  /// specified register.
532
  bool hasOneUse(Register RegNo) const {
533
    return hasSingleElement(use_operands(RegNo));
534
  }
535
 
536
  /// use_nodbg_iterator/use_nodbg_begin/use_nodbg_end - Walk all uses of the
537
  /// specified register, skipping those marked as Debug.
538
  using use_nodbg_iterator =
539
      defusechain_iterator<true, false, true, true, false, false>;
540
  use_nodbg_iterator use_nodbg_begin(Register RegNo) const {
541
    return use_nodbg_iterator(getRegUseDefListHead(RegNo));
542
  }
543
  static use_nodbg_iterator use_nodbg_end() {
544
    return use_nodbg_iterator(nullptr);
545
  }
546
 
547
  inline iterator_range<use_nodbg_iterator>
548
  use_nodbg_operands(Register Reg) const {
549
    return make_range(use_nodbg_begin(Reg), use_nodbg_end());
550
  }
551
 
552
  /// use_instr_nodbg_iterator/use_instr_nodbg_begin/use_instr_nodbg_end - Walk
553
  /// all uses of the specified register, stepping by MachineInstr, skipping
554
  /// those marked as Debug.
555
  using use_instr_nodbg_iterator =
556
      defusechain_instr_iterator<true, false, true, false, true, false>;
557
  use_instr_nodbg_iterator use_instr_nodbg_begin(Register RegNo) const {
558
    return use_instr_nodbg_iterator(getRegUseDefListHead(RegNo));
559
  }
560
  static use_instr_nodbg_iterator use_instr_nodbg_end() {
561
    return use_instr_nodbg_iterator(nullptr);
562
  }
563
 
564
  inline iterator_range<use_instr_nodbg_iterator>
565
  use_nodbg_instructions(Register Reg) const {
566
    return make_range(use_instr_nodbg_begin(Reg), use_instr_nodbg_end());
567
  }
568
 
569
  /// use_bundle_nodbg_iterator/use_bundle_nodbg_begin/use_bundle_nodbg_end - Walk
570
  /// all uses of the specified register, stepping by bundle, skipping
571
  /// those marked as Debug.
572
  using use_bundle_nodbg_iterator =
573
      defusechain_instr_iterator<true, false, true, false, false, true>;
574
  use_bundle_nodbg_iterator use_bundle_nodbg_begin(Register RegNo) const {
575
    return use_bundle_nodbg_iterator(getRegUseDefListHead(RegNo));
576
  }
577
  static use_bundle_nodbg_iterator use_bundle_nodbg_end() {
578
    return use_bundle_nodbg_iterator(nullptr);
579
  }
580
 
581
  inline iterator_range<use_bundle_nodbg_iterator>
582
  use_nodbg_bundles(Register Reg) const {
583
    return make_range(use_bundle_nodbg_begin(Reg), use_bundle_nodbg_end());
584
  }
585
 
586
  /// use_nodbg_empty - Return true if there are no non-Debug instructions
587
  /// using the specified register.
588
  bool use_nodbg_empty(Register RegNo) const {
589
    return use_nodbg_begin(RegNo) == use_nodbg_end();
590
  }
591
 
592
  /// hasOneNonDBGUse - Return true if there is exactly one non-Debug
593
  /// use of the specified register.
594
  bool hasOneNonDBGUse(Register RegNo) const;
595
 
596
  /// hasOneNonDBGUse - Return true if there is exactly one non-Debug
597
  /// instruction using the specified register. Said instruction may have
598
  /// multiple uses.
599
  bool hasOneNonDBGUser(Register RegNo) const;
600
 
601
 
602
  /// hasAtMostUses - Return true if the given register has at most \p MaxUsers
603
  /// non-debug user instructions.
604
  bool hasAtMostUserInstrs(Register Reg, unsigned MaxUsers) const;
605
 
606
  /// replaceRegWith - Replace all instances of FromReg with ToReg in the
607
  /// machine function.  This is like llvm-level X->replaceAllUsesWith(Y),
608
  /// except that it also changes any definitions of the register as well.
609
  ///
610
  /// Note that it is usually necessary to first constrain ToReg's register
611
  /// class and register bank to match the FromReg constraints using one of the
612
  /// methods:
613
  ///
614
  ///   constrainRegClass(ToReg, getRegClass(FromReg))
615
  ///   constrainRegAttrs(ToReg, FromReg)
616
  ///   RegisterBankInfo::constrainGenericRegister(ToReg,
617
  ///       *MRI.getRegClass(FromReg), MRI)
618
  ///
619
  /// These functions will return a falsy result if the virtual registers have
620
  /// incompatible constraints.
621
  ///
622
  /// Note that if ToReg is a physical register the function will replace and
623
  /// apply sub registers to ToReg in order to obtain a final/proper physical
624
  /// register.
625
  void replaceRegWith(Register FromReg, Register ToReg);
626
 
627
  /// getVRegDef - Return the machine instr that defines the specified virtual
628
  /// register or null if none is found.  This assumes that the code is in SSA
629
  /// form, so there should only be one definition.
630
  MachineInstr *getVRegDef(Register Reg) const;
631
 
632
  /// getUniqueVRegDef - Return the unique machine instr that defines the
633
  /// specified virtual register or null if none is found.  If there are
634
  /// multiple definitions or no definition, return null.
635
  MachineInstr *getUniqueVRegDef(Register Reg) const;
636
 
637
  /// clearKillFlags - Iterate over all the uses of the given register and
638
  /// clear the kill flag from the MachineOperand. This function is used by
639
  /// optimization passes which extend register lifetimes and need only
640
  /// preserve conservative kill flag information.
641
  void clearKillFlags(Register Reg) const;
642
 
643
  void dumpUses(Register RegNo) const;
644
 
645
  /// Returns true if PhysReg is unallocatable and constant throughout the
646
  /// function. Writing to a constant register has no effect.
647
  bool isConstantPhysReg(MCRegister PhysReg) const;
648
 
649
  /// Get an iterator over the pressure sets affected by the given physical or
650
  /// virtual register. If RegUnit is physical, it must be a register unit (from
651
  /// MCRegUnitIterator).
652
  PSetIterator getPressureSets(Register RegUnit) const;
653
 
654
  //===--------------------------------------------------------------------===//
655
  // Virtual Register Info
656
  //===--------------------------------------------------------------------===//
657
 
658
  /// Return the register class of the specified virtual register.
659
  /// This shouldn't be used directly unless \p Reg has a register class.
660
  /// \see getRegClassOrNull when this might happen.
661
  const TargetRegisterClass *getRegClass(Register Reg) const {
662
    assert(VRegInfo[Reg.id()].first.is<const TargetRegisterClass *>() &&
663
           "Register class not set, wrong accessor");
664
    return VRegInfo[Reg.id()].first.get<const TargetRegisterClass *>();
665
  }
666
 
667
  /// Return the register class of \p Reg, or null if Reg has not been assigned
668
  /// a register class yet.
669
  ///
670
  /// \note A null register class can only happen when these two
671
  /// conditions are met:
672
  /// 1. Generic virtual registers are created.
673
  /// 2. The machine function has not completely been through the
674
  ///    instruction selection process.
675
  /// None of this condition is possible without GlobalISel for now.
676
  /// In other words, if GlobalISel is not used or if the query happens after
677
  /// the select pass, using getRegClass is safe.
678
  const TargetRegisterClass *getRegClassOrNull(Register Reg) const {
679
    const RegClassOrRegBank &Val = VRegInfo[Reg].first;
680
    return Val.dyn_cast<const TargetRegisterClass *>();
681
  }
682
 
683
  /// Return the register bank of \p Reg, or null if Reg has not been assigned
684
  /// a register bank or has been assigned a register class.
685
  /// \note It is possible to get the register bank from the register class via
686
  /// RegisterBankInfo::getRegBankFromRegClass.
687
  const RegisterBank *getRegBankOrNull(Register Reg) const {
688
    const RegClassOrRegBank &Val = VRegInfo[Reg].first;
689
    return Val.dyn_cast<const RegisterBank *>();
690
  }
691
 
692
  /// Return the register bank or register class of \p Reg.
693
  /// \note Before the register bank gets assigned (i.e., before the
694
  /// RegBankSelect pass) \p Reg may not have either.
695
  const RegClassOrRegBank &getRegClassOrRegBank(Register Reg) const {
696
    return VRegInfo[Reg].first;
697
  }
698
 
699
  /// setRegClass - Set the register class of the specified virtual register.
700
  void setRegClass(Register Reg, const TargetRegisterClass *RC);
701
 
702
  /// Set the register bank to \p RegBank for \p Reg.
703
  void setRegBank(Register Reg, const RegisterBank &RegBank);
704
 
705
  void setRegClassOrRegBank(Register Reg,
706
                            const RegClassOrRegBank &RCOrRB){
707
    VRegInfo[Reg].first = RCOrRB;
708
  }
709
 
710
  /// constrainRegClass - Constrain the register class of the specified virtual
711
  /// register to be a common subclass of RC and the current register class,
712
  /// but only if the new class has at least MinNumRegs registers.  Return the
713
  /// new register class, or NULL if no such class exists.
714
  /// This should only be used when the constraint is known to be trivial, like
715
  /// GR32 -> GR32_NOSP. Beware of increasing register pressure.
716
  ///
717
  /// \note Assumes that the register has a register class assigned.
718
  /// Use RegisterBankInfo::constrainGenericRegister in GlobalISel's
719
  /// InstructionSelect pass and constrainRegAttrs in every other pass,
720
  /// including non-select passes of GlobalISel, instead.
721
  const TargetRegisterClass *constrainRegClass(Register Reg,
722
                                               const TargetRegisterClass *RC,
723
                                               unsigned MinNumRegs = 0);
724
 
725
  /// Constrain the register class or the register bank of the virtual register
726
  /// \p Reg (and low-level type) to be a common subclass or a common bank of
727
  /// both registers provided respectively (and a common low-level type). Do
728
  /// nothing if any of the attributes (classes, banks, or low-level types) of
729
  /// the registers are deemed incompatible, or if the resulting register will
730
  /// have a class smaller than before and of size less than \p MinNumRegs.
731
  /// Return true if such register attributes exist, false otherwise.
732
  ///
733
  /// \note Use this method instead of constrainRegClass and
734
  /// RegisterBankInfo::constrainGenericRegister everywhere but SelectionDAG
735
  /// ISel / FastISel and GlobalISel's InstructionSelect pass respectively.
736
  bool constrainRegAttrs(Register Reg, Register ConstrainingReg,
737
                         unsigned MinNumRegs = 0);
738
 
739
  /// recomputeRegClass - Try to find a legal super-class of Reg's register
740
  /// class that still satisfies the constraints from the instructions using
741
  /// Reg.  Returns true if Reg was upgraded.
742
  ///
743
  /// This method can be used after constraints have been removed from a
744
  /// virtual register, for example after removing instructions or splitting
745
  /// the live range.
746
  bool recomputeRegClass(Register Reg);
747
 
748
  /// createVirtualRegister - Create and return a new virtual register in the
749
  /// function with the specified register class.
750
  Register createVirtualRegister(const TargetRegisterClass *RegClass,
751
                                 StringRef Name = "");
752
 
753
  /// Create and return a new virtual register in the function with the same
754
  /// attributes as the given register.
755
  Register cloneVirtualRegister(Register VReg, StringRef Name = "");
756
 
757
  /// Get the low-level type of \p Reg or LLT{} if Reg is not a generic
758
  /// (target independent) virtual register.
759
  LLT getType(Register Reg) const {
760
    if (Reg.isVirtual() && VRegToType.inBounds(Reg))
761
      return VRegToType[Reg];
762
    return LLT{};
763
  }
764
 
765
  /// Set the low-level type of \p VReg to \p Ty.
766
  void setType(Register VReg, LLT Ty);
767
 
768
  /// Create and return a new generic virtual register with low-level
769
  /// type \p Ty.
770
  Register createGenericVirtualRegister(LLT Ty, StringRef Name = "");
771
 
772
  /// Remove all types associated to virtual registers (after instruction
773
  /// selection and constraining of all generic virtual registers).
774
  void clearVirtRegTypes();
775
 
776
  /// Creates a new virtual register that has no register class, register bank
777
  /// or size assigned yet. This is only allowed to be used
778
  /// temporarily while constructing machine instructions. Most operations are
779
  /// undefined on an incomplete register until one of setRegClass(),
780
  /// setRegBank() or setSize() has been called on it.
781
  Register createIncompleteVirtualRegister(StringRef Name = "");
782
 
783
  /// getNumVirtRegs - Return the number of virtual registers created.
784
  unsigned getNumVirtRegs() const { return VRegInfo.size(); }
785
 
786
  /// clearVirtRegs - Remove all virtual registers (after physreg assignment).
787
  void clearVirtRegs();
788
 
789
  /// setRegAllocationHint - Specify a register allocation hint for the
790
  /// specified virtual register. This is typically used by target, and in case
791
  /// of an earlier hint it will be overwritten.
792
  void setRegAllocationHint(Register VReg, unsigned Type, Register PrefReg) {
793
    assert(VReg.isVirtual());
794
    RegAllocHints[VReg].first  = Type;
795
    RegAllocHints[VReg].second.clear();
796
    RegAllocHints[VReg].second.push_back(PrefReg);
797
  }
798
 
799
  /// addRegAllocationHint - Add a register allocation hint to the hints
800
  /// vector for VReg.
801
  void addRegAllocationHint(Register VReg, Register PrefReg) {
802
    assert(VReg.isVirtual());
803
    RegAllocHints[VReg].second.push_back(PrefReg);
804
  }
805
 
806
  /// Specify the preferred (target independent) register allocation hint for
807
  /// the specified virtual register.
808
  void setSimpleHint(Register VReg, Register PrefReg) {
809
    setRegAllocationHint(VReg, /*Type=*/0, PrefReg);
810
  }
811
 
812
  void clearSimpleHint(Register VReg) {
813
    assert (!RegAllocHints[VReg].first &&
814
            "Expected to clear a non-target hint!");
815
    RegAllocHints[VReg].second.clear();
816
  }
817
 
818
  /// getRegAllocationHint - Return the register allocation hint for the
819
  /// specified virtual register. If there are many hints, this returns the
820
  /// one with the greatest weight.
821
  std::pair<Register, Register>
822
  getRegAllocationHint(Register VReg) const {
823
    assert(VReg.isVirtual());
824
    Register BestHint = (RegAllocHints[VReg.id()].second.size() ?
825
                         RegAllocHints[VReg.id()].second[0] : Register());
826
    return std::pair<Register, Register>(RegAllocHints[VReg.id()].first,
827
                                         BestHint);
828
  }
829
 
830
  /// getSimpleHint - same as getRegAllocationHint except it will only return
831
  /// a target independent hint.
832
  Register getSimpleHint(Register VReg) const {
833
    assert(VReg.isVirtual());
834
    std::pair<Register, Register> Hint = getRegAllocationHint(VReg);
835
    return Hint.first ? Register() : Hint.second;
836
  }
837
 
838
  /// getRegAllocationHints - Return a reference to the vector of all
839
  /// register allocation hints for VReg.
840
  const std::pair<Register, SmallVector<Register, 4>>
841
  &getRegAllocationHints(Register VReg) const {
842
    assert(VReg.isVirtual());
843
    return RegAllocHints[VReg];
844
  }
845
 
846
  /// markUsesInDebugValueAsUndef - Mark every DBG_VALUE referencing the
847
  /// specified register as undefined which causes the DBG_VALUE to be
848
  /// deleted during LiveDebugVariables analysis.
849
  void markUsesInDebugValueAsUndef(Register Reg) const;
850
 
851
  /// updateDbgUsersToReg - Update a collection of debug instructions
852
  /// to refer to the designated register.
853
  void updateDbgUsersToReg(MCRegister OldReg, MCRegister NewReg,
854
                           ArrayRef<MachineInstr *> Users) const {
855
    // If this operand is a register, check whether it overlaps with OldReg.
856
    // If it does, replace with NewReg.
857
    auto UpdateOp = [this, &NewReg, &OldReg](MachineOperand &Op) {
858
      if (Op.isReg() &&
859
          getTargetRegisterInfo()->regsOverlap(Op.getReg(), OldReg))
860
        Op.setReg(NewReg);
861
    };
862
 
863
    // Iterate through (possibly several) operands to DBG_VALUEs and update
864
    // each. For DBG_PHIs, only one operand will be present.
865
    for (MachineInstr *MI : Users) {
866
      if (MI->isDebugValue()) {
867
        for (auto &Op : MI->debug_operands())
868
          UpdateOp(Op);
869
        assert(MI->hasDebugOperandForReg(NewReg) &&
870
               "Expected debug value to have some overlap with OldReg");
871
      } else if (MI->isDebugPHI()) {
872
        UpdateOp(MI->getOperand(0));
873
      } else {
874
        llvm_unreachable("Non-DBG_VALUE, Non-DBG_PHI debug instr updated");
875
      }
876
    }
877
  }
878
 
879
  /// Return true if the specified register is modified in this function.
880
  /// This checks that no defining machine operands exist for the register or
881
  /// any of its aliases. Definitions found on functions marked noreturn are
882
  /// ignored, to consider them pass 'true' for optional parameter
883
  /// SkipNoReturnDef. The register is also considered modified when it is set
884
  /// in the UsedPhysRegMask.
885
  bool isPhysRegModified(MCRegister PhysReg, bool SkipNoReturnDef = false) const;
886
 
887
  /// Return true if the specified register is modified or read in this
888
  /// function. This checks that no machine operands exist for the register or
889
  /// any of its aliases. If SkipRegMaskTest is false, the register is
890
  /// considered used when it is set in the UsedPhysRegMask.
891
  bool isPhysRegUsed(MCRegister PhysReg, bool SkipRegMaskTest = false) const;
892
 
893
  /// addPhysRegsUsedFromRegMask - Mark any registers not in RegMask as used.
894
  /// This corresponds to the bit mask attached to register mask operands.
895
  void addPhysRegsUsedFromRegMask(const uint32_t *RegMask) {
896
    UsedPhysRegMask.setBitsNotInMask(RegMask);
897
  }
898
 
899
  const BitVector &getUsedPhysRegsMask() const { return UsedPhysRegMask; }
900
 
901
  //===--------------------------------------------------------------------===//
902
  // Reserved Register Info
903
  //===--------------------------------------------------------------------===//
904
  //
905
  // The set of reserved registers must be invariant during register
906
  // allocation.  For example, the target cannot suddenly decide it needs a
907
  // frame pointer when the register allocator has already used the frame
908
  // pointer register for something else.
909
  //
910
  // These methods can be used by target hooks like hasFP() to avoid changing
911
  // the reserved register set during register allocation.
912
 
913
  /// freezeReservedRegs - Called by the register allocator to freeze the set
914
  /// of reserved registers before allocation begins.
915
  void freezeReservedRegs(const MachineFunction&);
916
 
917
  /// reserveReg -- Mark a register as reserved so checks like isAllocatable 
918
  /// will not suggest using it. This should not be used during the middle
919
  /// of a function walk, or when liveness info is available.
920
  void reserveReg(MCRegister PhysReg, const TargetRegisterInfo *TRI) {
921
    assert(reservedRegsFrozen() &&
922
           "Reserved registers haven't been frozen yet. ");
923
    MCRegAliasIterator R(PhysReg, TRI, true);
924
 
925
    for (; R.isValid(); ++R)
926
      ReservedRegs.set(*R);
927
  }
928
 
929
  /// reservedRegsFrozen - Returns true after freezeReservedRegs() was called
930
  /// to ensure the set of reserved registers stays constant.
931
  bool reservedRegsFrozen() const {
932
    return !ReservedRegs.empty();
933
  }
934
 
935
  /// canReserveReg - Returns true if PhysReg can be used as a reserved
936
  /// register.  Any register can be reserved before freezeReservedRegs() is
937
  /// called.
938
  bool canReserveReg(MCRegister PhysReg) const {
939
    return !reservedRegsFrozen() || ReservedRegs.test(PhysReg);
940
  }
941
 
942
  /// getReservedRegs - Returns a reference to the frozen set of reserved
943
  /// registers. This method should always be preferred to calling
944
  /// TRI::getReservedRegs() when possible.
945
  const BitVector &getReservedRegs() const {
946
    assert(reservedRegsFrozen() &&
947
           "Reserved registers haven't been frozen yet. "
948
           "Use TRI::getReservedRegs().");
949
    return ReservedRegs;
950
  }
951
 
952
  /// isReserved - Returns true when PhysReg is a reserved register.
953
  ///
954
  /// Reserved registers may belong to an allocatable register class, but the
955
  /// target has explicitly requested that they are not used.
956
  bool isReserved(MCRegister PhysReg) const {
957
    return getReservedRegs().test(PhysReg.id());
958
  }
959
 
960
  /// Returns true when the given register unit is considered reserved.
961
  ///
962
  /// Register units are considered reserved when for at least one of their
963
  /// root registers, the root register and all super registers are reserved.
964
  /// This currently iterates the register hierarchy and may be slower than
965
  /// expected.
966
  bool isReservedRegUnit(unsigned Unit) const;
967
 
968
  /// isAllocatable - Returns true when PhysReg belongs to an allocatable
969
  /// register class and it hasn't been reserved.
970
  ///
971
  /// Allocatable registers may show up in the allocation order of some virtual
972
  /// register, so a register allocator needs to track its liveness and
973
  /// availability.
974
  bool isAllocatable(MCRegister PhysReg) const {
975
    return getTargetRegisterInfo()->isInAllocatableClass(PhysReg) &&
976
      !isReserved(PhysReg);
977
  }
978
 
979
  //===--------------------------------------------------------------------===//
980
  // LiveIn Management
981
  //===--------------------------------------------------------------------===//
982
 
983
  /// addLiveIn - Add the specified register as a live-in.  Note that it
984
  /// is an error to add the same register to the same set more than once.
985
  void addLiveIn(MCRegister Reg, Register vreg = Register()) {
986
    LiveIns.push_back(std::make_pair(Reg, vreg));
987
  }
988
 
989
  // Iteration support for the live-ins set.  It's kept in sorted order
990
  // by register number.
991
  using livein_iterator =
992
      std::vector<std::pair<MCRegister,Register>>::const_iterator;
993
  livein_iterator livein_begin() const { return LiveIns.begin(); }
994
  livein_iterator livein_end()   const { return LiveIns.end(); }
995
  bool            livein_empty() const { return LiveIns.empty(); }
996
 
997
  ArrayRef<std::pair<MCRegister, Register>> liveins() const {
998
    return LiveIns;
999
  }
1000
 
1001
  bool isLiveIn(Register Reg) const;
1002
 
1003
  /// getLiveInPhysReg - If VReg is a live-in virtual register, return the
1004
  /// corresponding live-in physical register.
1005
  MCRegister getLiveInPhysReg(Register VReg) const;
1006
 
1007
  /// getLiveInVirtReg - If PReg is a live-in physical register, return the
1008
  /// corresponding live-in virtual register.
1009
  Register getLiveInVirtReg(MCRegister PReg) const;
1010
 
1011
  /// EmitLiveInCopies - Emit copies to initialize livein virtual registers
1012
  /// into the given entry block.
1013
  void EmitLiveInCopies(MachineBasicBlock *EntryMBB,
1014
                        const TargetRegisterInfo &TRI,
1015
                        const TargetInstrInfo &TII);
1016
 
1017
  /// Returns a mask covering all bits that can appear in lane masks of
1018
  /// subregisters of the virtual register @p Reg.
1019
  LaneBitmask getMaxLaneMaskForVReg(Register Reg) const;
1020
 
1021
  /// defusechain_iterator - This class provides iterator support for machine
1022
  /// operands in the function that use or define a specific register.  If
1023
  /// ReturnUses is true it returns uses of registers, if ReturnDefs is true it
1024
  /// returns defs.  If neither are true then you are silly and it always
1025
  /// returns end().  If SkipDebug is true it skips uses marked Debug
1026
  /// when incrementing.
1027
  template <bool ReturnUses, bool ReturnDefs, bool SkipDebug, bool ByOperand,
1028
            bool ByInstr, bool ByBundle>
1029
  class defusechain_iterator {
1030
    friend class MachineRegisterInfo;
1031
 
1032
  public:
1033
    using iterator_category = std::forward_iterator_tag;
1034
    using value_type = MachineOperand;
1035
    using difference_type = std::ptrdiff_t;
1036
    using pointer = value_type *;
1037
    using reference = value_type &;
1038
 
1039
  private:
1040
    MachineOperand *Op = nullptr;
1041
 
1042
    explicit defusechain_iterator(MachineOperand *op) : Op(op) {
1043
      // If the first node isn't one we're interested in, advance to one that
1044
      // we are interested in.
1045
      if (op) {
1046
        if ((!ReturnUses && op->isUse()) ||
1047
            (!ReturnDefs && op->isDef()) ||
1048
            (SkipDebug && op->isDebug()))
1049
          advance();
1050
      }
1051
    }
1052
 
1053
    void advance() {
1054
      assert(Op && "Cannot increment end iterator!");
1055
      Op = getNextOperandForReg(Op);
1056
 
1057
      // All defs come before the uses, so stop def_iterator early.
1058
      if (!ReturnUses) {
1059
        if (Op) {
1060
          if (Op->isUse())
1061
            Op = nullptr;
1062
          else
1063
            assert(!Op->isDebug() && "Can't have debug defs");
1064
        }
1065
      } else {
1066
        // If this is an operand we don't care about, skip it.
1067
        while (Op && ((!ReturnDefs && Op->isDef()) ||
1068
                      (SkipDebug && Op->isDebug())))
1069
          Op = getNextOperandForReg(Op);
1070
      }
1071
    }
1072
 
1073
  public:
1074
    defusechain_iterator() = default;
1075
 
1076
    bool operator==(const defusechain_iterator &x) const {
1077
      return Op == x.Op;
1078
    }
1079
    bool operator!=(const defusechain_iterator &x) const {
1080
      return !operator==(x);
1081
    }
1082
 
1083
    /// atEnd - return true if this iterator is equal to reg_end() on the value.
1084
    bool atEnd() const { return Op == nullptr; }
1085
 
1086
    // Iterator traversal: forward iteration only
1087
    defusechain_iterator &operator++() {          // Preincrement
1088
      assert(Op && "Cannot increment end iterator!");
1089
      if (ByOperand)
1090
        advance();
1091
      else if (ByInstr) {
1092
        MachineInstr *P = Op->getParent();
1093
        do {
1094
          advance();
1095
        } while (Op && Op->getParent() == P);
1096
      } else if (ByBundle) {
1097
        MachineBasicBlock::instr_iterator P =
1098
            getBundleStart(Op->getParent()->getIterator());
1099
        do {
1100
          advance();
1101
        } while (Op && getBundleStart(Op->getParent()->getIterator()) == P);
1102
      }
1103
 
1104
      return *this;
1105
    }
1106
    defusechain_iterator operator++(int) {        // Postincrement
1107
      defusechain_iterator tmp = *this; ++*this; return tmp;
1108
    }
1109
 
1110
    /// getOperandNo - Return the operand # of this MachineOperand in its
1111
    /// MachineInstr.
1112
    unsigned getOperandNo() const {
1113
      assert(Op && "Cannot dereference end iterator!");
1114
      return Op - &Op->getParent()->getOperand(0);
1115
    }
1116
 
1117
    // Retrieve a reference to the current operand.
1118
    MachineOperand &operator*() const {
1119
      assert(Op && "Cannot dereference end iterator!");
1120
      return *Op;
1121
    }
1122
 
1123
    MachineOperand *operator->() const {
1124
      assert(Op && "Cannot dereference end iterator!");
1125
      return Op;
1126
    }
1127
  };
1128
 
1129
  /// defusechain_iterator - This class provides iterator support for machine
1130
  /// operands in the function that use or define a specific register.  If
1131
  /// ReturnUses is true it returns uses of registers, if ReturnDefs is true it
1132
  /// returns defs.  If neither are true then you are silly and it always
1133
  /// returns end().  If SkipDebug is true it skips uses marked Debug
1134
  /// when incrementing.
1135
  template <bool ReturnUses, bool ReturnDefs, bool SkipDebug, bool ByOperand,
1136
            bool ByInstr, bool ByBundle>
1137
  class defusechain_instr_iterator {
1138
    friend class MachineRegisterInfo;
1139
 
1140
  public:
1141
    using iterator_category = std::forward_iterator_tag;
1142
    using value_type = MachineInstr;
1143
    using difference_type = std::ptrdiff_t;
1144
    using pointer = value_type *;
1145
    using reference = value_type &;
1146
 
1147
  private:
1148
    MachineOperand *Op = nullptr;
1149
 
1150
    explicit defusechain_instr_iterator(MachineOperand *op) : Op(op) {
1151
      // If the first node isn't one we're interested in, advance to one that
1152
      // we are interested in.
1153
      if (op) {
1154
        if ((!ReturnUses && op->isUse()) ||
1155
            (!ReturnDefs && op->isDef()) ||
1156
            (SkipDebug && op->isDebug()))
1157
          advance();
1158
      }
1159
    }
1160
 
1161
    void advance() {
1162
      assert(Op && "Cannot increment end iterator!");
1163
      Op = getNextOperandForReg(Op);
1164
 
1165
      // All defs come before the uses, so stop def_iterator early.
1166
      if (!ReturnUses) {
1167
        if (Op) {
1168
          if (Op->isUse())
1169
            Op = nullptr;
1170
          else
1171
            assert(!Op->isDebug() && "Can't have debug defs");
1172
        }
1173
      } else {
1174
        // If this is an operand we don't care about, skip it.
1175
        while (Op && ((!ReturnDefs && Op->isDef()) ||
1176
                      (SkipDebug && Op->isDebug())))
1177
          Op = getNextOperandForReg(Op);
1178
      }
1179
    }
1180
 
1181
  public:
1182
    defusechain_instr_iterator() = default;
1183
 
1184
    bool operator==(const defusechain_instr_iterator &x) const {
1185
      return Op == x.Op;
1186
    }
1187
    bool operator!=(const defusechain_instr_iterator &x) const {
1188
      return !operator==(x);
1189
    }
1190
 
1191
    /// atEnd - return true if this iterator is equal to reg_end() on the value.
1192
    bool atEnd() const { return Op == nullptr; }
1193
 
1194
    // Iterator traversal: forward iteration only
1195
    defusechain_instr_iterator &operator++() {          // Preincrement
1196
      assert(Op && "Cannot increment end iterator!");
1197
      if (ByOperand)
1198
        advance();
1199
      else if (ByInstr) {
1200
        MachineInstr *P = Op->getParent();
1201
        do {
1202
          advance();
1203
        } while (Op && Op->getParent() == P);
1204
      } else if (ByBundle) {
1205
        MachineBasicBlock::instr_iterator P =
1206
            getBundleStart(Op->getParent()->getIterator());
1207
        do {
1208
          advance();
1209
        } while (Op && getBundleStart(Op->getParent()->getIterator()) == P);
1210
      }
1211
 
1212
      return *this;
1213
    }
1214
    defusechain_instr_iterator operator++(int) {        // Postincrement
1215
      defusechain_instr_iterator tmp = *this; ++*this; return tmp;
1216
    }
1217
 
1218
    // Retrieve a reference to the current operand.
1219
    MachineInstr &operator*() const {
1220
      assert(Op && "Cannot dereference end iterator!");
1221
      if (ByBundle)
1222
        return *getBundleStart(Op->getParent()->getIterator());
1223
      return *Op->getParent();
1224
    }
1225
 
1226
    MachineInstr *operator->() const { return &operator*(); }
1227
  };
1228
};
1229
 
1230
/// Iterate over the pressure sets affected by the given physical or virtual
1231
/// register. If Reg is physical, it must be a register unit (from
1232
/// MCRegUnitIterator).
1233
class PSetIterator {
1234
  const int *PSet = nullptr;
1235
  unsigned Weight = 0;
1236
 
1237
public:
1238
  PSetIterator() = default;
1239
 
1240
  PSetIterator(Register RegUnit, const MachineRegisterInfo *MRI) {
1241
    const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo();
1242
    if (RegUnit.isVirtual()) {
1243
      const TargetRegisterClass *RC = MRI->getRegClass(RegUnit);
1244
      PSet = TRI->getRegClassPressureSets(RC);
1245
      Weight = TRI->getRegClassWeight(RC).RegWeight;
1246
    } else {
1247
      PSet = TRI->getRegUnitPressureSets(RegUnit);
1248
      Weight = TRI->getRegUnitWeight(RegUnit);
1249
    }
1250
    if (*PSet == -1)
1251
      PSet = nullptr;
1252
  }
1253
 
1254
  bool isValid() const { return PSet; }
1255
 
1256
  unsigned getWeight() const { return Weight; }
1257
 
1258
  unsigned operator*() const { return *PSet; }
1259
 
1260
  void operator++() {
1261
    assert(isValid() && "Invalid PSetIterator.");
1262
    ++PSet;
1263
    if (*PSet == -1)
1264
      PSet = nullptr;
1265
  }
1266
};
1267
 
1268
inline PSetIterator
1269
MachineRegisterInfo::getPressureSets(Register RegUnit) const {
1270
  return PSetIterator(RegUnit, this);
1271
}
1272
 
1273
} // end namespace llvm
1274
 
1275
#endif // LLVM_CODEGEN_MACHINEREGISTERINFO_H