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/MachineOperand.h - MachineOperand class ----*- 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 contains the declaration of the MachineOperand class.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_CODEGEN_MACHINEOPERAND_H
14
#define LLVM_CODEGEN_MACHINEOPERAND_H
15
 
16
#include "llvm/ADT/DenseMapInfo.h"
17
#include "llvm/CodeGen/Register.h"
18
#include "llvm/IR/Intrinsics.h"
19
#include <cassert>
20
 
21
namespace llvm {
22
 
23
class LLT;
24
class BlockAddress;
25
class Constant;
26
class ConstantFP;
27
class ConstantInt;
28
class GlobalValue;
29
class MachineBasicBlock;
30
class MachineInstr;
31
class MachineRegisterInfo;
32
class MCCFIInstruction;
33
class MDNode;
34
class ModuleSlotTracker;
35
class TargetIntrinsicInfo;
36
class TargetRegisterInfo;
37
class hash_code;
38
class raw_ostream;
39
class MCSymbol;
40
 
41
/// MachineOperand class - Representation of each machine instruction operand.
42
///
43
/// This class isn't a POD type because it has a private constructor, but its
44
/// destructor must be trivial. Functions like MachineInstr::addOperand(),
45
/// MachineRegisterInfo::moveOperands(), and MF::DeleteMachineInstr() depend on
46
/// not having to call the MachineOperand destructor.
47
///
48
class MachineOperand {
49
public:
50
  enum MachineOperandType : unsigned char {
51
    MO_Register,          ///< Register operand.
52
    MO_Immediate,         ///< Immediate operand
53
    MO_CImmediate,        ///< Immediate >64bit operand
54
    MO_FPImmediate,       ///< Floating-point immediate operand
55
    MO_MachineBasicBlock, ///< MachineBasicBlock reference
56
    MO_FrameIndex,        ///< Abstract Stack Frame Index
57
    MO_ConstantPoolIndex, ///< Address of indexed Constant in Constant Pool
58
    MO_TargetIndex,       ///< Target-dependent index+offset operand.
59
    MO_JumpTableIndex,    ///< Address of indexed Jump Table for switch
60
    MO_ExternalSymbol,    ///< Name of external global symbol
61
    MO_GlobalAddress,     ///< Address of a global value
62
    MO_BlockAddress,      ///< Address of a basic block
63
    MO_RegisterMask,      ///< Mask of preserved registers.
64
    MO_RegisterLiveOut,   ///< Mask of live-out registers.
65
    MO_Metadata,          ///< Metadata reference (for debug info)
66
    MO_MCSymbol,          ///< MCSymbol reference (for debug/eh info)
67
    MO_CFIIndex,          ///< MCCFIInstruction index.
68
    MO_IntrinsicID,       ///< Intrinsic ID for ISel
69
    MO_Predicate,         ///< Generic predicate for ISel
70
    MO_ShuffleMask,       ///< Other IR Constant for ISel (shuffle masks)
71
    MO_DbgInstrRef, ///< Integer indices referring to an instruction+operand
72
    MO_Last = MO_DbgInstrRef
73
  };
74
 
75
private:
76
  /// OpKind - Specify what kind of operand this is.  This discriminates the
77
  /// union.
78
  unsigned OpKind : 8;
79
 
80
  /// Subregister number for MO_Register.  A value of 0 indicates the
81
  /// MO_Register has no subReg.
82
  ///
83
  /// For all other kinds of operands, this field holds target-specific flags.
84
  unsigned SubReg_TargetFlags : 12;
85
 
86
  /// TiedTo - Non-zero when this register operand is tied to another register
87
  /// operand. The encoding of this field is described in the block comment
88
  /// before MachineInstr::tieOperands().
89
  unsigned TiedTo : 4;
90
 
91
  /// IsDef - True if this is a def, false if this is a use of the register.
92
  /// This is only valid on register operands.
93
  ///
94
  unsigned IsDef : 1;
95
 
96
  /// IsImp - True if this is an implicit def or use, false if it is explicit.
97
  /// This is only valid on register opderands.
98
  ///
99
  unsigned IsImp : 1;
100
 
101
  /// IsDeadOrKill
102
  /// For uses: IsKill - Conservatively indicates the last use of a register
103
  /// on this path through the function. A register operand with true value of
104
  /// this flag must be the last use of the register, a register operand with
105
  /// false value may or may not be the last use of the register. After regalloc
106
  /// we can use recomputeLivenessFlags to get precise kill flags.
107
  /// For defs: IsDead - True if this register is never used by a subsequent
108
  /// instruction.
109
  /// This is only valid on register operands.
110
  unsigned IsDeadOrKill : 1;
111
 
112
  /// See isRenamable().
113
  unsigned IsRenamable : 1;
114
 
115
  /// IsUndef - True if this register operand reads an "undef" value, i.e. the
116
  /// read value doesn't matter.  This flag can be set on both use and def
117
  /// operands.  On a sub-register def operand, it refers to the part of the
118
  /// register that isn't written.  On a full-register def operand, it is a
119
  /// noop.  See readsReg().
120
  ///
121
  /// This is only valid on registers.
122
  ///
123
  /// Note that an instruction may have multiple <undef> operands referring to
124
  /// the same register.  In that case, the instruction may depend on those
125
  /// operands reading the same dont-care value.  For example:
126
  ///
127
  ///   %1 = XOR undef %2, undef %2
128
  ///
129
  /// Any register can be used for %2, and its value doesn't matter, but
130
  /// the two operands must be the same register.
131
  ///
132
  unsigned IsUndef : 1;
133
 
134
  /// IsInternalRead - True if this operand reads a value that was defined
135
  /// inside the same instruction or bundle.  This flag can be set on both use
136
  /// and def operands.  On a sub-register def operand, it refers to the part
137
  /// of the register that isn't written.  On a full-register def operand, it
138
  /// is a noop.
139
  ///
140
  /// When this flag is set, the instruction bundle must contain at least one
141
  /// other def of the register.  If multiple instructions in the bundle define
142
  /// the register, the meaning is target-defined.
143
  unsigned IsInternalRead : 1;
144
 
145
  /// IsEarlyClobber - True if this MO_Register 'def' operand is written to
146
  /// by the MachineInstr before all input registers are read.  This is used to
147
  /// model the GCC inline asm '&' constraint modifier.
148
  unsigned IsEarlyClobber : 1;
149
 
150
  /// IsDebug - True if this MO_Register 'use' operand is in a debug pseudo,
151
  /// not a real instruction.  Such uses should be ignored during codegen.
152
  unsigned IsDebug : 1;
153
 
154
  /// SmallContents - This really should be part of the Contents union, but
155
  /// lives out here so we can get a better packed struct.
156
  /// MO_Register: Register number.
157
  /// OffsetedInfo: Low bits of offset.
158
  union {
159
    unsigned RegNo;           // For MO_Register.
160
    unsigned OffsetLo;        // Matches Contents.OffsetedInfo.OffsetHi.
161
  } SmallContents;
162
 
163
  /// ParentMI - This is the instruction that this operand is embedded into.
164
  /// This is valid for all operand types, when the operand is in an instr.
165
  MachineInstr *ParentMI = nullptr;
166
 
167
  /// Contents union - This contains the payload for the various operand types.
168
  union ContentsUnion {
169
    ContentsUnion() {}
170
    MachineBasicBlock *MBB;  // For MO_MachineBasicBlock.
171
    const ConstantFP *CFP;   // For MO_FPImmediate.
172
    const ConstantInt *CI;   // For MO_CImmediate. Integers > 64bit.
173
    int64_t ImmVal;          // For MO_Immediate.
174
    const uint32_t *RegMask; // For MO_RegisterMask and MO_RegisterLiveOut.
175
    const MDNode *MD;        // For MO_Metadata.
176
    MCSymbol *Sym;           // For MO_MCSymbol.
177
    unsigned CFIIndex;       // For MO_CFI.
178
    Intrinsic::ID IntrinsicID; // For MO_IntrinsicID.
179
    unsigned Pred;           // For MO_Predicate
180
    ArrayRef<int> ShuffleMask; // For MO_ShuffleMask
181
 
182
    struct {                  // For MO_Register.
183
      // Register number is in SmallContents.RegNo.
184
      MachineOperand *Prev;   // Access list for register. See MRI.
185
      MachineOperand *Next;
186
    } Reg;
187
 
188
    struct { // For MO_DbgInstrRef.
189
      unsigned InstrIdx;
190
      unsigned OpIdx;
191
    } InstrRef;
192
 
193
    /// OffsetedInfo - This struct contains the offset and an object identifier.
194
    /// this represent the object as with an optional offset from it.
195
    struct {
196
      union {
197
        int Index;                // For MO_*Index - The index itself.
198
        const char *SymbolName;   // For MO_ExternalSymbol.
199
        const GlobalValue *GV;    // For MO_GlobalAddress.
200
        const BlockAddress *BA;   // For MO_BlockAddress.
201
      } Val;
202
      // Low bits of offset are in SmallContents.OffsetLo.
203
      int OffsetHi;               // An offset from the object, high 32 bits.
204
    } OffsetedInfo;
205
  } Contents;
206
 
207
  explicit MachineOperand(MachineOperandType K)
208
      : OpKind(K), SubReg_TargetFlags(0) {
209
    // Assert that the layout is what we expect. It's easy to grow this object.
210
    static_assert(alignof(MachineOperand) <= alignof(int64_t),
211
                  "MachineOperand shouldn't be more than 8 byte aligned");
212
    static_assert(sizeof(Contents) <= 2 * sizeof(void *),
213
                  "Contents should be at most two pointers");
214
    static_assert(sizeof(MachineOperand) <=
215
                      alignTo<alignof(int64_t)>(2 * sizeof(unsigned) +
216
                                                3 * sizeof(void *)),
217
                  "MachineOperand too big. Should be Kind, SmallContents, "
218
                  "ParentMI, and Contents");
219
  }
220
 
221
public:
222
  /// getType - Returns the MachineOperandType for this operand.
223
  ///
224
  MachineOperandType getType() const { return (MachineOperandType)OpKind; }
225
 
226
  unsigned getTargetFlags() const {
227
    return isReg() ? 0 : SubReg_TargetFlags;
228
  }
229
  void setTargetFlags(unsigned F) {
230
    assert(!isReg() && "Register operands can't have target flags");
231
    SubReg_TargetFlags = F;
232
    assert(SubReg_TargetFlags == F && "Target flags out of range");
233
  }
234
  void addTargetFlag(unsigned F) {
235
    assert(!isReg() && "Register operands can't have target flags");
236
    SubReg_TargetFlags |= F;
237
    assert((SubReg_TargetFlags & F) && "Target flags out of range");
238
  }
239
 
240
 
241
  /// getParent - Return the instruction that this operand belongs to.
242
  ///
243
  MachineInstr *getParent() { return ParentMI; }
244
  const MachineInstr *getParent() const { return ParentMI; }
245
 
246
  /// clearParent - Reset the parent pointer.
247
  ///
248
  /// The MachineOperand copy constructor also copies ParentMI, expecting the
249
  /// original to be deleted. If a MachineOperand is ever stored outside a
250
  /// MachineInstr, the parent pointer must be cleared.
251
  ///
252
  /// Never call clearParent() on an operand in a MachineInstr.
253
  ///
254
  void clearParent() { ParentMI = nullptr; }
255
 
256
  /// Print a subreg index operand.
257
  /// MO_Immediate operands can also be subreg idices. If it's the case, the
258
  /// subreg index name will be printed. MachineInstr::isOperandSubregIdx can be
259
  /// called to check this.
260
  static void printSubRegIdx(raw_ostream &OS, uint64_t Index,
261
                             const TargetRegisterInfo *TRI);
262
 
263
  /// Print operand target flags.
264
  static void printTargetFlags(raw_ostream& OS, const MachineOperand &Op);
265
 
266
  /// Print a MCSymbol as an operand.
267
  static void printSymbol(raw_ostream &OS, MCSymbol &Sym);
268
 
269
  /// Print a stack object reference.
270
  static void printStackObjectReference(raw_ostream &OS, unsigned FrameIndex,
271
                                        bool IsFixed, StringRef Name);
272
 
273
  /// Print the offset with explicit +/- signs.
274
  static void printOperandOffset(raw_ostream &OS, int64_t Offset);
275
 
276
  /// Print an IRSlotNumber.
277
  static void printIRSlotNumber(raw_ostream &OS, int Slot);
278
 
279
  /// Print the MachineOperand to \p os.
280
  /// Providing a valid \p TRI and \p IntrinsicInfo results in a more
281
  /// target-specific printing. If \p TRI and \p IntrinsicInfo are null, the
282
  /// function will try to pick it up from the parent.
283
  void print(raw_ostream &os, const TargetRegisterInfo *TRI = nullptr,
284
             const TargetIntrinsicInfo *IntrinsicInfo = nullptr) const;
285
 
286
  /// More complex way of printing a MachineOperand.
287
  /// \param TypeToPrint specifies the generic type to be printed on uses and
288
  /// defs. It can be determined using MachineInstr::getTypeToPrint.
289
  /// \param OpIdx - specifies the index of the operand in machine instruction.
290
  /// This will be used by target dependent MIR formatter. Could be std::nullopt
291
  /// if the index is unknown, e.g. called by dump().
292
  /// \param PrintDef - whether we want to print `def` on an operand which
293
  /// isDef. Sometimes, if the operand is printed before '=', we don't print
294
  /// `def`.
295
  /// \param IsStandalone - whether we want a verbose output of the MO. This
296
  /// prints extra information that can be easily inferred when printing the
297
  /// whole function, but not when printing only a fragment of it.
298
  /// \param ShouldPrintRegisterTies - whether we want to print register ties.
299
  /// Sometimes they are easily determined by the instruction's descriptor
300
  /// (MachineInstr::hasComplexRegiterTies can determine if it's needed).
301
  /// \param TiedOperandIdx - if we need to print register ties this needs to
302
  /// provide the index of the tied register. If not, it will be ignored.
303
  /// \param TRI - provide more target-specific information to the printer.
304
  /// Unlike the previous function, this one will not try and get the
305
  /// information from it's parent.
306
  /// \param IntrinsicInfo - same as \p TRI.
307
  void print(raw_ostream &os, ModuleSlotTracker &MST, LLT TypeToPrint,
308
             std::optional<unsigned> OpIdx, bool PrintDef, bool IsStandalone,
309
             bool ShouldPrintRegisterTies, unsigned TiedOperandIdx,
310
             const TargetRegisterInfo *TRI,
311
             const TargetIntrinsicInfo *IntrinsicInfo) const;
312
 
313
  /// Same as print(os, TRI, IntrinsicInfo), but allows to specify the low-level
314
  /// type to be printed the same way the full version of print(...) does it.
315
  void print(raw_ostream &os, LLT TypeToPrint,
316
             const TargetRegisterInfo *TRI = nullptr,
317
             const TargetIntrinsicInfo *IntrinsicInfo = nullptr) const;
318
 
319
  void dump() const;
320
 
321
  //===--------------------------------------------------------------------===//
322
  // Accessors that tell you what kind of MachineOperand you're looking at.
323
  //===--------------------------------------------------------------------===//
324
 
325
  /// isReg - Tests if this is a MO_Register operand.
326
  bool isReg() const { return OpKind == MO_Register; }
327
  /// isImm - Tests if this is a MO_Immediate operand.
328
  bool isImm() const { return OpKind == MO_Immediate; }
329
  /// isCImm - Test if this is a MO_CImmediate operand.
330
  bool isCImm() const { return OpKind == MO_CImmediate; }
331
  /// isFPImm - Tests if this is a MO_FPImmediate operand.
332
  bool isFPImm() const { return OpKind == MO_FPImmediate; }
333
  /// isMBB - Tests if this is a MO_MachineBasicBlock operand.
334
  bool isMBB() const { return OpKind == MO_MachineBasicBlock; }
335
  /// isFI - Tests if this is a MO_FrameIndex operand.
336
  bool isFI() const { return OpKind == MO_FrameIndex; }
337
  /// isCPI - Tests if this is a MO_ConstantPoolIndex operand.
338
  bool isCPI() const { return OpKind == MO_ConstantPoolIndex; }
339
  /// isTargetIndex - Tests if this is a MO_TargetIndex operand.
340
  bool isTargetIndex() const { return OpKind == MO_TargetIndex; }
341
  /// isJTI - Tests if this is a MO_JumpTableIndex operand.
342
  bool isJTI() const { return OpKind == MO_JumpTableIndex; }
343
  /// isGlobal - Tests if this is a MO_GlobalAddress operand.
344
  bool isGlobal() const { return OpKind == MO_GlobalAddress; }
345
  /// isSymbol - Tests if this is a MO_ExternalSymbol operand.
346
  bool isSymbol() const { return OpKind == MO_ExternalSymbol; }
347
  /// isBlockAddress - Tests if this is a MO_BlockAddress operand.
348
  bool isBlockAddress() const { return OpKind == MO_BlockAddress; }
349
  /// isRegMask - Tests if this is a MO_RegisterMask operand.
350
  bool isRegMask() const { return OpKind == MO_RegisterMask; }
351
  /// isRegLiveOut - Tests if this is a MO_RegisterLiveOut operand.
352
  bool isRegLiveOut() const { return OpKind == MO_RegisterLiveOut; }
353
  /// isMetadata - Tests if this is a MO_Metadata operand.
354
  bool isMetadata() const { return OpKind == MO_Metadata; }
355
  bool isMCSymbol() const { return OpKind == MO_MCSymbol; }
356
  bool isDbgInstrRef() const { return OpKind == MO_DbgInstrRef; }
357
  bool isCFIIndex() const { return OpKind == MO_CFIIndex; }
358
  bool isIntrinsicID() const { return OpKind == MO_IntrinsicID; }
359
  bool isPredicate() const { return OpKind == MO_Predicate; }
360
  bool isShuffleMask() const { return OpKind == MO_ShuffleMask; }
361
  //===--------------------------------------------------------------------===//
362
  // Accessors for Register Operands
363
  //===--------------------------------------------------------------------===//
364
 
365
  /// getReg - Returns the register number.
366
  Register getReg() const {
367
    assert(isReg() && "This is not a register operand!");
368
    return Register(SmallContents.RegNo);
369
  }
370
 
371
  unsigned getSubReg() const {
372
    assert(isReg() && "Wrong MachineOperand accessor");
373
    return SubReg_TargetFlags;
374
  }
375
 
376
  bool isUse() const {
377
    assert(isReg() && "Wrong MachineOperand accessor");
378
    return !IsDef;
379
  }
380
 
381
  bool isDef() const {
382
    assert(isReg() && "Wrong MachineOperand accessor");
383
    return IsDef;
384
  }
385
 
386
  bool isImplicit() const {
387
    assert(isReg() && "Wrong MachineOperand accessor");
388
    return IsImp;
389
  }
390
 
391
  bool isDead() const {
392
    assert(isReg() && "Wrong MachineOperand accessor");
393
    return IsDeadOrKill & IsDef;
394
  }
395
 
396
  bool isKill() const {
397
    assert(isReg() && "Wrong MachineOperand accessor");
398
    return IsDeadOrKill & !IsDef;
399
  }
400
 
401
  bool isUndef() const {
402
    assert(isReg() && "Wrong MachineOperand accessor");
403
    return IsUndef;
404
  }
405
 
406
  /// isRenamable - Returns true if this register may be renamed, i.e. it does
407
  /// not generate a value that is somehow read in a way that is not represented
408
  /// by the Machine IR (e.g. to meet an ABI or ISA requirement).  This is only
409
  /// valid on physical register operands.  Virtual registers are assumed to
410
  /// always be renamable regardless of the value of this field.
411
  ///
412
  /// Operands that are renamable can freely be changed to any other register
413
  /// that is a member of the register class returned by
414
  /// MI->getRegClassConstraint().
415
  ///
416
  /// isRenamable can return false for several different reasons:
417
  ///
418
  /// - ABI constraints (since liveness is not always precisely modeled).  We
419
  ///   conservatively handle these cases by setting all physical register
420
  ///   operands that didn’t start out as virtual regs to not be renamable.
421
  ///   Also any physical register operands created after register allocation or
422
  ///   whose register is changed after register allocation will not be
423
  ///   renamable.  This state is tracked in the MachineOperand::IsRenamable
424
  ///   bit.
425
  ///
426
  /// - Opcode/target constraints: for opcodes that have complex register class
427
  ///   requirements (e.g. that depend on other operands/instructions), we set
428
  ///   hasExtraSrcRegAllocReq/hasExtraDstRegAllocReq in the machine opcode
429
  ///   description.  Operands belonging to instructions with opcodes that are
430
  ///   marked hasExtraSrcRegAllocReq/hasExtraDstRegAllocReq return false from
431
  ///   isRenamable().  Additionally, the AllowRegisterRenaming target property
432
  ///   prevents any operands from being marked renamable for targets that don't
433
  ///   have detailed opcode hasExtraSrcRegAllocReq/hasExtraDstRegAllocReq
434
  ///   values.
435
  bool isRenamable() const;
436
 
437
  bool isInternalRead() const {
438
    assert(isReg() && "Wrong MachineOperand accessor");
439
    return IsInternalRead;
440
  }
441
 
442
  bool isEarlyClobber() const {
443
    assert(isReg() && "Wrong MachineOperand accessor");
444
    return IsEarlyClobber;
445
  }
446
 
447
  bool isTied() const {
448
    assert(isReg() && "Wrong MachineOperand accessor");
449
    return TiedTo;
450
  }
451
 
452
  bool isDebug() const {
453
    assert(isReg() && "Wrong MachineOperand accessor");
454
    return IsDebug;
455
  }
456
 
457
  /// readsReg - Returns true if this operand reads the previous value of its
458
  /// register.  A use operand with the <undef> flag set doesn't read its
459
  /// register.  A sub-register def implicitly reads the other parts of the
460
  /// register being redefined unless the <undef> flag is set.
461
  ///
462
  /// This refers to reading the register value from before the current
463
  /// instruction or bundle. Internal bundle reads are not included.
464
  bool readsReg() const {
465
    assert(isReg() && "Wrong MachineOperand accessor");
466
    return !isUndef() && !isInternalRead() && (isUse() || getSubReg());
467
  }
468
 
469
  /// Return true if this operand can validly be appended to an arbitrary
470
  /// operand list. i.e. this behaves like an implicit operand.
471
  bool isValidExcessOperand() const {
472
    if ((isReg() && isImplicit()) || isRegMask())
473
      return true;
474
 
475
    // Debug operands
476
    return isMetadata() || isMCSymbol();
477
  }
478
 
479
  //===--------------------------------------------------------------------===//
480
  // Mutators for Register Operands
481
  //===--------------------------------------------------------------------===//
482
 
483
  /// Change the register this operand corresponds to.
484
  ///
485
  void setReg(Register Reg);
486
 
487
  void setSubReg(unsigned subReg) {
488
    assert(isReg() && "Wrong MachineOperand mutator");
489
    SubReg_TargetFlags = subReg;
490
    assert(SubReg_TargetFlags == subReg && "SubReg out of range");
491
  }
492
 
493
  /// substVirtReg - Substitute the current register with the virtual
494
  /// subregister Reg:SubReg. Take any existing SubReg index into account,
495
  /// using TargetRegisterInfo to compose the subreg indices if necessary.
496
  /// Reg must be a virtual register, SubIdx can be 0.
497
  ///
498
  void substVirtReg(Register Reg, unsigned SubIdx, const TargetRegisterInfo&);
499
 
500
  /// substPhysReg - Substitute the current register with the physical register
501
  /// Reg, taking any existing SubReg into account. For instance,
502
  /// substPhysReg(%eax) will change %reg1024:sub_8bit to %al.
503
  ///
504
  void substPhysReg(MCRegister Reg, const TargetRegisterInfo&);
505
 
506
  void setIsUse(bool Val = true) { setIsDef(!Val); }
507
 
508
  /// Change a def to a use, or a use to a def.
509
  void setIsDef(bool Val = true);
510
 
511
  void setImplicit(bool Val = true) {
512
    assert(isReg() && "Wrong MachineOperand mutator");
513
    IsImp = Val;
514
  }
515
 
516
  void setIsKill(bool Val = true) {
517
    assert(isReg() && !IsDef && "Wrong MachineOperand mutator");
518
    assert((!Val || !isDebug()) && "Marking a debug operation as kill");
519
    IsDeadOrKill = Val;
520
  }
521
 
522
  void setIsDead(bool Val = true) {
523
    assert(isReg() && IsDef && "Wrong MachineOperand mutator");
524
    IsDeadOrKill = Val;
525
  }
526
 
527
  void setIsUndef(bool Val = true) {
528
    assert(isReg() && "Wrong MachineOperand mutator");
529
    IsUndef = Val;
530
  }
531
 
532
  void setIsRenamable(bool Val = true);
533
 
534
  void setIsInternalRead(bool Val = true) {
535
    assert(isReg() && "Wrong MachineOperand mutator");
536
    IsInternalRead = Val;
537
  }
538
 
539
  void setIsEarlyClobber(bool Val = true) {
540
    assert(isReg() && IsDef && "Wrong MachineOperand mutator");
541
    IsEarlyClobber = Val;
542
  }
543
 
544
  void setIsDebug(bool Val = true) {
545
    assert(isReg() && !IsDef && "Wrong MachineOperand mutator");
546
    IsDebug = Val;
547
  }
548
 
549
  //===--------------------------------------------------------------------===//
550
  // Accessors for various operand types.
551
  //===--------------------------------------------------------------------===//
552
 
553
  int64_t getImm() const {
554
    assert(isImm() && "Wrong MachineOperand accessor");
555
    return Contents.ImmVal;
556
  }
557
 
558
  const ConstantInt *getCImm() const {
559
    assert(isCImm() && "Wrong MachineOperand accessor");
560
    return Contents.CI;
561
  }
562
 
563
  const ConstantFP *getFPImm() const {
564
    assert(isFPImm() && "Wrong MachineOperand accessor");
565
    return Contents.CFP;
566
  }
567
 
568
  MachineBasicBlock *getMBB() const {
569
    assert(isMBB() && "Wrong MachineOperand accessor");
570
    return Contents.MBB;
571
  }
572
 
573
  int getIndex() const {
574
    assert((isFI() || isCPI() || isTargetIndex() || isJTI()) &&
575
           "Wrong MachineOperand accessor");
576
    return Contents.OffsetedInfo.Val.Index;
577
  }
578
 
579
  const GlobalValue *getGlobal() const {
580
    assert(isGlobal() && "Wrong MachineOperand accessor");
581
    return Contents.OffsetedInfo.Val.GV;
582
  }
583
 
584
  const BlockAddress *getBlockAddress() const {
585
    assert(isBlockAddress() && "Wrong MachineOperand accessor");
586
    return Contents.OffsetedInfo.Val.BA;
587
  }
588
 
589
  MCSymbol *getMCSymbol() const {
590
    assert(isMCSymbol() && "Wrong MachineOperand accessor");
591
    return Contents.Sym;
592
  }
593
 
594
  unsigned getInstrRefInstrIndex() const {
595
    assert(isDbgInstrRef() && "Wrong MachineOperand accessor");
596
    return Contents.InstrRef.InstrIdx;
597
  }
598
 
599
  unsigned getInstrRefOpIndex() const {
600
    assert(isDbgInstrRef() && "Wrong MachineOperand accessor");
601
    return Contents.InstrRef.OpIdx;
602
  }
603
 
604
  unsigned getCFIIndex() const {
605
    assert(isCFIIndex() && "Wrong MachineOperand accessor");
606
    return Contents.CFIIndex;
607
  }
608
 
609
  Intrinsic::ID getIntrinsicID() const {
610
    assert(isIntrinsicID() && "Wrong MachineOperand accessor");
611
    return Contents.IntrinsicID;
612
  }
613
 
614
  unsigned getPredicate() const {
615
    assert(isPredicate() && "Wrong MachineOperand accessor");
616
    return Contents.Pred;
617
  }
618
 
619
  ArrayRef<int> getShuffleMask() const {
620
    assert(isShuffleMask() && "Wrong MachineOperand accessor");
621
    return Contents.ShuffleMask;
622
  }
623
 
624
  /// Return the offset from the symbol in this operand. This always returns 0
625
  /// for ExternalSymbol operands.
626
  int64_t getOffset() const {
627
    assert((isGlobal() || isSymbol() || isMCSymbol() || isCPI() ||
628
            isTargetIndex() || isBlockAddress()) &&
629
           "Wrong MachineOperand accessor");
630
    return int64_t(uint64_t(Contents.OffsetedInfo.OffsetHi) << 32) |
631
           SmallContents.OffsetLo;
632
  }
633
 
634
  const char *getSymbolName() const {
635
    assert(isSymbol() && "Wrong MachineOperand accessor");
636
    return Contents.OffsetedInfo.Val.SymbolName;
637
  }
638
 
639
  /// clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
640
  /// It is sometimes necessary to detach the register mask pointer from its
641
  /// machine operand. This static method can be used for such detached bit
642
  /// mask pointers.
643
  static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg) {
644
    // See TargetRegisterInfo.h.
645
    assert(PhysReg < (1u << 30) && "Not a physical register");
646
    return !(RegMask[PhysReg / 32] & (1u << PhysReg % 32));
647
  }
648
 
649
  /// clobbersPhysReg - Returns true if this RegMask operand clobbers PhysReg.
650
  bool clobbersPhysReg(MCRegister PhysReg) const {
651
     return clobbersPhysReg(getRegMask(), PhysReg);
652
  }
653
 
654
  /// getRegMask - Returns a bit mask of registers preserved by this RegMask
655
  /// operand.
656
  const uint32_t *getRegMask() const {
657
    assert(isRegMask() && "Wrong MachineOperand accessor");
658
    return Contents.RegMask;
659
  }
660
 
661
  /// Returns number of elements needed for a regmask array.
662
  static unsigned getRegMaskSize(unsigned NumRegs) {
663
    return (NumRegs + 31) / 32;
664
  }
665
 
666
  /// getRegLiveOut - Returns a bit mask of live-out registers.
667
  const uint32_t *getRegLiveOut() const {
668
    assert(isRegLiveOut() && "Wrong MachineOperand accessor");
669
    return Contents.RegMask;
670
  }
671
 
672
  const MDNode *getMetadata() const {
673
    assert(isMetadata() && "Wrong MachineOperand accessor");
674
    return Contents.MD;
675
  }
676
 
677
  //===--------------------------------------------------------------------===//
678
  // Mutators for various operand types.
679
  //===--------------------------------------------------------------------===//
680
 
681
  void setImm(int64_t immVal) {
682
    assert(isImm() && "Wrong MachineOperand mutator");
683
    Contents.ImmVal = immVal;
684
  }
685
 
686
  void setCImm(const ConstantInt *CI) {
687
    assert(isCImm() && "Wrong MachineOperand mutator");
688
    Contents.CI = CI;
689
  }
690
 
691
  void setFPImm(const ConstantFP *CFP) {
692
    assert(isFPImm() && "Wrong MachineOperand mutator");
693
    Contents.CFP = CFP;
694
  }
695
 
696
  void setOffset(int64_t Offset) {
697
    assert((isGlobal() || isSymbol() || isMCSymbol() || isCPI() ||
698
            isTargetIndex() || isBlockAddress()) &&
699
           "Wrong MachineOperand mutator");
700
    SmallContents.OffsetLo = unsigned(Offset);
701
    Contents.OffsetedInfo.OffsetHi = int(Offset >> 32);
702
  }
703
 
704
  void setIndex(int Idx) {
705
    assert((isFI() || isCPI() || isTargetIndex() || isJTI()) &&
706
           "Wrong MachineOperand mutator");
707
    Contents.OffsetedInfo.Val.Index = Idx;
708
  }
709
 
710
  void setMetadata(const MDNode *MD) {
711
    assert(isMetadata() && "Wrong MachineOperand mutator");
712
    Contents.MD = MD;
713
  }
714
 
715
  void setInstrRefInstrIndex(unsigned InstrIdx) {
716
    assert(isDbgInstrRef() && "Wrong MachineOperand mutator");
717
    Contents.InstrRef.InstrIdx = InstrIdx;
718
  }
719
  void setInstrRefOpIndex(unsigned OpIdx) {
720
    assert(isDbgInstrRef() && "Wrong MachineOperand mutator");
721
    Contents.InstrRef.OpIdx = OpIdx;
722
  }
723
 
724
  void setMBB(MachineBasicBlock *MBB) {
725
    assert(isMBB() && "Wrong MachineOperand mutator");
726
    Contents.MBB = MBB;
727
  }
728
 
729
  /// Sets value of register mask operand referencing Mask.  The
730
  /// operand does not take ownership of the memory referenced by Mask, it must
731
  /// remain valid for the lifetime of the operand. See CreateRegMask().
732
  /// Any physreg with a 0 bit in the mask is clobbered by the instruction.
733
  void setRegMask(const uint32_t *RegMaskPtr) {
734
    assert(isRegMask() && "Wrong MachineOperand mutator");
735
    Contents.RegMask = RegMaskPtr;
736
  }
737
 
738
  void setIntrinsicID(Intrinsic::ID IID) {
739
    assert(isIntrinsicID() && "Wrong MachineOperand mutator");
740
    Contents.IntrinsicID = IID;
741
  }
742
 
743
  void setPredicate(unsigned Predicate) {
744
    assert(isPredicate() && "Wrong MachineOperand mutator");
745
    Contents.Pred = Predicate;
746
  }
747
 
748
  //===--------------------------------------------------------------------===//
749
  // Other methods.
750
  //===--------------------------------------------------------------------===//
751
 
752
  /// Returns true if this operand is identical to the specified operand except
753
  /// for liveness related flags (isKill, isUndef and isDead). Note that this
754
  /// should stay in sync with the hash_value overload below.
755
  bool isIdenticalTo(const MachineOperand &Other) const;
756
 
757
  /// MachineOperand hash_value overload.
758
  ///
759
  /// Note that this includes the same information in the hash that
760
  /// isIdenticalTo uses for comparison. It is thus suited for use in hash
761
  /// tables which use that function for equality comparisons only. This must
762
  /// stay exactly in sync with isIdenticalTo above.
763
  friend hash_code hash_value(const MachineOperand &MO);
764
 
765
  /// ChangeToImmediate - Replace this operand with a new immediate operand of
766
  /// the specified value.  If an operand is known to be an immediate already,
767
  /// the setImm method should be used.
768
  void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags = 0);
