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/LiveRegUnits.h - Register Unit Set ----------*- 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
10
/// A set of register units. It is intended for register liveness tracking.
11
//
12
//===----------------------------------------------------------------------===//
13
 
14
#ifndef LLVM_CODEGEN_LIVEREGUNITS_H
15
#define LLVM_CODEGEN_LIVEREGUNITS_H
16
 
17
#include "llvm/ADT/BitVector.h"
18
#include "llvm/CodeGen/MachineInstrBundle.h"
19
#include "llvm/CodeGen/TargetRegisterInfo.h"
20
#include "llvm/MC/LaneBitmask.h"
21
#include "llvm/MC/MCRegisterInfo.h"
22
#include <cstdint>
23
 
24
namespace llvm {
25
 
26
class MachineInstr;
27
class MachineBasicBlock;
28
 
29
/// A set of register units used to track register liveness.
30
class LiveRegUnits {
31
  const TargetRegisterInfo *TRI = nullptr;
32
  BitVector Units;
33
 
34
public:
35
  /// Constructs a new empty LiveRegUnits set.
36
  LiveRegUnits() = default;
37
 
38
  /// Constructs and initialize an empty LiveRegUnits set.
39
  LiveRegUnits(const TargetRegisterInfo &TRI) {
40
    init(TRI);
41
  }
42
 
43
  /// For a machine instruction \p MI, adds all register units used in
44
  /// \p UsedRegUnits and defined or clobbered in \p ModifiedRegUnits. This is
45
  /// useful when walking over a range of instructions to track registers
46
  /// used or defined seperately.
47
  static void accumulateUsedDefed(const MachineInstr &MI,
48
                                  LiveRegUnits &ModifiedRegUnits,
49
                                  LiveRegUnits &UsedRegUnits,
50
                                  const TargetRegisterInfo *TRI) {
51
    for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
52
      if (O->isRegMask())
53
        ModifiedRegUnits.addRegsInMask(O->getRegMask());
54
      if (!O->isReg())
55
        continue;
56
      Register Reg = O->getReg();
57
      if (!Reg.isPhysical())
58
        continue;
59
      if (O->isDef()) {
60
        // Some architectures (e.g. AArch64 XZR/WZR) have registers that are
61
        // constant and may be used as destinations to indicate the generated
62
        // value is discarded. No need to track such case as a def.
63
        if (!TRI->isConstantPhysReg(Reg))
64
          ModifiedRegUnits.addReg(Reg);
65
      } else {
66
        assert(O->isUse() && "Reg operand not a def and not a use");
67
        UsedRegUnits.addReg(Reg);
68
      }
69
    }
70
  }
71
 
72
  /// Initialize and clear the set.
73
  void init(const TargetRegisterInfo &TRI) {
74
    this->TRI = &TRI;
75
    Units.reset();
76
    Units.resize(TRI.getNumRegUnits());
77
  }
78
 
79
  /// Clears the set.
80
  void clear() { Units.reset(); }
81
 
82
  /// Returns true if the set is empty.
83
  bool empty() const { return Units.none(); }
84
 
85
  /// Adds register units covered by physical register \p Reg.
86
  void addReg(MCPhysReg Reg) {
87
    for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit)
88
      Units.set(*Unit);
89
  }
90
 
91
  /// Adds register units covered by physical register \p Reg that are
92
  /// part of the lanemask \p Mask.
93
  void addRegMasked(MCPhysReg Reg, LaneBitmask Mask) {
94
    for (MCRegUnitMaskIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
95
      LaneBitmask UnitMask = (*Unit).second;
96
      if (UnitMask.none() || (UnitMask & Mask).any())
97
        Units.set((*Unit).first);
98
    }
99
  }
100
 
101
  /// Removes all register units covered by physical register \p Reg.
102
  void removeReg(MCPhysReg Reg) {
103
    for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit)
104
      Units.reset(*Unit);
105
  }
106
 
107
  /// Removes register units not preserved by the regmask \p RegMask.
108
  /// The regmask has the same format as the one in the RegMask machine operand.
109
  void removeRegsNotPreserved(const uint32_t *RegMask);
110
 
111
  /// Adds register units not preserved by the regmask \p RegMask.
112
  /// The regmask has the same format as the one in the RegMask machine operand.
113
  void addRegsInMask(const uint32_t *RegMask);
114
 
115
  /// Returns true if no part of physical register \p Reg is live.
116
  bool available(MCPhysReg Reg) const {
117
    for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
118
      if (Units.test(*Unit))
119
        return false;
120
    }
121
    return true;
122
  }
123
 
124
  /// Updates liveness when stepping backwards over the instruction \p MI.
125
  /// This removes all register units defined or clobbered in \p MI and then
126
  /// adds the units used (as in use operands) in \p MI.
127
  void stepBackward(const MachineInstr &MI);
128
 
129
  /// Adds all register units used, defined or clobbered in \p MI.
130
  /// This is useful when walking over a range of instruction to find registers
131
  /// unused over the whole range.
132
  void accumulate(const MachineInstr &MI);
133
 
134
  /// Adds registers living out of block \p MBB.
135
  /// Live out registers are the union of the live-in registers of the successor
136
  /// blocks and pristine registers. Live out registers of the end block are the
137
  /// callee saved registers.
138
  void addLiveOuts(const MachineBasicBlock &MBB);
139
 
140
  /// Adds registers living into block \p MBB.
141
  void addLiveIns(const MachineBasicBlock &MBB);
142
 
143
  /// Adds all register units marked in the bitvector \p RegUnits.
144
  void addUnits(const BitVector &RegUnits) {
145
    Units |= RegUnits;
146
  }
147
  /// Removes all register units marked in the bitvector \p RegUnits.
148
  void removeUnits(const BitVector &RegUnits) {
149
    Units.reset(RegUnits);
150
  }
151
  /// Return the internal bitvector representation of the set.
152
  const BitVector &getBitVector() const {
153
    return Units;
154
  }
155
 
156
private:
157
  /// Adds pristine registers. Pristine registers are callee saved registers
158
  /// that are unused in the function.
159
  void addPristines(const MachineFunction &MF);
160
};
161
 
162
/// Returns an iterator range over all physical register and mask operands for
163
/// \p MI and bundled instructions. This also skips any debug operands.
164
inline iterator_range<filter_iterator<
165
    ConstMIBundleOperands, std::function<bool(const MachineOperand &)>>>
166
phys_regs_and_masks(const MachineInstr &MI) {
167
  std::function<bool(const MachineOperand &)> Pred =
168
      [](const MachineOperand &MOP) {
169
        return MOP.isRegMask() ||
170
               (MOP.isReg() && !MOP.isDebug() && MOP.getReg().isPhysical());
171
      };
172
  return make_filter_range(const_mi_bundle_ops(MI), Pred);
173
}
174
 
175
} // end namespace llvm
176
 
177
#endif // LLVM_CODEGEN_LIVEREGUNITS_H