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/MachineInstrBundle.h - MI bundle utilities --*- 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 provide utility functions to manipulate machine instruction
10
// bundles.
11
//
12
//===----------------------------------------------------------------------===//
13
 
14
#ifndef LLVM_CODEGEN_MACHINEINSTRBUNDLE_H
15
#define LLVM_CODEGEN_MACHINEINSTRBUNDLE_H
16
 
17
#include "llvm/CodeGen/MachineBasicBlock.h"
18
 
19
namespace llvm {
20
 
21
/// finalizeBundle - Finalize a machine instruction bundle which includes
22
/// a sequence of instructions starting from FirstMI to LastMI (exclusive).
23
/// This routine adds a BUNDLE instruction to represent the bundle, it adds
24
/// IsInternalRead markers to MachineOperands which are defined inside the
25
/// bundle, and it copies externally visible defs and uses to the BUNDLE
26
/// instruction.
27
void finalizeBundle(MachineBasicBlock &MBB,
28
                    MachineBasicBlock::instr_iterator FirstMI,
29
                    MachineBasicBlock::instr_iterator LastMI);
30
 
31
/// finalizeBundle - Same functionality as the previous finalizeBundle except
32
/// the last instruction in the bundle is not provided as an input. This is
33
/// used in cases where bundles are pre-determined by marking instructions
34
/// with 'InsideBundle' marker. It returns the MBB instruction iterator that
35
/// points to the end of the bundle.
36
MachineBasicBlock::instr_iterator finalizeBundle(MachineBasicBlock &MBB,
37
                    MachineBasicBlock::instr_iterator FirstMI);
38
 
39
/// finalizeBundles - Finalize instruction bundles in the specified
40
/// MachineFunction. Return true if any bundles are finalized.
41
bool finalizeBundles(MachineFunction &MF);
42
 
43
/// Returns an iterator to the first instruction in the bundle containing \p I.
44
inline MachineBasicBlock::instr_iterator getBundleStart(
45
    MachineBasicBlock::instr_iterator I) {
46
  while (I->isBundledWithPred())
47
    --I;
48
  return I;
49
}
50
 
51
/// Returns an iterator to the first instruction in the bundle containing \p I.
52
inline MachineBasicBlock::const_instr_iterator getBundleStart(
53
    MachineBasicBlock::const_instr_iterator I) {
54
  while (I->isBundledWithPred())
55
    --I;
56
  return I;
57
}
58
 
59
/// Returns an iterator pointing beyond the bundle containing \p I.
60
inline MachineBasicBlock::instr_iterator getBundleEnd(
61
    MachineBasicBlock::instr_iterator I) {
62
  while (I->isBundledWithSucc())
63
    ++I;
64
  ++I;
65
  return I;
66
}
67
 
68
/// Returns an iterator pointing beyond the bundle containing \p I.
69
inline MachineBasicBlock::const_instr_iterator getBundleEnd(
70
    MachineBasicBlock::const_instr_iterator I) {
71
  while (I->isBundledWithSucc())
72
    ++I;
73
  ++I;
74
  return I;
75
}
76
 
77
//===----------------------------------------------------------------------===//
78
// MachineBundleOperand iterator
79
//
80
 
81
/// MIBundleOperandIteratorBase - Iterator that visits all operands in a bundle
82
/// of MachineInstrs. This class is not intended to be used directly, use one
83
/// of the sub-classes instead.
84
///
85
/// Intended use:
86
///
87
///   for (MIBundleOperands MIO(MI); MIO.isValid(); ++MIO) {
88
///     if (!MIO->isReg())
89
///       continue;
90
///     ...
91
///   }
92
///
93
template <typename ValueT>
94
class MIBundleOperandIteratorBase
95
    : public iterator_facade_base<MIBundleOperandIteratorBase<ValueT>,
96
                                  std::forward_iterator_tag, ValueT> {
97
  MachineBasicBlock::instr_iterator InstrI, InstrE;
98
  MachineInstr::mop_iterator OpI, OpE;
99
 
100
  // If the operands on InstrI are exhausted, advance InstrI to the next
101
  // bundled instruction with operands.
102
  void advance() {
103
    while (OpI == OpE) {
104
      // Don't advance off the basic block, or into a new bundle.
105
      if (++InstrI == InstrE || !InstrI->isInsideBundle()) {
106
        InstrI = InstrE;
107
        break;
108
      }
109
      OpI = InstrI->operands_begin();
110
      OpE = InstrI->operands_end();
111
    }
112
  }
113
 
114
protected:
115
  /// MIBundleOperandIteratorBase - Create an iterator that visits all operands
116
  /// on MI, or all operands on every instruction in the bundle containing MI.
117
  ///
118
  /// @param MI The instruction to examine.
119
  ///
120
  explicit MIBundleOperandIteratorBase(MachineInstr &MI) {
121
    InstrI = getBundleStart(MI.getIterator());
122
    InstrE = MI.getParent()->instr_end();
123
    OpI = InstrI->operands_begin();
124
    OpE = InstrI->operands_end();
125
    advance();
126
  }
127
 
128
  /// Constructor for an iterator past the last iteration: both instruction
129
  /// iterators point to the end of the BB and OpI == OpE.
130
  explicit MIBundleOperandIteratorBase(MachineBasicBlock::instr_iterator InstrE,
131
                                       MachineInstr::mop_iterator OpE)
132
      : InstrI(InstrE), InstrE(InstrE), OpI(OpE), OpE(OpE) {}
133
 
134
public:
135
  /// isValid - Returns true until all the operands have been visited.
136
  bool isValid() const { return OpI != OpE; }
137
 
138
  /// Preincrement.  Move to the next operand.
139
  void operator++() {
140
    assert(isValid() && "Cannot advance MIOperands beyond the last operand");
141
    ++OpI;
142
    advance();
143
  }
144
 
145
  ValueT &operator*() const { return *OpI; }
146
  ValueT *operator->() const { return &*OpI; }
147
 
148
  bool operator==(const MIBundleOperandIteratorBase &Arg) const {
149
    // Iterators are equal, if InstrI matches and either OpIs match or OpI ==
150
    // OpE match for both. The second condition allows us to construct an 'end'
151
    // iterator, without finding the last instruction in a bundle up-front.
152
    return InstrI == Arg.InstrI &&
153
           (OpI == Arg.OpI || (OpI == OpE && Arg.OpI == Arg.OpE));
154
  }
155
  /// getOperandNo - Returns the number of the current operand relative to its
156
  /// instruction.
157
  ///
158
  unsigned getOperandNo() const {
159
    return OpI - InstrI->operands_begin();
160
  }
161
};
162
 
163
/// MIBundleOperands - Iterate over all operands in a bundle of machine
164
/// instructions.
165
///
166
class MIBundleOperands : public MIBundleOperandIteratorBase<MachineOperand> {
167
  /// Constructor for an iterator past the last iteration.
168
  MIBundleOperands(MachineBasicBlock::instr_iterator InstrE,
169
                   MachineInstr::mop_iterator OpE)
170
      : MIBundleOperandIteratorBase(InstrE, OpE) {}
171
 
172
public:
173
  MIBundleOperands(MachineInstr &MI) : MIBundleOperandIteratorBase(MI) {}
174
 
175
  /// Returns an iterator past the last iteration.
176
  static MIBundleOperands end(const MachineBasicBlock &MBB) {
177
    return {const_cast<MachineBasicBlock &>(MBB).instr_end(),
178
            const_cast<MachineBasicBlock &>(MBB).instr_begin()->operands_end()};
179
  }
180
};
181
 
182
/// ConstMIBundleOperands - Iterate over all operands in a const bundle of
183
/// machine instructions.
184
///
185
class ConstMIBundleOperands
186
    : public MIBundleOperandIteratorBase<const MachineOperand> {
187
 
188
  /// Constructor for an iterator past the last iteration.
189
  ConstMIBundleOperands(MachineBasicBlock::instr_iterator InstrE,
190
                        MachineInstr::mop_iterator OpE)
191
      : MIBundleOperandIteratorBase(InstrE, OpE) {}
192
 
193
public:
194
  ConstMIBundleOperands(const MachineInstr &MI)
195
      : MIBundleOperandIteratorBase(const_cast<MachineInstr &>(MI)) {}
196
 
197
  /// Returns an iterator past the last iteration.
198
  static ConstMIBundleOperands end(const MachineBasicBlock &MBB) {
199
    return {const_cast<MachineBasicBlock &>(MBB).instr_end(),
200
            const_cast<MachineBasicBlock &>(MBB).instr_begin()->operands_end()};
201
  }
202
};
203
 
204
inline iterator_range<ConstMIBundleOperands>
205
const_mi_bundle_ops(const MachineInstr &MI) {
206
  return make_range(ConstMIBundleOperands(MI),
207
                    ConstMIBundleOperands::end(*MI.getParent()));
208
}
209
 
210
inline iterator_range<MIBundleOperands> mi_bundle_ops(MachineInstr &MI) {
211
  return make_range(MIBundleOperands(MI),
212
                    MIBundleOperands::end(*MI.getParent()));
213
}
214
 
215
/// VirtRegInfo - Information about a virtual register used by a set of
216
/// operands.
217
///
218
struct VirtRegInfo {
219
  /// Reads - One of the operands read the virtual register.  This does not
220
  /// include undef or internal use operands, see MO::readsReg().
221
  bool Reads;
222
 
223
  /// Writes - One of the operands writes the virtual register.
224
  bool Writes;
225
 
226
  /// Tied - Uses and defs must use the same register. This can be because of
227
  /// a two-address constraint, or there may be a partial redefinition of a
228
  /// sub-register.
229
  bool Tied;
230
};
231
 
232
/// AnalyzeVirtRegInBundle - Analyze how the current instruction or bundle uses
233
/// a virtual register.  This function should not be called after operator++(),
234
/// it expects a fresh iterator.
235
///
236
/// @param Reg The virtual register to analyze.
237
/// @param Ops When set, this vector will receive an (MI, OpNum) entry for
238
///            each operand referring to Reg.
239
/// @returns A filled-in RegInfo struct.
240
VirtRegInfo AnalyzeVirtRegInBundle(
241
    MachineInstr &MI, Register Reg,
242
    SmallVectorImpl<std::pair<MachineInstr *, unsigned>> *Ops = nullptr);
243
 
244
/// Information about how a physical register Reg is used by a set of
245
/// operands.
246
struct PhysRegInfo {
247
  /// There is a regmask operand indicating Reg is clobbered.
248
  /// \see MachineOperand::CreateRegMask().
249
  bool Clobbered;
250
 
251
  /// Reg or one of its aliases is defined. The definition may only cover
252
  /// parts of the register.
253
  bool Defined;
254
  /// Reg or a super-register is defined. The definition covers the full
255
  /// register.
256
  bool FullyDefined;
257
 
258
  /// Reg or one of its aliases is read. The register may only be read
259
  /// partially.
260
  bool Read;
261
  /// Reg or a super-register is read. The full register is read.
262
  bool FullyRead;
263
 
264
  /// Either:
265
  /// - Reg is FullyDefined and all defs of reg or an overlapping
266
  ///   register are dead, or
267
  /// - Reg is completely dead because "defined" by a clobber.
268
  bool DeadDef;
269
 
270
  /// Reg is Defined and all defs of reg or an overlapping register are
271
  /// dead.
272
  bool PartialDeadDef;
273
 
274
  /// There is a use operand of reg or a super-register with kill flag set.
275
  bool Killed;
276
};
277
 
278
/// AnalyzePhysRegInBundle - Analyze how the current instruction or bundle uses
279
/// a physical register.  This function should not be called after operator++(),
280
/// it expects a fresh iterator.
281
///
282
/// @param Reg The physical register to analyze.
283
/// @returns A filled-in PhysRegInfo struct.
284
PhysRegInfo AnalyzePhysRegInBundle(const MachineInstr &MI, Register Reg,
285
                                   const TargetRegisterInfo *TRI);
286
 
287
} // End llvm namespace
288
 
289
#endif