769
 
770
  /// ChangeToFPImmediate - Replace this operand with a new FP immediate operand
771
  /// of the specified value.  If an operand is known to be an FP immediate
772
  /// already, the setFPImm method should be used.
773
  void ChangeToFPImmediate(const ConstantFP *FPImm, unsigned TargetFlags = 0);
774
 
775
  /// ChangeToES - Replace this operand with a new external symbol operand.
776
  void ChangeToES(const char *SymName, unsigned TargetFlags = 0);
777
 
778
  /// ChangeToGA - Replace this operand with a new global address operand.
779
  void ChangeToGA(const GlobalValue *GV, int64_t Offset,
780
                  unsigned TargetFlags = 0);
781
 
782
  /// ChangeToMCSymbol - Replace this operand with a new MC symbol operand.
783
  void ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags = 0);
784
 
785
  /// Replace this operand with a frame index.
786
  void ChangeToFrameIndex(int Idx, unsigned TargetFlags = 0);
787
 
788
  /// Replace this operand with a target index.
789
  void ChangeToTargetIndex(unsigned Idx, int64_t Offset,
790
                           unsigned TargetFlags = 0);
791
 
792
  /// Replace this operand with an Instruction Reference.
793
  void ChangeToDbgInstrRef(unsigned InstrIdx, unsigned OpIdx,
794
                           unsigned TargetFlags = 0);
795
 
796
  /// ChangeToRegister - Replace this operand with a new register operand of
797
  /// the specified value.  If an operand is known to be an register already,
798
  /// the setReg method should be used.
799
  void ChangeToRegister(Register Reg, bool isDef, bool isImp = false,
800
                        bool isKill = false, bool isDead = false,
801
                        bool isUndef = false, bool isDebug = false);
802
 
803
  /// getTargetIndexName - If this MachineOperand is a TargetIndex that has a
804
  /// name, attempt to get the name. Returns nullptr if the TargetIndex does not
805
  /// have a name. Asserts if MO is not a TargetIndex.
806
  const char *getTargetIndexName() const;
807
 
808
  //===--------------------------------------------------------------------===//
809
  // Construction methods.
810
  //===--------------------------------------------------------------------===//
811
 
812
  static MachineOperand CreateImm(int64_t Val) {
813
    MachineOperand Op(MachineOperand::MO_Immediate);
814
    Op.setImm(Val);
815
    return Op;
816
  }
817
 
818
  static MachineOperand CreateCImm(const ConstantInt *CI) {
819
    MachineOperand Op(MachineOperand::MO_CImmediate);
820
    Op.Contents.CI = CI;
821
    return Op;
822
  }
823
 
824
  static MachineOperand CreateFPImm(const ConstantFP *CFP) {
825
    MachineOperand Op(MachineOperand::MO_FPImmediate);
826
    Op.Contents.CFP = CFP;
827
    return Op;
828
  }
829
 
830
  static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp = false,
831
                                  bool isKill = false, bool isDead = false,
832
                                  bool isUndef = false,
833
                                  bool isEarlyClobber = false,
834
                                  unsigned SubReg = 0, bool isDebug = false,
835
                                  bool isInternalRead = false,
836
                                  bool isRenamable = false) {
837
    assert(!(isDead && !isDef) && "Dead flag on non-def");
838
    assert(!(isKill && isDef) && "Kill flag on def");
839
    MachineOperand Op(MachineOperand::MO_Register);
840
    Op.IsDef = isDef;
841
    Op.IsImp = isImp;
842
    Op.IsDeadOrKill = isKill | isDead;
843
    Op.IsRenamable = isRenamable;
844
    Op.IsUndef = isUndef;
845
    Op.IsInternalRead = isInternalRead;
846
    Op.IsEarlyClobber = isEarlyClobber;
847
    Op.TiedTo = 0;
848
    Op.IsDebug = isDebug;
849
    Op.SmallContents.RegNo = Reg;
850
    Op.Contents.Reg.Prev = nullptr;
851
    Op.Contents.Reg.Next = nullptr;
852
    Op.setSubReg(SubReg);
853
    return Op;
854
  }
855
  static MachineOperand CreateMBB(MachineBasicBlock *MBB,
856
                                  unsigned TargetFlags = 0) {
857
    MachineOperand Op(MachineOperand::MO_MachineBasicBlock);
858
    Op.setMBB(MBB);
859
    Op.setTargetFlags(TargetFlags);
860
    return Op;
861
  }
862
  static MachineOperand CreateFI(int Idx) {
863
    MachineOperand Op(MachineOperand::MO_FrameIndex);
864
    Op.setIndex(Idx);
865
    return Op;
866
  }
867
  static MachineOperand CreateCPI(unsigned Idx, int Offset,
868
                                  unsigned TargetFlags = 0) {
869
    MachineOperand Op(MachineOperand::MO_ConstantPoolIndex);
870
    Op.setIndex(Idx);
871
    Op.setOffset(Offset);
872
    Op.setTargetFlags(TargetFlags);
873
    return Op;
874
  }
875
  static MachineOperand CreateTargetIndex(unsigned Idx, int64_t Offset,
876
                                          unsigned TargetFlags = 0) {
877
    MachineOperand Op(MachineOperand::MO_TargetIndex);
878
    Op.setIndex(Idx);
879
    Op.setOffset(Offset);
880
    Op.setTargetFlags(TargetFlags);
881
    return Op;
882
  }
883
  static MachineOperand CreateJTI(unsigned Idx, unsigned TargetFlags = 0) {
884
    MachineOperand Op(MachineOperand::MO_JumpTableIndex);
885
    Op.setIndex(Idx);
886
    Op.setTargetFlags(TargetFlags);
887
    return Op;
888
  }
889
  static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset,
890
                                 unsigned TargetFlags = 0) {
891
    MachineOperand Op(MachineOperand::MO_GlobalAddress);
892
    Op.Contents.OffsetedInfo.Val.GV = GV;
893
    Op.setOffset(Offset);
894
    Op.setTargetFlags(TargetFlags);
895
    return Op;
896
  }
897
  static MachineOperand CreateES(const char *SymName,
898
                                 unsigned TargetFlags = 0) {
899
    MachineOperand Op(MachineOperand::MO_ExternalSymbol);
900
    Op.Contents.OffsetedInfo.Val.SymbolName = SymName;
901
    Op.setOffset(0); // Offset is always 0.
902
    Op.setTargetFlags(TargetFlags);
903
    return Op;
904
  }
905
  static MachineOperand CreateBA(const BlockAddress *BA, int64_t Offset,
906
                                 unsigned TargetFlags = 0) {
907
    MachineOperand Op(MachineOperand::MO_BlockAddress);
908
    Op.Contents.OffsetedInfo.Val.BA = BA;
909
    Op.setOffset(Offset);
910
    Op.setTargetFlags(TargetFlags);
911
    return Op;
912
  }
913
  /// CreateRegMask - Creates a register mask operand referencing Mask.  The
914
  /// operand does not take ownership of the memory referenced by Mask, it
915
  /// must remain valid for the lifetime of the operand.
916
  ///
917
  /// A RegMask operand represents a set of non-clobbered physical registers
918
  /// on an instruction that clobbers many registers, typically a call.  The
919
  /// bit mask has a bit set for each physreg that is preserved by this
920
  /// instruction, as described in the documentation for
921
  /// TargetRegisterInfo::getCallPreservedMask().
922
  ///
923
  /// Any physreg with a 0 bit in the mask is clobbered by the instruction.
924
  ///
925
  static MachineOperand CreateRegMask(const uint32_t *Mask) {
926
    assert(Mask && "Missing register mask");
927
    MachineOperand Op(MachineOperand::MO_RegisterMask);
928
    Op.Contents.RegMask = Mask;
929
    return Op;
930
  }
931
  static MachineOperand CreateRegLiveOut(const uint32_t *Mask) {
932
    assert(Mask && "Missing live-out register mask");
933
    MachineOperand Op(MachineOperand::MO_RegisterLiveOut);
934
    Op.Contents.RegMask = Mask;
935
    return Op;
936
  }
937
  static MachineOperand CreateMetadata(const MDNode *Meta) {
938
    MachineOperand Op(MachineOperand::MO_Metadata);
939
    Op.Contents.MD = Meta;
940
    return Op;
941
  }
942
 
943
  static MachineOperand CreateMCSymbol(MCSymbol *Sym,
944
                                       unsigned TargetFlags = 0) {
945
    MachineOperand Op(MachineOperand::MO_MCSymbol);
946
    Op.Contents.Sym = Sym;
947
    Op.setOffset(0);
948
    Op.setTargetFlags(TargetFlags);
949
    return Op;
950
  }
951
 
952
  static MachineOperand CreateDbgInstrRef(unsigned InstrIdx, unsigned OpIdx) {
953
    MachineOperand Op(MachineOperand::MO_DbgInstrRef);
954
    Op.Contents.InstrRef.InstrIdx = InstrIdx;
955
    Op.Contents.InstrRef.OpIdx = OpIdx;
956
    return Op;
957
  }
958
 
959
  static MachineOperand CreateCFIIndex(unsigned CFIIndex) {
960
    MachineOperand Op(MachineOperand::MO_CFIIndex);
961
    Op.Contents.CFIIndex = CFIIndex;
962
    return Op;
963
  }
964
 
965
  static MachineOperand CreateIntrinsicID(Intrinsic::ID ID) {
966
    MachineOperand Op(MachineOperand::MO_IntrinsicID);
967
    Op.Contents.IntrinsicID = ID;
968
    return Op;
969
  }
970
 
971
  static MachineOperand CreatePredicate(unsigned Pred) {
972
    MachineOperand Op(MachineOperand::MO_Predicate);
973
    Op.Contents.Pred = Pred;
974
    return Op;
975
  }
976
 
977
  static MachineOperand CreateShuffleMask(ArrayRef<int> Mask) {
978
    MachineOperand Op(MachineOperand::MO_ShuffleMask);
979
    Op.Contents.ShuffleMask = Mask;
980
    return Op;
981
  }
982
 
983
  friend class MachineInstr;
984
  friend class MachineRegisterInfo;
985
 
986
private:
987
  // If this operand is currently a register operand, and if this is in a
988
  // function, deregister the operand from the register's use/def list.
989
  void removeRegFromUses();
990
 
991
  /// Artificial kinds for DenseMap usage.
992
  enum : unsigned char {
993
    MO_Empty = MO_Last + 1,
994
    MO_Tombstone,
995
  };
996
 
997
  friend struct DenseMapInfo<MachineOperand>;
998
 
999
  //===--------------------------------------------------------------------===//
1000
  // Methods for handling register use/def lists.
1001
  //===--------------------------------------------------------------------===//
1002
 
1003
  /// isOnRegUseList - Return true if this operand is on a register use/def
1004
  /// list or false if not.  This can only be called for register operands
1005
  /// that are part of a machine instruction.
1006
  bool isOnRegUseList() const {
1007
    assert(isReg() && "Can only add reg operand to use lists");
1008
    return Contents.Reg.Prev != nullptr;
1009
  }
1010
};
1011
 
1012
template <> struct DenseMapInfo<MachineOperand> {
1013
  static MachineOperand getEmptyKey() {
1014
    return MachineOperand(static_cast<MachineOperand::MachineOperandType>(
1015
        MachineOperand::MO_Empty));
1016
  }
1017
  static MachineOperand getTombstoneKey() {
1018
    return MachineOperand(static_cast<MachineOperand::MachineOperandType>(
1019
        MachineOperand::MO_Tombstone));
1020
  }
1021
  static unsigned getHashValue(const MachineOperand &MO) {
1022
    return hash_value(MO);
1023
  }
1024
  static bool isEqual(const MachineOperand &LHS, const MachineOperand &RHS) {
1025
    if (LHS.getType() == static_cast<MachineOperand::MachineOperandType>(
1026
                             MachineOperand::MO_Empty) ||
1027
        LHS.getType() == static_cast<MachineOperand::MachineOperandType>(
1028
                             MachineOperand::MO_Tombstone))
1029
      return LHS.getType() == RHS.getType();
1030
    return LHS.isIdenticalTo(RHS);
1031
  }
1032
};
1033
 
1034
inline raw_ostream &operator<<(raw_ostream &OS, const MachineOperand &MO) {
1035
  MO.print(OS);
1036
  return OS;
1037
}
1038
 
1039
// See friend declaration above. This additional declaration is required in
1040
// order to compile LLVM with IBM xlC compiler.
1041
hash_code hash_value(const MachineOperand &MO);
1042
} // namespace llvm
1043
 
1044
#endif