blob: 6bbe2d03f9e58bc5d78464674614e53d744540d5 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- llvm/CodeGen/MachineInstr.h - MachineInstr class ---------*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the declaration of the MachineInstr class, which is the
10// basic representation for all target dependent machine instructions used by
11// the back end.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_MACHINEINSTR_H
16#define LLVM_CODEGEN_MACHINEINSTR_H
17
18#include "llvm/ADT/DenseMapInfo.h"
Andrew Scull0372a572018-11-16 15:47:06 +000019#include "llvm/ADT/PointerSumType.h"
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010020#include "llvm/ADT/ilist.h"
21#include "llvm/ADT/ilist_node.h"
22#include "llvm/ADT/iterator_range.h"
Andrew Scull0372a572018-11-16 15:47:06 +000023#include "llvm/CodeGen/MachineMemOperand.h"
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010024#include "llvm/CodeGen/MachineOperand.h"
25#include "llvm/CodeGen/TargetOpcodes.h"
26#include "llvm/IR/DebugLoc.h"
27#include "llvm/IR/InlineAsm.h"
28#include "llvm/MC/MCInstrDesc.h"
Andrew Scull0372a572018-11-16 15:47:06 +000029#include "llvm/MC/MCSymbol.h"
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010030#include "llvm/Support/ArrayRecycler.h"
Andrew Scull0372a572018-11-16 15:47:06 +000031#include "llvm/Support/TrailingObjects.h"
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010032#include <algorithm>
33#include <cassert>
34#include <cstdint>
35#include <utility>
36
37namespace llvm {
38
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020039class AAResults;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010040template <typename T> class ArrayRef;
41class DIExpression;
42class DILocalVariable;
43class MachineBasicBlock;
44class MachineFunction;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010045class MachineRegisterInfo;
46class ModuleSlotTracker;
47class raw_ostream;
48template <typename T> class SmallVectorImpl;
49class SmallBitVector;
50class StringRef;
51class TargetInstrInfo;
52class TargetRegisterClass;
53class TargetRegisterInfo;
54
55//===----------------------------------------------------------------------===//
56/// Representation of each machine instruction.
57///
58/// This class isn't a POD type, but it must have a trivial destructor. When a
59/// MachineFunction is deleted, all the contained MachineInstrs are deallocated
60/// without having their destructor called.
61///
62class MachineInstr
63 : public ilist_node_with_parent<MachineInstr, MachineBasicBlock,
64 ilist_sentinel_tracking<true>> {
65public:
Andrew Scull0372a572018-11-16 15:47:06 +000066 using mmo_iterator = ArrayRef<MachineMemOperand *>::iterator;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010067
68 /// Flags to specify different kinds of comments to output in
69 /// assembly code. These flags carry semantic information not
70 /// otherwise easily derivable from the IR text.
71 ///
72 enum CommentFlag {
73 ReloadReuse = 0x1, // higher bits are reserved for target dep comments.
74 NoSchedComment = 0x2,
75 TAsmComments = 0x4 // Target Asm comments should start from this value.
76 };
77
78 enum MIFlag {
79 NoFlags = 0,
80 FrameSetup = 1 << 0, // Instruction is used as a part of
81 // function frame setup code.
82 FrameDestroy = 1 << 1, // Instruction is used as a part of
83 // function frame destruction code.
84 BundledPred = 1 << 2, // Instruction has bundled predecessors.
Andrew Scullcdfcccc2018-10-05 20:58:37 +010085 BundledSucc = 1 << 3, // Instruction has bundled successors.
86 FmNoNans = 1 << 4, // Instruction does not support Fast
87 // math nan values.
88 FmNoInfs = 1 << 5, // Instruction does not support Fast
89 // math infinity values.
90 FmNsz = 1 << 6, // Instruction is not required to retain
91 // signed zero values.
92 FmArcp = 1 << 7, // Instruction supports Fast math
93 // reciprocal approximations.
94 FmContract = 1 << 8, // Instruction supports Fast math
95 // contraction operations like fma.
96 FmAfn = 1 << 9, // Instruction may map to Fast math
97 // instrinsic approximation.
Andrew Scull0372a572018-11-16 15:47:06 +000098 FmReassoc = 1 << 10, // Instruction supports Fast math
Andrew Scullcdfcccc2018-10-05 20:58:37 +010099 // reassociation of operand order.
Andrew Scull0372a572018-11-16 15:47:06 +0000100 NoUWrap = 1 << 11, // Instruction supports binary operator
101 // no unsigned wrap.
102 NoSWrap = 1 << 12, // Instruction supports binary operator
103 // no signed wrap.
Andrew Walbran3d2c1972020-04-07 12:24:26 +0100104 IsExact = 1 << 13, // Instruction supports division is
Andrew Scull0372a572018-11-16 15:47:06 +0000105 // known to be exact.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200106 NoFPExcept = 1 << 14, // Instruction does not raise
107 // floatint-point exceptions.
108 NoMerge = 1 << 15, // Passes that drop source location info
109 // (e.g. branch folding) should skip
110 // this instruction.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100111 };
112
113private:
114 const MCInstrDesc *MCID; // Instruction descriptor.
115 MachineBasicBlock *Parent = nullptr; // Pointer to the owning basic block.
116
117 // Operands are allocated by an ArrayRecycler.
118 MachineOperand *Operands = nullptr; // Pointer to the first operand.
119 unsigned NumOperands = 0; // Number of operands on instruction.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100120
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100121 uint16_t Flags = 0; // Various bits of additional
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100122 // information about machine
123 // instruction.
124
125 uint8_t AsmPrinterFlags = 0; // Various bits of information used by
126 // the AsmPrinter to emit helpful
127 // comments. This is *not* semantic
128 // information. Do not use this for
129 // anything other than to convey comment
130 // information to AsmPrinter.
131
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200132 // OperandCapacity has uint8_t size, so it should be next to AsmPrinterFlags
133 // to properly pack.
134 using OperandCapacity = ArrayRecycler<MachineOperand>::Capacity;
135 OperandCapacity CapOperands; // Capacity of the Operands array.
136
Andrew Scull0372a572018-11-16 15:47:06 +0000137 /// Internal implementation detail class that provides out-of-line storage for
138 /// extra info used by the machine instruction when this info cannot be stored
139 /// in-line within the instruction itself.
140 ///
141 /// This has to be defined eagerly due to the implementation constraints of
142 /// `PointerSumType` where it is used.
143 class ExtraInfo final
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200144 : TrailingObjects<ExtraInfo, MachineMemOperand *, MCSymbol *, MDNode *> {
Andrew Scull0372a572018-11-16 15:47:06 +0000145 public:
146 static ExtraInfo *create(BumpPtrAllocator &Allocator,
147 ArrayRef<MachineMemOperand *> MMOs,
148 MCSymbol *PreInstrSymbol = nullptr,
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200149 MCSymbol *PostInstrSymbol = nullptr,
150 MDNode *HeapAllocMarker = nullptr) {
Andrew Scull0372a572018-11-16 15:47:06 +0000151 bool HasPreInstrSymbol = PreInstrSymbol != nullptr;
152 bool HasPostInstrSymbol = PostInstrSymbol != nullptr;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200153 bool HasHeapAllocMarker = HeapAllocMarker != nullptr;
Andrew Scull0372a572018-11-16 15:47:06 +0000154 auto *Result = new (Allocator.Allocate(
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200155 totalSizeToAlloc<MachineMemOperand *, MCSymbol *, MDNode *>(
156 MMOs.size(), HasPreInstrSymbol + HasPostInstrSymbol,
157 HasHeapAllocMarker),
Andrew Scull0372a572018-11-16 15:47:06 +0000158 alignof(ExtraInfo)))
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200159 ExtraInfo(MMOs.size(), HasPreInstrSymbol, HasPostInstrSymbol,
160 HasHeapAllocMarker);
Andrew Scull0372a572018-11-16 15:47:06 +0000161
162 // Copy the actual data into the trailing objects.
163 std::copy(MMOs.begin(), MMOs.end(),
164 Result->getTrailingObjects<MachineMemOperand *>());
165
166 if (HasPreInstrSymbol)
167 Result->getTrailingObjects<MCSymbol *>()[0] = PreInstrSymbol;
168 if (HasPostInstrSymbol)
169 Result->getTrailingObjects<MCSymbol *>()[HasPreInstrSymbol] =
170 PostInstrSymbol;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200171 if (HasHeapAllocMarker)
172 Result->getTrailingObjects<MDNode *>()[0] = HeapAllocMarker;
Andrew Scull0372a572018-11-16 15:47:06 +0000173
174 return Result;
175 }
176
177 ArrayRef<MachineMemOperand *> getMMOs() const {
178 return makeArrayRef(getTrailingObjects<MachineMemOperand *>(), NumMMOs);
179 }
180
181 MCSymbol *getPreInstrSymbol() const {
182 return HasPreInstrSymbol ? getTrailingObjects<MCSymbol *>()[0] : nullptr;
183 }
184
185 MCSymbol *getPostInstrSymbol() const {
186 return HasPostInstrSymbol
187 ? getTrailingObjects<MCSymbol *>()[HasPreInstrSymbol]
188 : nullptr;
189 }
190
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200191 MDNode *getHeapAllocMarker() const {
192 return HasHeapAllocMarker ? getTrailingObjects<MDNode *>()[0] : nullptr;
193 }
194
Andrew Scull0372a572018-11-16 15:47:06 +0000195 private:
196 friend TrailingObjects;
197
198 // Description of the extra info, used to interpret the actual optional
199 // data appended.
200 //
201 // Note that this is not terribly space optimized. This leaves a great deal
202 // of flexibility to fit more in here later.
203 const int NumMMOs;
204 const bool HasPreInstrSymbol;
205 const bool HasPostInstrSymbol;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200206 const bool HasHeapAllocMarker;
Andrew Scull0372a572018-11-16 15:47:06 +0000207
208 // Implement the `TrailingObjects` internal API.
209 size_t numTrailingObjects(OverloadToken<MachineMemOperand *>) const {
210 return NumMMOs;
211 }
212 size_t numTrailingObjects(OverloadToken<MCSymbol *>) const {
213 return HasPreInstrSymbol + HasPostInstrSymbol;
214 }
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200215 size_t numTrailingObjects(OverloadToken<MDNode *>) const {
216 return HasHeapAllocMarker;
217 }
Andrew Scull0372a572018-11-16 15:47:06 +0000218
219 // Just a boring constructor to allow us to initialize the sizes. Always use
220 // the `create` routine above.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200221 ExtraInfo(int NumMMOs, bool HasPreInstrSymbol, bool HasPostInstrSymbol,
222 bool HasHeapAllocMarker)
Andrew Scull0372a572018-11-16 15:47:06 +0000223 : NumMMOs(NumMMOs), HasPreInstrSymbol(HasPreInstrSymbol),
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200224 HasPostInstrSymbol(HasPostInstrSymbol),
225 HasHeapAllocMarker(HasHeapAllocMarker) {}
Andrew Scull0372a572018-11-16 15:47:06 +0000226 };
227
228 /// Enumeration of the kinds of inline extra info available. It is important
229 /// that the `MachineMemOperand` inline kind has a tag value of zero to make
230 /// it accessible as an `ArrayRef`.
231 enum ExtraInfoInlineKinds {
232 EIIK_MMO = 0,
233 EIIK_PreInstrSymbol,
234 EIIK_PostInstrSymbol,
235 EIIK_OutOfLine
236 };
237
238 // We store extra information about the instruction here. The common case is
239 // expected to be nothing or a single pointer (typically a MMO or a symbol).
240 // We work to optimize this common case by storing it inline here rather than
241 // requiring a separate allocation, but we fall back to an allocation when
242 // multiple pointers are needed.
243 PointerSumType<ExtraInfoInlineKinds,
244 PointerSumTypeMember<EIIK_MMO, MachineMemOperand *>,
245 PointerSumTypeMember<EIIK_PreInstrSymbol, MCSymbol *>,
246 PointerSumTypeMember<EIIK_PostInstrSymbol, MCSymbol *>,
247 PointerSumTypeMember<EIIK_OutOfLine, ExtraInfo *>>
248 Info;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100249
250 DebugLoc debugLoc; // Source line information.
251
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200252 /// Unique instruction number. Used by DBG_INSTR_REFs to refer to the values
253 /// defined by this instruction.
254 unsigned DebugInstrNum;
255
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100256 // Intrusive list support
257 friend struct ilist_traits<MachineInstr>;
258 friend struct ilist_callback_traits<MachineBasicBlock>;
259 void setParent(MachineBasicBlock *P) { Parent = P; }
260
261 /// This constructor creates a copy of the given
262 /// MachineInstr in the given MachineFunction.
263 MachineInstr(MachineFunction &, const MachineInstr &);
264
265 /// This constructor create a MachineInstr and add the implicit operands.
266 /// It reserves space for number of operands specified by
267 /// MCInstrDesc. An explicit DebugLoc is supplied.
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100268 MachineInstr(MachineFunction &, const MCInstrDesc &tid, DebugLoc dl,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100269 bool NoImp = false);
270
271 // MachineInstrs are pool-allocated and owned by MachineFunction.
272 friend class MachineFunction;
273
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200274 void
275 dumprImpl(const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,
276 SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const;
277
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100278public:
279 MachineInstr(const MachineInstr &) = delete;
280 MachineInstr &operator=(const MachineInstr &) = delete;
281 // Use MachineFunction::DeleteMachineInstr() instead.
282 ~MachineInstr() = delete;
283
284 const MachineBasicBlock* getParent() const { return Parent; }
285 MachineBasicBlock* getParent() { return Parent; }
286
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200287 /// Move the instruction before \p MovePos.
288 void moveBefore(MachineInstr *MovePos);
289
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100290 /// Return the function that contains the basic block that this instruction
291 /// belongs to.
292 ///
293 /// Note: this is undefined behaviour if the instruction does not have a
294 /// parent.
295 const MachineFunction *getMF() const;
296 MachineFunction *getMF() {
297 return const_cast<MachineFunction *>(
298 static_cast<const MachineInstr *>(this)->getMF());
299 }
300
301 /// Return the asm printer flags bitvector.
302 uint8_t getAsmPrinterFlags() const { return AsmPrinterFlags; }
303
304 /// Clear the AsmPrinter bitvector.
305 void clearAsmPrinterFlags() { AsmPrinterFlags = 0; }
306
307 /// Return whether an AsmPrinter flag is set.
308 bool getAsmPrinterFlag(CommentFlag Flag) const {
309 return AsmPrinterFlags & Flag;
310 }
311
312 /// Set a flag for the AsmPrinter.
313 void setAsmPrinterFlag(uint8_t Flag) {
314 AsmPrinterFlags |= Flag;
315 }
316
317 /// Clear specific AsmPrinter flags.
318 void clearAsmPrinterFlag(CommentFlag Flag) {
319 AsmPrinterFlags &= ~Flag;
320 }
321
322 /// Return the MI flags bitvector.
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100323 uint16_t getFlags() const {
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100324 return Flags;
325 }
326
327 /// Return whether an MI flag is set.
328 bool getFlag(MIFlag Flag) const {
329 return Flags & Flag;
330 }
331
332 /// Set a MI flag.
333 void setFlag(MIFlag Flag) {
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100334 Flags |= (uint16_t)Flag;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100335 }
336
337 void setFlags(unsigned flags) {
338 // Filter out the automatically maintained flags.
339 unsigned Mask = BundledPred | BundledSucc;
340 Flags = (Flags & Mask) | (flags & ~Mask);
341 }
342
343 /// clearFlag - Clear a MI flag.
344 void clearFlag(MIFlag Flag) {
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100345 Flags &= ~((uint16_t)Flag);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100346 }
347
348 /// Return true if MI is in a bundle (but not the first MI in a bundle).
349 ///
350 /// A bundle looks like this before it's finalized:
351 /// ----------------
352 /// | MI |
353 /// ----------------
354 /// |
355 /// ----------------
356 /// | MI * |
357 /// ----------------
358 /// |
359 /// ----------------
360 /// | MI * |
361 /// ----------------
362 /// In this case, the first MI starts a bundle but is not inside a bundle, the
363 /// next 2 MIs are considered "inside" the bundle.
364 ///
365 /// After a bundle is finalized, it looks like this:
366 /// ----------------
367 /// | Bundle |
368 /// ----------------
369 /// |
370 /// ----------------
371 /// | MI * |
372 /// ----------------
373 /// |
374 /// ----------------
375 /// | MI * |
376 /// ----------------
377 /// |
378 /// ----------------
379 /// | MI * |
380 /// ----------------
381 /// The first instruction has the special opcode "BUNDLE". It's not "inside"
382 /// a bundle, but the next three MIs are.
383 bool isInsideBundle() const {
384 return getFlag(BundledPred);
385 }
386
387 /// Return true if this instruction part of a bundle. This is true
388 /// if either itself or its following instruction is marked "InsideBundle".
389 bool isBundled() const {
390 return isBundledWithPred() || isBundledWithSucc();
391 }
392
393 /// Return true if this instruction is part of a bundle, and it is not the
394 /// first instruction in the bundle.
395 bool isBundledWithPred() const { return getFlag(BundledPred); }
396
397 /// Return true if this instruction is part of a bundle, and it is not the
398 /// last instruction in the bundle.
399 bool isBundledWithSucc() const { return getFlag(BundledSucc); }
400
401 /// Bundle this instruction with its predecessor. This can be an unbundled
402 /// instruction, or it can be the first instruction in a bundle.
403 void bundleWithPred();
404
405 /// Bundle this instruction with its successor. This can be an unbundled
406 /// instruction, or it can be the last instruction in a bundle.
407 void bundleWithSucc();
408
409 /// Break bundle above this instruction.
410 void unbundleFromPred();
411
412 /// Break bundle below this instruction.
413 void unbundleFromSucc();
414
415 /// Returns the debug location id of this MachineInstr.
416 const DebugLoc &getDebugLoc() const { return debugLoc; }
417
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200418 /// Return the operand containing the offset to be used if this DBG_VALUE
419 /// instruction is indirect; will be an invalid register if this value is
420 /// not indirect, and an immediate with value 0 otherwise.
421 const MachineOperand &getDebugOffset() const {
422 assert(isDebugValue() && "not a DBG_VALUE");
423 return getOperand(1);
424 }
425 MachineOperand &getDebugOffset() {
426 assert(isDebugValue() && "not a DBG_VALUE");
427 return getOperand(1);
428 }
429
430 /// Return the operand for the debug variable referenced by
431 /// this DBG_VALUE instruction.
432 const MachineOperand &getDebugVariableOp() const;
433 MachineOperand &getDebugVariableOp();
434
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100435 /// Return the debug variable referenced by
436 /// this DBG_VALUE instruction.
437 const DILocalVariable *getDebugVariable() const;
438
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200439 /// Return the operand for the complex address expression referenced by
440 /// this DBG_VALUE instruction.
441 MachineOperand &getDebugExpressionOp();
442
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100443 /// Return the complex address expression referenced by
444 /// this DBG_VALUE instruction.
445 const DIExpression *getDebugExpression() const;
446
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100447 /// Return the debug label referenced by
448 /// this DBG_LABEL instruction.
449 const DILabel *getDebugLabel() const;
450
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200451 /// Fetch the instruction number of this MachineInstr. If it does not have
452 /// one already, a new and unique number will be assigned.
453 unsigned getDebugInstrNum();
454
455 /// Examine the instruction number of this MachineInstr. May be zero if
456 /// it hasn't been assigned a number yet.
457 unsigned peekDebugInstrNum() const { return DebugInstrNum; }
458
459 /// Set instruction number of this MachineInstr. Avoid using unless you're
460 /// deserializing this information.
461 void setDebugInstrNum(unsigned Num) { DebugInstrNum = Num; }
462
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100463 /// Emit an error referring to the source location of this instruction.
464 /// This should only be used for inline assembly that is somehow
465 /// impossible to compile. Other errors should have been handled much
466 /// earlier.
467 ///
468 /// If this method returns, the caller should try to recover from the error.
469 void emitError(StringRef Msg) const;
470
471 /// Returns the target instruction descriptor of this MachineInstr.
472 const MCInstrDesc &getDesc() const { return *MCID; }
473
474 /// Returns the opcode of this MachineInstr.
475 unsigned getOpcode() const { return MCID->Opcode; }
476
Andrew Walbran16937d02019-10-22 13:54:20 +0100477 /// Retuns the total number of operands.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100478 unsigned getNumOperands() const { return NumOperands; }
479
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200480 /// Returns the total number of operands which are debug locations.
481 unsigned getNumDebugOperands() const {
482 return std::distance(debug_operands().begin(), debug_operands().end());
483 }
484
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100485 const MachineOperand& getOperand(unsigned i) const {
486 assert(i < getNumOperands() && "getOperand() out of range!");
487 return Operands[i];
488 }
489 MachineOperand& getOperand(unsigned i) {
490 assert(i < getNumOperands() && "getOperand() out of range!");
491 return Operands[i];
492 }
493
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200494 MachineOperand &getDebugOperand(unsigned Index) {
495 assert(Index < getNumDebugOperands() && "getDebugOperand() out of range!");
496 return *(debug_operands().begin() + Index);
497 }
498 const MachineOperand &getDebugOperand(unsigned Index) const {
499 assert(Index < getNumDebugOperands() && "getDebugOperand() out of range!");
500 return *(debug_operands().begin() + Index);
501 }
502
503 /// Returns a pointer to the operand corresponding to a debug use of Reg, or
504 /// nullptr if Reg is not used in any debug operand.
505 const MachineOperand *getDebugOperandForReg(Register Reg) const {
506 const MachineOperand *RegOp =
507 find_if(debug_operands(), [Reg](const MachineOperand &Op) {
508 return Op.isReg() && Op.getReg() == Reg;
509 });
510 return RegOp == adl_end(debug_operands()) ? nullptr : RegOp;
511 }
512 MachineOperand *getDebugOperandForReg(Register Reg) {
513 MachineOperand *RegOp =
514 find_if(debug_operands(), [Reg](const MachineOperand &Op) {
515 return Op.isReg() && Op.getReg() == Reg;
516 });
517 return RegOp == adl_end(debug_operands()) ? nullptr : RegOp;
518 }
519
520 unsigned getDebugOperandIndex(const MachineOperand *Op) const {
521 assert(Op >= adl_begin(debug_operands()) &&
522 Op <= adl_end(debug_operands()) && "Expected a debug operand.");
523 return std::distance(adl_begin(debug_operands()), Op);
524 }
525
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100526 /// Returns the total number of definitions.
527 unsigned getNumDefs() const {
528 return getNumExplicitDefs() + MCID->getNumImplicitDefs();
529 }
530
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200531 /// Returns true if the instruction has implicit definition.
532 bool hasImplicitDef() const {
533 for (unsigned I = getNumExplicitOperands(), E = getNumOperands();
534 I != E; ++I) {
535 const MachineOperand &MO = getOperand(I);
536 if (MO.isDef() && MO.isImplicit())
537 return true;
538 }
539 return false;
540 }
541
542 /// Returns the implicit operands number.
543 unsigned getNumImplicitOperands() const {
544 return getNumOperands() - getNumExplicitOperands();
545 }
546
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100547 /// Return true if operand \p OpIdx is a subregister index.
548 bool isOperandSubregIdx(unsigned OpIdx) const {
549 assert(getOperand(OpIdx).getType() == MachineOperand::MO_Immediate &&
550 "Expected MO_Immediate operand type.");
551 if (isExtractSubreg() && OpIdx == 2)
552 return true;
553 if (isInsertSubreg() && OpIdx == 3)
554 return true;
555 if (isRegSequence() && OpIdx > 1 && (OpIdx % 2) == 0)
556 return true;
557 if (isSubregToReg() && OpIdx == 3)
558 return true;
559 return false;
560 }
561
562 /// Returns the number of non-implicit operands.
563 unsigned getNumExplicitOperands() const;
564
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100565 /// Returns the number of non-implicit definitions.
566 unsigned getNumExplicitDefs() const;
567
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100568 /// iterator/begin/end - Iterate over all operands of a machine instruction.
569 using mop_iterator = MachineOperand *;
570 using const_mop_iterator = const MachineOperand *;
571
572 mop_iterator operands_begin() { return Operands; }
573 mop_iterator operands_end() { return Operands + NumOperands; }
574
575 const_mop_iterator operands_begin() const { return Operands; }
576 const_mop_iterator operands_end() const { return Operands + NumOperands; }
577
578 iterator_range<mop_iterator> operands() {
579 return make_range(operands_begin(), operands_end());
580 }
581 iterator_range<const_mop_iterator> operands() const {
582 return make_range(operands_begin(), operands_end());
583 }
584 iterator_range<mop_iterator> explicit_operands() {
585 return make_range(operands_begin(),
586 operands_begin() + getNumExplicitOperands());
587 }
588 iterator_range<const_mop_iterator> explicit_operands() const {
589 return make_range(operands_begin(),
590 operands_begin() + getNumExplicitOperands());
591 }
592 iterator_range<mop_iterator> implicit_operands() {
593 return make_range(explicit_operands().end(), operands_end());
594 }
595 iterator_range<const_mop_iterator> implicit_operands() const {
596 return make_range(explicit_operands().end(), operands_end());
597 }
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200598 /// Returns a range over all operands that are used to determine the variable
599 /// location for this DBG_VALUE instruction.
600 iterator_range<mop_iterator> debug_operands() {
601 assert(isDebugValue() && "Must be a debug value instruction.");
602 return make_range(operands_begin(), operands_begin() + 1);
603 }
604 /// \copydoc debug_operands()
605 iterator_range<const_mop_iterator> debug_operands() const {
606 assert(isDebugValue() && "Must be a debug value instruction.");
607 return make_range(operands_begin(), operands_begin() + 1);
608 }
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100609 /// Returns a range over all explicit operands that are register definitions.
610 /// Implicit definition are not included!
611 iterator_range<mop_iterator> defs() {
612 return make_range(operands_begin(),
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100613 operands_begin() + getNumExplicitDefs());
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100614 }
615 /// \copydoc defs()
616 iterator_range<const_mop_iterator> defs() const {
617 return make_range(operands_begin(),
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100618 operands_begin() + getNumExplicitDefs());
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100619 }
620 /// Returns a range that includes all operands that are register uses.
621 /// This may include unrelated operands which are not register uses.
622 iterator_range<mop_iterator> uses() {
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100623 return make_range(operands_begin() + getNumExplicitDefs(), operands_end());
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100624 }
625 /// \copydoc uses()
626 iterator_range<const_mop_iterator> uses() const {
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100627 return make_range(operands_begin() + getNumExplicitDefs(), operands_end());
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100628 }
629 iterator_range<mop_iterator> explicit_uses() {
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100630 return make_range(operands_begin() + getNumExplicitDefs(),
631 operands_begin() + getNumExplicitOperands());
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100632 }
633 iterator_range<const_mop_iterator> explicit_uses() const {
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100634 return make_range(operands_begin() + getNumExplicitDefs(),
635 operands_begin() + getNumExplicitOperands());
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100636 }
637
638 /// Returns the number of the operand iterator \p I points to.
639 unsigned getOperandNo(const_mop_iterator I) const {
640 return I - operands_begin();
641 }
642
Andrew Scull0372a572018-11-16 15:47:06 +0000643 /// Access to memory operands of the instruction. If there are none, that does
644 /// not imply anything about whether the function accesses memory. Instead,
645 /// the caller must behave conservatively.
646 ArrayRef<MachineMemOperand *> memoperands() const {
647 if (!Info)
648 return {};
649
650 if (Info.is<EIIK_MMO>())
651 return makeArrayRef(Info.getAddrOfZeroTagPointer(), 1);
652
653 if (ExtraInfo *EI = Info.get<EIIK_OutOfLine>())
654 return EI->getMMOs();
655
656 return {};
657 }
658
659 /// Access to memory operands of the instruction.
660 ///
661 /// If `memoperands_begin() == memoperands_end()`, that does not imply
662 /// anything about whether the function accesses memory. Instead, the caller
663 /// must behave conservatively.
664 mmo_iterator memoperands_begin() const { return memoperands().begin(); }
665
666 /// Access to memory operands of the instruction.
667 ///
668 /// If `memoperands_begin() == memoperands_end()`, that does not imply
669 /// anything about whether the function accesses memory. Instead, the caller
670 /// must behave conservatively.
671 mmo_iterator memoperands_end() const { return memoperands().end(); }
672
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100673 /// Return true if we don't have any memory operands which described the
674 /// memory access done by this instruction. If this is true, calling code
675 /// must be conservative.
Andrew Scull0372a572018-11-16 15:47:06 +0000676 bool memoperands_empty() const { return memoperands().empty(); }
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100677
678 /// Return true if this instruction has exactly one MachineMemOperand.
Andrew Scull0372a572018-11-16 15:47:06 +0000679 bool hasOneMemOperand() const { return memoperands().size() == 1; }
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100680
681 /// Return the number of memory operands.
Andrew Scull0372a572018-11-16 15:47:06 +0000682 unsigned getNumMemOperands() const { return memoperands().size(); }
683
684 /// Helper to extract a pre-instruction symbol if one has been added.
685 MCSymbol *getPreInstrSymbol() const {
686 if (!Info)
687 return nullptr;
688 if (MCSymbol *S = Info.get<EIIK_PreInstrSymbol>())
689 return S;
690 if (ExtraInfo *EI = Info.get<EIIK_OutOfLine>())
691 return EI->getPreInstrSymbol();
692
693 return nullptr;
694 }
695
696 /// Helper to extract a post-instruction symbol if one has been added.
697 MCSymbol *getPostInstrSymbol() const {
698 if (!Info)
699 return nullptr;
700 if (MCSymbol *S = Info.get<EIIK_PostInstrSymbol>())
701 return S;
702 if (ExtraInfo *EI = Info.get<EIIK_OutOfLine>())
703 return EI->getPostInstrSymbol();
704
705 return nullptr;
706 }
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100707
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200708 /// Helper to extract a heap alloc marker if one has been added.
709 MDNode *getHeapAllocMarker() const {
710 if (!Info)
711 return nullptr;
712 if (ExtraInfo *EI = Info.get<EIIK_OutOfLine>())
713 return EI->getHeapAllocMarker();
714
715 return nullptr;
716 }
717
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100718 /// API for querying MachineInstr properties. They are the same as MCInstrDesc
719 /// queries but they are bundle aware.
720
721 enum QueryType {
722 IgnoreBundle, // Ignore bundles
723 AnyInBundle, // Return true if any instruction in bundle has property
724 AllInBundle // Return true if all instructions in bundle have property
725 };
726
727 /// Return true if the instruction (or in the case of a bundle,
728 /// the instructions inside the bundle) has the specified property.
729 /// The first argument is the property being queried.
730 /// The second argument indicates whether the query should look inside
731 /// instruction bundles.
732 bool hasProperty(unsigned MCFlag, QueryType Type = AnyInBundle) const {
Andrew Scull0372a572018-11-16 15:47:06 +0000733 assert(MCFlag < 64 &&
734 "MCFlag out of range for bit mask in getFlags/hasPropertyInBundle.");
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100735 // Inline the fast path for unbundled or bundle-internal instructions.
736 if (Type == IgnoreBundle || !isBundled() || isBundledWithPred())
737 return getDesc().getFlags() & (1ULL << MCFlag);
738
739 // If this is the first instruction in a bundle, take the slow path.
740 return hasPropertyInBundle(1ULL << MCFlag, Type);
741 }
742
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200743 /// Return true if this is an instruction that should go through the usual
744 /// legalization steps.
745 bool isPreISelOpcode(QueryType Type = IgnoreBundle) const {
746 return hasProperty(MCID::PreISelOpcode, Type);
747 }
748
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100749 /// Return true if this instruction can have a variable number of operands.
750 /// In this case, the variable operands will be after the normal
751 /// operands but before the implicit definitions and uses (if any are
752 /// present).
753 bool isVariadic(QueryType Type = IgnoreBundle) const {
754 return hasProperty(MCID::Variadic, Type);
755 }
756
757 /// Set if this instruction has an optional definition, e.g.
758 /// ARM instructions which can set condition code if 's' bit is set.
759 bool hasOptionalDef(QueryType Type = IgnoreBundle) const {
760 return hasProperty(MCID::HasOptionalDef, Type);
761 }
762
763 /// Return true if this is a pseudo instruction that doesn't
764 /// correspond to a real machine instruction.
765 bool isPseudo(QueryType Type = IgnoreBundle) const {
766 return hasProperty(MCID::Pseudo, Type);
767 }
768
769 bool isReturn(QueryType Type = AnyInBundle) const {
770 return hasProperty(MCID::Return, Type);
771 }
772
Andrew Scull0372a572018-11-16 15:47:06 +0000773 /// Return true if this is an instruction that marks the end of an EH scope,
774 /// i.e., a catchpad or a cleanuppad instruction.
775 bool isEHScopeReturn(QueryType Type = AnyInBundle) const {
776 return hasProperty(MCID::EHScopeReturn, Type);
777 }
778
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100779 bool isCall(QueryType Type = AnyInBundle) const {
780 return hasProperty(MCID::Call, Type);
781 }
782
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200783 /// Return true if this is a call instruction that may have an associated
784 /// call site entry in the debug info.
785 bool isCandidateForCallSiteEntry(QueryType Type = IgnoreBundle) const;
786 /// Return true if copying, moving, or erasing this instruction requires
787 /// updating Call Site Info (see \ref copyCallSiteInfo, \ref moveCallSiteInfo,
788 /// \ref eraseCallSiteInfo).
789 bool shouldUpdateCallSiteInfo() const;
790
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100791 /// Returns true if the specified instruction stops control flow
792 /// from executing the instruction immediately following it. Examples include
793 /// unconditional branches and return instructions.
794 bool isBarrier(QueryType Type = AnyInBundle) const {
795 return hasProperty(MCID::Barrier, Type);
796 }
797
798 /// Returns true if this instruction part of the terminator for a basic block.
799 /// Typically this is things like return and branch instructions.
800 ///
801 /// Various passes use this to insert code into the bottom of a basic block,
802 /// but before control flow occurs.
803 bool isTerminator(QueryType Type = AnyInBundle) const {
804 return hasProperty(MCID::Terminator, Type);
805 }
806
807 /// Returns true if this is a conditional, unconditional, or indirect branch.
808 /// Predicates below can be used to discriminate between
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200809 /// these cases, and the TargetInstrInfo::analyzeBranch method can be used to
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100810 /// get more information.
811 bool isBranch(QueryType Type = AnyInBundle) const {
812 return hasProperty(MCID::Branch, Type);
813 }
814
815 /// Return true if this is an indirect branch, such as a
816 /// branch through a register.
817 bool isIndirectBranch(QueryType Type = AnyInBundle) const {
818 return hasProperty(MCID::IndirectBranch, Type);
819 }
820
821 /// Return true if this is a branch which may fall
822 /// through to the next instruction or may transfer control flow to some other
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200823 /// block. The TargetInstrInfo::analyzeBranch method can be used to get more
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100824 /// information about this branch.
825 bool isConditionalBranch(QueryType Type = AnyInBundle) const {
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200826 return isBranch(Type) && !isBarrier(Type) && !isIndirectBranch(Type);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100827 }
828
829 /// Return true if this is a branch which always
830 /// transfers control flow to some other block. The
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200831 /// TargetInstrInfo::analyzeBranch method can be used to get more information
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100832 /// about this branch.
833 bool isUnconditionalBranch(QueryType Type = AnyInBundle) const {
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200834 return isBranch(Type) && isBarrier(Type) && !isIndirectBranch(Type);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100835 }
836
837 /// Return true if this instruction has a predicate operand that
838 /// controls execution. It may be set to 'always', or may be set to other
839 /// values. There are various methods in TargetInstrInfo that can be used to
840 /// control and modify the predicate in this instruction.
841 bool isPredicable(QueryType Type = AllInBundle) const {
842 // If it's a bundle than all bundled instructions must be predicable for this
843 // to return true.
844 return hasProperty(MCID::Predicable, Type);
845 }
846
847 /// Return true if this instruction is a comparison.
848 bool isCompare(QueryType Type = IgnoreBundle) const {
849 return hasProperty(MCID::Compare, Type);
850 }
851
852 /// Return true if this instruction is a move immediate
853 /// (including conditional moves) instruction.
854 bool isMoveImmediate(QueryType Type = IgnoreBundle) const {
855 return hasProperty(MCID::MoveImm, Type);
856 }
857
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100858 /// Return true if this instruction is a register move.
859 /// (including moving values from subreg to reg)
860 bool isMoveReg(QueryType Type = IgnoreBundle) const {
861 return hasProperty(MCID::MoveReg, Type);
862 }
863
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100864 /// Return true if this instruction is a bitcast instruction.
865 bool isBitcast(QueryType Type = IgnoreBundle) const {
866 return hasProperty(MCID::Bitcast, Type);
867 }
868
869 /// Return true if this instruction is a select instruction.
870 bool isSelect(QueryType Type = IgnoreBundle) const {
871 return hasProperty(MCID::Select, Type);
872 }
873
874 /// Return true if this instruction cannot be safely duplicated.
875 /// For example, if the instruction has a unique labels attached
876 /// to it, duplicating it would cause multiple definition errors.
877 bool isNotDuplicable(QueryType Type = AnyInBundle) const {
878 return hasProperty(MCID::NotDuplicable, Type);
879 }
880
881 /// Return true if this instruction is convergent.
882 /// Convergent instructions can not be made control-dependent on any
883 /// additional values.
884 bool isConvergent(QueryType Type = AnyInBundle) const {
885 if (isInlineAsm()) {
886 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
887 if (ExtraInfo & InlineAsm::Extra_IsConvergent)
888 return true;
889 }
890 return hasProperty(MCID::Convergent, Type);
891 }
892
893 /// Returns true if the specified instruction has a delay slot
894 /// which must be filled by the code generator.
895 bool hasDelaySlot(QueryType Type = AnyInBundle) const {
896 return hasProperty(MCID::DelaySlot, Type);
897 }
898
899 /// Return true for instructions that can be folded as
900 /// memory operands in other instructions. The most common use for this
901 /// is instructions that are simple loads from memory that don't modify
902 /// the loaded value in any way, but it can also be used for instructions
903 /// that can be expressed as constant-pool loads, such as V_SETALLONES
904 /// on x86, to allow them to be folded when it is beneficial.
905 /// This should only be set on instructions that return a value in their
906 /// only virtual register definition.
907 bool canFoldAsLoad(QueryType Type = IgnoreBundle) const {
908 return hasProperty(MCID::FoldableAsLoad, Type);
909 }
910
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100911 /// Return true if this instruction behaves
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100912 /// the same way as the generic REG_SEQUENCE instructions.
913 /// E.g., on ARM,
914 /// dX VMOVDRR rY, rZ
915 /// is equivalent to
916 /// dX = REG_SEQUENCE rY, ssub_0, rZ, ssub_1.
917 ///
918 /// Note that for the optimizers to be able to take advantage of
919 /// this property, TargetInstrInfo::getRegSequenceLikeInputs has to be
920 /// override accordingly.
921 bool isRegSequenceLike(QueryType Type = IgnoreBundle) const {
922 return hasProperty(MCID::RegSequence, Type);
923 }
924
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100925 /// Return true if this instruction behaves
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100926 /// the same way as the generic EXTRACT_SUBREG instructions.
927 /// E.g., on ARM,
928 /// rX, rY VMOVRRD dZ
929 /// is equivalent to two EXTRACT_SUBREG:
930 /// rX = EXTRACT_SUBREG dZ, ssub_0
931 /// rY = EXTRACT_SUBREG dZ, ssub_1
932 ///
933 /// Note that for the optimizers to be able to take advantage of
934 /// this property, TargetInstrInfo::getExtractSubregLikeInputs has to be
935 /// override accordingly.
936 bool isExtractSubregLike(QueryType Type = IgnoreBundle) const {
937 return hasProperty(MCID::ExtractSubreg, Type);
938 }
939
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100940 /// Return true if this instruction behaves
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100941 /// the same way as the generic INSERT_SUBREG instructions.
942 /// E.g., on ARM,
943 /// dX = VSETLNi32 dY, rZ, Imm
944 /// is equivalent to a INSERT_SUBREG:
945 /// dX = INSERT_SUBREG dY, rZ, translateImmToSubIdx(Imm)
946 ///
947 /// Note that for the optimizers to be able to take advantage of
948 /// this property, TargetInstrInfo::getInsertSubregLikeInputs has to be
949 /// override accordingly.
950 bool isInsertSubregLike(QueryType Type = IgnoreBundle) const {
951 return hasProperty(MCID::InsertSubreg, Type);
952 }
953
954 //===--------------------------------------------------------------------===//
955 // Side Effect Analysis
956 //===--------------------------------------------------------------------===//
957
958 /// Return true if this instruction could possibly read memory.
959 /// Instructions with this flag set are not necessarily simple load
960 /// instructions, they may load a value and modify it, for example.
961 bool mayLoad(QueryType Type = AnyInBundle) const {
962 if (isInlineAsm()) {
963 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
964 if (ExtraInfo & InlineAsm::Extra_MayLoad)
965 return true;
966 }
967 return hasProperty(MCID::MayLoad, Type);
968 }
969
970 /// Return true if this instruction could possibly modify memory.
971 /// Instructions with this flag set are not necessarily simple store
972 /// instructions, they may store a modified value based on their operands, or
973 /// may not actually modify anything, for example.
974 bool mayStore(QueryType Type = AnyInBundle) const {
975 if (isInlineAsm()) {
976 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
977 if (ExtraInfo & InlineAsm::Extra_MayStore)
978 return true;
979 }
980 return hasProperty(MCID::MayStore, Type);
981 }
982
983 /// Return true if this instruction could possibly read or modify memory.
984 bool mayLoadOrStore(QueryType Type = AnyInBundle) const {
985 return mayLoad(Type) || mayStore(Type);
986 }
987
Andrew Walbran3d2c1972020-04-07 12:24:26 +0100988 /// Return true if this instruction could possibly raise a floating-point
989 /// exception. This is the case if the instruction is a floating-point
990 /// instruction that can in principle raise an exception, as indicated
991 /// by the MCID::MayRaiseFPException property, *and* at the same time,
992 /// the instruction is used in a context where we expect floating-point
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200993 /// exceptions are not disabled, as indicated by the NoFPExcept MI flag.
Andrew Walbran3d2c1972020-04-07 12:24:26 +0100994 bool mayRaiseFPException() const {
995 return hasProperty(MCID::MayRaiseFPException) &&
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200996 !getFlag(MachineInstr::MIFlag::NoFPExcept);
Andrew Walbran3d2c1972020-04-07 12:24:26 +0100997 }
998
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100999 //===--------------------------------------------------------------------===//
1000 // Flags that indicate whether an instruction can be modified by a method.
1001 //===--------------------------------------------------------------------===//
1002
1003 /// Return true if this may be a 2- or 3-address
1004 /// instruction (of the form "X = op Y, Z, ..."), which produces the same
1005 /// result if Y and Z are exchanged. If this flag is set, then the
1006 /// TargetInstrInfo::commuteInstruction method may be used to hack on the
1007 /// instruction.
1008 ///
1009 /// Note that this flag may be set on instructions that are only commutable
1010 /// sometimes. In these cases, the call to commuteInstruction will fail.
1011 /// Also note that some instructions require non-trivial modification to
1012 /// commute them.
1013 bool isCommutable(QueryType Type = IgnoreBundle) const {
1014 return hasProperty(MCID::Commutable, Type);
1015 }
1016
1017 /// Return true if this is a 2-address instruction
1018 /// which can be changed into a 3-address instruction if needed. Doing this
1019 /// transformation can be profitable in the register allocator, because it
1020 /// means that the instruction can use a 2-address form if possible, but
1021 /// degrade into a less efficient form if the source and dest register cannot
1022 /// be assigned to the same register. For example, this allows the x86
1023 /// backend to turn a "shl reg, 3" instruction into an LEA instruction, which
1024 /// is the same speed as the shift but has bigger code size.
1025 ///
1026 /// If this returns true, then the target must implement the
1027 /// TargetInstrInfo::convertToThreeAddress method for this instruction, which
1028 /// is allowed to fail if the transformation isn't valid for this specific
1029 /// instruction (e.g. shl reg, 4 on x86).
1030 ///
1031 bool isConvertibleTo3Addr(QueryType Type = IgnoreBundle) const {
1032 return hasProperty(MCID::ConvertibleTo3Addr, Type);
1033 }
1034
1035 /// Return true if this instruction requires
1036 /// custom insertion support when the DAG scheduler is inserting it into a
1037 /// machine basic block. If this is true for the instruction, it basically
1038 /// means that it is a pseudo instruction used at SelectionDAG time that is
1039 /// expanded out into magic code by the target when MachineInstrs are formed.
1040 ///
1041 /// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method
1042 /// is used to insert this into the MachineBasicBlock.
1043 bool usesCustomInsertionHook(QueryType Type = IgnoreBundle) const {
1044 return hasProperty(MCID::UsesCustomInserter, Type);
1045 }
1046
1047 /// Return true if this instruction requires *adjustment*
1048 /// after instruction selection by calling a target hook. For example, this
1049 /// can be used to fill in ARM 's' optional operand depending on whether
1050 /// the conditional flag register is used.
1051 bool hasPostISelHook(QueryType Type = IgnoreBundle) const {
1052 return hasProperty(MCID::HasPostISelHook, Type);
1053 }
1054
1055 /// Returns true if this instruction is a candidate for remat.
1056 /// This flag is deprecated, please don't use it anymore. If this
1057 /// flag is set, the isReallyTriviallyReMaterializable() method is called to
1058 /// verify the instruction is really rematable.
1059 bool isRematerializable(QueryType Type = AllInBundle) const {
1060 // It's only possible to re-mat a bundle if all bundled instructions are
1061 // re-materializable.
1062 return hasProperty(MCID::Rematerializable, Type);
1063 }
1064
1065 /// Returns true if this instruction has the same cost (or less) than a move
1066 /// instruction. This is useful during certain types of optimizations
1067 /// (e.g., remat during two-address conversion or machine licm)
1068 /// where we would like to remat or hoist the instruction, but not if it costs
1069 /// more than moving the instruction into the appropriate register. Note, we
1070 /// are not marking copies from and to the same register class with this flag.
1071 bool isAsCheapAsAMove(QueryType Type = AllInBundle) const {
1072 // Only returns true for a bundle if all bundled instructions are cheap.
1073 return hasProperty(MCID::CheapAsAMove, Type);
1074 }
1075
1076 /// Returns true if this instruction source operands
1077 /// have special register allocation requirements that are not captured by the
1078 /// operand register classes. e.g. ARM::STRD's two source registers must be an
1079 /// even / odd pair, ARM::STM registers have to be in ascending order.
1080 /// Post-register allocation passes should not attempt to change allocations
1081 /// for sources of instructions with this flag.
1082 bool hasExtraSrcRegAllocReq(QueryType Type = AnyInBundle) const {
1083 return hasProperty(MCID::ExtraSrcRegAllocReq, Type);
1084 }
1085
1086 /// Returns true if this instruction def operands
1087 /// have special register allocation requirements that are not captured by the
1088 /// operand register classes. e.g. ARM::LDRD's two def registers must be an
1089 /// even / odd pair, ARM::LDM registers have to be in ascending order.
1090 /// Post-register allocation passes should not attempt to change allocations
1091 /// for definitions of instructions with this flag.
1092 bool hasExtraDefRegAllocReq(QueryType Type = AnyInBundle) const {
1093 return hasProperty(MCID::ExtraDefRegAllocReq, Type);
1094 }
1095
1096 enum MICheckType {
1097 CheckDefs, // Check all operands for equality
1098 CheckKillDead, // Check all operands including kill / dead markers
1099 IgnoreDefs, // Ignore all definitions
1100 IgnoreVRegDefs // Ignore virtual register definitions
1101 };
1102
1103 /// Return true if this instruction is identical to \p Other.
1104 /// Two instructions are identical if they have the same opcode and all their
1105 /// operands are identical (with respect to MachineOperand::isIdenticalTo()).
1106 /// Note that this means liveness related flags (dead, undef, kill) do not
1107 /// affect the notion of identical.
1108 bool isIdenticalTo(const MachineInstr &Other,
1109 MICheckType Check = CheckDefs) const;
1110
1111 /// Unlink 'this' from the containing basic block, and return it without
1112 /// deleting it.
1113 ///
1114 /// This function can not be used on bundled instructions, use
1115 /// removeFromBundle() to remove individual instructions from a bundle.
1116 MachineInstr *removeFromParent();
1117
1118 /// Unlink this instruction from its basic block and return it without
1119 /// deleting it.
1120 ///
1121 /// If the instruction is part of a bundle, the other instructions in the
1122 /// bundle remain bundled.
1123 MachineInstr *removeFromBundle();
1124
1125 /// Unlink 'this' from the containing basic block and delete it.
1126 ///
1127 /// If this instruction is the header of a bundle, the whole bundle is erased.
1128 /// This function can not be used for instructions inside a bundle, use
1129 /// eraseFromBundle() to erase individual bundled instructions.
1130 void eraseFromParent();
1131
1132 /// Unlink 'this' from the containing basic block and delete it.
1133 ///
1134 /// For all definitions mark their uses in DBG_VALUE nodes
1135 /// as undefined. Otherwise like eraseFromParent().
1136 void eraseFromParentAndMarkDBGValuesForRemoval();
1137
1138 /// Unlink 'this' form its basic block and delete it.
1139 ///
1140 /// If the instruction is part of a bundle, the other instructions in the
1141 /// bundle remain bundled.
1142 void eraseFromBundle();
1143
1144 bool isEHLabel() const { return getOpcode() == TargetOpcode::EH_LABEL; }
1145 bool isGCLabel() const { return getOpcode() == TargetOpcode::GC_LABEL; }
1146 bool isAnnotationLabel() const {
1147 return getOpcode() == TargetOpcode::ANNOTATION_LABEL;
1148 }
1149
1150 /// Returns true if the MachineInstr represents a label.
1151 bool isLabel() const {
1152 return isEHLabel() || isGCLabel() || isAnnotationLabel();
1153 }
1154
1155 bool isCFIInstruction() const {
1156 return getOpcode() == TargetOpcode::CFI_INSTRUCTION;
1157 }
1158
1159 // True if the instruction represents a position in the function.
1160 bool isPosition() const { return isLabel() || isCFIInstruction(); }
1161
1162 bool isDebugValue() const { return getOpcode() == TargetOpcode::DBG_VALUE; }
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001163 bool isDebugLabel() const { return getOpcode() == TargetOpcode::DBG_LABEL; }
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001164 bool isDebugRef() const { return getOpcode() == TargetOpcode::DBG_INSTR_REF; }
1165 bool isDebugInstr() const {
1166 return isDebugValue() || isDebugLabel() || isDebugRef();
1167 }
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001168
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001169 bool isDebugOffsetImm() const { return getDebugOffset().isImm(); }
1170
1171 /// A DBG_VALUE is indirect iff the location operand is a register and
1172 /// the offset operand is an immediate.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001173 bool isIndirectDebugValue() const {
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001174 return isDebugValue() && getDebugOperand(0).isReg() && isDebugOffsetImm();
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001175 }
1176
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001177 /// A DBG_VALUE is an entry value iff its debug expression contains the
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001178 /// DW_OP_LLVM_entry_value operation.
1179 bool isDebugEntryValue() const;
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001180
1181 /// Return true if the instruction is a debug value which describes a part of
1182 /// a variable as unavailable.
1183 bool isUndefDebugValue() const {
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001184 return isDebugValue() && getDebugOperand(0).isReg() &&
1185 !getDebugOperand(0).getReg().isValid();
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001186 }
1187
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001188 bool isPHI() const {
1189 return getOpcode() == TargetOpcode::PHI ||
1190 getOpcode() == TargetOpcode::G_PHI;
1191 }
1192 bool isKill() const { return getOpcode() == TargetOpcode::KILL; }
1193 bool isImplicitDef() const { return getOpcode()==TargetOpcode::IMPLICIT_DEF; }
Andrew Walbran16937d02019-10-22 13:54:20 +01001194 bool isInlineAsm() const {
1195 return getOpcode() == TargetOpcode::INLINEASM ||
1196 getOpcode() == TargetOpcode::INLINEASM_BR;
1197 }
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001198
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001199 /// FIXME: Seems like a layering violation that the AsmDialect, which is X86
1200 /// specific, be attached to a generic MachineInstr.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001201 bool isMSInlineAsm() const {
Andrew Walbran16937d02019-10-22 13:54:20 +01001202 return isInlineAsm() && getInlineAsmDialect() == InlineAsm::AD_Intel;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001203 }
1204
1205 bool isStackAligningInlineAsm() const;
1206 InlineAsm::AsmDialect getInlineAsmDialect() const;
1207
1208 bool isInsertSubreg() const {
1209 return getOpcode() == TargetOpcode::INSERT_SUBREG;
1210 }
1211
1212 bool isSubregToReg() const {
1213 return getOpcode() == TargetOpcode::SUBREG_TO_REG;
1214 }
1215
1216 bool isRegSequence() const {
1217 return getOpcode() == TargetOpcode::REG_SEQUENCE;
1218 }
1219
1220 bool isBundle() const {
1221 return getOpcode() == TargetOpcode::BUNDLE;
1222 }
1223
1224 bool isCopy() const {
1225 return getOpcode() == TargetOpcode::COPY;
1226 }
1227
1228 bool isFullCopy() const {
1229 return isCopy() && !getOperand(0).getSubReg() && !getOperand(1).getSubReg();
1230 }
1231
1232 bool isExtractSubreg() const {
1233 return getOpcode() == TargetOpcode::EXTRACT_SUBREG;
1234 }
1235
1236 /// Return true if the instruction behaves like a copy.
1237 /// This does not include native copy instructions.
1238 bool isCopyLike() const {
1239 return isCopy() || isSubregToReg();
1240 }
1241
1242 /// Return true is the instruction is an identity copy.
1243 bool isIdentityCopy() const {
1244 return isCopy() && getOperand(0).getReg() == getOperand(1).getReg() &&
1245 getOperand(0).getSubReg() == getOperand(1).getSubReg();
1246 }
1247
1248 /// Return true if this instruction doesn't produce any output in the form of
1249 /// executable instructions.
1250 bool isMetaInstruction() const {
1251 switch (getOpcode()) {
1252 default:
1253 return false;
1254 case TargetOpcode::IMPLICIT_DEF:
1255 case TargetOpcode::KILL:
1256 case TargetOpcode::CFI_INSTRUCTION:
1257 case TargetOpcode::EH_LABEL:
1258 case TargetOpcode::GC_LABEL:
1259 case TargetOpcode::DBG_VALUE:
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001260 case TargetOpcode::DBG_INSTR_REF:
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001261 case TargetOpcode::DBG_LABEL:
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001262 case TargetOpcode::LIFETIME_START:
1263 case TargetOpcode::LIFETIME_END:
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001264 case TargetOpcode::PSEUDO_PROBE:
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001265 return true;
1266 }
1267 }
1268
1269 /// Return true if this is a transient instruction that is either very likely
1270 /// to be eliminated during register allocation (such as copy-like
1271 /// instructions), or if this instruction doesn't have an execution-time cost.
1272 bool isTransient() const {
1273 switch (getOpcode()) {
1274 default:
1275 return isMetaInstruction();
1276 // Copy-like instructions are usually eliminated during register allocation.
1277 case TargetOpcode::PHI:
1278 case TargetOpcode::G_PHI:
1279 case TargetOpcode::COPY:
1280 case TargetOpcode::INSERT_SUBREG:
1281 case TargetOpcode::SUBREG_TO_REG:
1282 case TargetOpcode::REG_SEQUENCE:
1283 return true;
1284 }
1285 }
1286
1287 /// Return the number of instructions inside the MI bundle, excluding the
1288 /// bundle header.
1289 ///
1290 /// This is the number of instructions that MachineBasicBlock::iterator
1291 /// skips, 0 for unbundled instructions.
1292 unsigned getBundleSize() const;
1293
1294 /// Return true if the MachineInstr reads the specified register.
1295 /// If TargetRegisterInfo is passed, then it also checks if there
1296 /// is a read of a super-register.
1297 /// This does not count partial redefines of virtual registers as reads:
1298 /// %reg1024:6 = OP.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001299 bool readsRegister(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001300 const TargetRegisterInfo *TRI = nullptr) const {
1301 return findRegisterUseOperandIdx(Reg, false, TRI) != -1;
1302 }
1303
1304 /// Return true if the MachineInstr reads the specified virtual register.
1305 /// Take into account that a partial define is a
1306 /// read-modify-write operation.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001307 bool readsVirtualRegister(Register Reg) const {
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001308 return readsWritesVirtualRegister(Reg).first;
1309 }
1310
1311 /// Return a pair of bools (reads, writes) indicating if this instruction
1312 /// reads or writes Reg. This also considers partial defines.
1313 /// If Ops is not null, all operand indices for Reg are added.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001314 std::pair<bool,bool> readsWritesVirtualRegister(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001315 SmallVectorImpl<unsigned> *Ops = nullptr) const;
1316
1317 /// Return true if the MachineInstr kills the specified register.
1318 /// If TargetRegisterInfo is passed, then it also checks if there is
1319 /// a kill of a super-register.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001320 bool killsRegister(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001321 const TargetRegisterInfo *TRI = nullptr) const {
1322 return findRegisterUseOperandIdx(Reg, true, TRI) != -1;
1323 }
1324
1325 /// Return true if the MachineInstr fully defines the specified register.
1326 /// If TargetRegisterInfo is passed, then it also checks
1327 /// if there is a def of a super-register.
1328 /// NOTE: It's ignoring subreg indices on virtual registers.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001329 bool definesRegister(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001330 const TargetRegisterInfo *TRI = nullptr) const {
1331 return findRegisterDefOperandIdx(Reg, false, false, TRI) != -1;
1332 }
1333
1334 /// Return true if the MachineInstr modifies (fully define or partially
1335 /// define) the specified register.
1336 /// NOTE: It's ignoring subreg indices on virtual registers.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001337 bool modifiesRegister(Register Reg,
1338 const TargetRegisterInfo *TRI = nullptr) const {
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001339 return findRegisterDefOperandIdx(Reg, false, true, TRI) != -1;
1340 }
1341
1342 /// Returns true if the register is dead in this machine instruction.
1343 /// If TargetRegisterInfo is passed, then it also checks
1344 /// if there is a dead def of a super-register.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001345 bool registerDefIsDead(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001346 const TargetRegisterInfo *TRI = nullptr) const {
1347 return findRegisterDefOperandIdx(Reg, true, false, TRI) != -1;
1348 }
1349
1350 /// Returns true if the MachineInstr has an implicit-use operand of exactly
1351 /// the given register (not considering sub/super-registers).
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001352 bool hasRegisterImplicitUseOperand(Register Reg) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001353
1354 /// Returns the operand index that is a use of the specific register or -1
1355 /// if it is not found. It further tightens the search criteria to a use
1356 /// that kills the register if isKill is true.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001357 int findRegisterUseOperandIdx(Register Reg, bool isKill = false,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001358 const TargetRegisterInfo *TRI = nullptr) const;
1359
1360 /// Wrapper for findRegisterUseOperandIdx, it returns
1361 /// a pointer to the MachineOperand rather than an index.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001362 MachineOperand *findRegisterUseOperand(Register Reg, bool isKill = false,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001363 const TargetRegisterInfo *TRI = nullptr) {
1364 int Idx = findRegisterUseOperandIdx(Reg, isKill, TRI);
1365 return (Idx == -1) ? nullptr : &getOperand(Idx);
1366 }
1367
1368 const MachineOperand *findRegisterUseOperand(
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001369 Register Reg, bool isKill = false,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001370 const TargetRegisterInfo *TRI = nullptr) const {
1371 return const_cast<MachineInstr *>(this)->
1372 findRegisterUseOperand(Reg, isKill, TRI);
1373 }
1374
1375 /// Returns the operand index that is a def of the specified register or
1376 /// -1 if it is not found. If isDead is true, defs that are not dead are
1377 /// skipped. If Overlap is true, then it also looks for defs that merely
1378 /// overlap the specified register. If TargetRegisterInfo is non-null,
1379 /// then it also checks if there is a def of a super-register.
1380 /// This may also return a register mask operand when Overlap is true.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001381 int findRegisterDefOperandIdx(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001382 bool isDead = false, bool Overlap = false,
1383 const TargetRegisterInfo *TRI = nullptr) const;
1384
1385 /// Wrapper for findRegisterDefOperandIdx, it returns
1386 /// a pointer to the MachineOperand rather than an index.
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001387 MachineOperand *
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001388 findRegisterDefOperand(Register Reg, bool isDead = false,
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001389 bool Overlap = false,
1390 const TargetRegisterInfo *TRI = nullptr) {
1391 int Idx = findRegisterDefOperandIdx(Reg, isDead, Overlap, TRI);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001392 return (Idx == -1) ? nullptr : &getOperand(Idx);
1393 }
1394
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001395 const MachineOperand *
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001396 findRegisterDefOperand(Register Reg, bool isDead = false,
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001397 bool Overlap = false,
1398 const TargetRegisterInfo *TRI = nullptr) const {
1399 return const_cast<MachineInstr *>(this)->findRegisterDefOperand(
1400 Reg, isDead, Overlap, TRI);
1401 }
1402
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001403 /// Find the index of the first operand in the
1404 /// operand list that is used to represent the predicate. It returns -1 if
1405 /// none is found.
1406 int findFirstPredOperandIdx() const;
1407
1408 /// Find the index of the flag word operand that
1409 /// corresponds to operand OpIdx on an inline asm instruction. Returns -1 if
1410 /// getOperand(OpIdx) does not belong to an inline asm operand group.
1411 ///
1412 /// If GroupNo is not NULL, it will receive the number of the operand group
1413 /// containing OpIdx.
1414 ///
1415 /// The flag operand is an immediate that can be decoded with methods like
1416 /// InlineAsm::hasRegClassConstraint().
1417 int findInlineAsmFlagIdx(unsigned OpIdx, unsigned *GroupNo = nullptr) const;
1418
1419 /// Compute the static register class constraint for operand OpIdx.
1420 /// For normal instructions, this is derived from the MCInstrDesc.
1421 /// For inline assembly it is derived from the flag words.
1422 ///
1423 /// Returns NULL if the static register class constraint cannot be
1424 /// determined.
1425 const TargetRegisterClass*
1426 getRegClassConstraint(unsigned OpIdx,
1427 const TargetInstrInfo *TII,
1428 const TargetRegisterInfo *TRI) const;
1429
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001430 /// Applies the constraints (def/use) implied by this MI on \p Reg to
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001431 /// the given \p CurRC.
1432 /// If \p ExploreBundle is set and MI is part of a bundle, all the
1433 /// instructions inside the bundle will be taken into account. In other words,
1434 /// this method accumulates all the constraints of the operand of this MI and
1435 /// the related bundle if MI is a bundle or inside a bundle.
1436 ///
1437 /// Returns the register class that satisfies both \p CurRC and the
1438 /// constraints set by MI. Returns NULL if such a register class does not
1439 /// exist.
1440 ///
1441 /// \pre CurRC must not be NULL.
1442 const TargetRegisterClass *getRegClassConstraintEffectForVReg(
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001443 Register Reg, const TargetRegisterClass *CurRC,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001444 const TargetInstrInfo *TII, const TargetRegisterInfo *TRI,
1445 bool ExploreBundle = false) const;
1446
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001447 /// Applies the constraints (def/use) implied by the \p OpIdx operand
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001448 /// to the given \p CurRC.
1449 ///
1450 /// Returns the register class that satisfies both \p CurRC and the
1451 /// constraints set by \p OpIdx MI. Returns NULL if such a register class
1452 /// does not exist.
1453 ///
1454 /// \pre CurRC must not be NULL.
1455 /// \pre The operand at \p OpIdx must be a register.
1456 const TargetRegisterClass *
1457 getRegClassConstraintEffect(unsigned OpIdx, const TargetRegisterClass *CurRC,
1458 const TargetInstrInfo *TII,
1459 const TargetRegisterInfo *TRI) const;
1460
1461 /// Add a tie between the register operands at DefIdx and UseIdx.
1462 /// The tie will cause the register allocator to ensure that the two
1463 /// operands are assigned the same physical register.
1464 ///
1465 /// Tied operands are managed automatically for explicit operands in the
1466 /// MCInstrDesc. This method is for exceptional cases like inline asm.
1467 void tieOperands(unsigned DefIdx, unsigned UseIdx);
1468
1469 /// Given the index of a tied register operand, find the
1470 /// operand it is tied to. Defs are tied to uses and vice versa. Returns the
1471 /// index of the tied operand which must exist.
1472 unsigned findTiedOperandIdx(unsigned OpIdx) const;
1473
1474 /// Given the index of a register def operand,
1475 /// check if the register def is tied to a source operand, due to either
1476 /// two-address elimination or inline assembly constraints. Returns the
1477 /// first tied use operand index by reference if UseOpIdx is not null.
1478 bool isRegTiedToUseOperand(unsigned DefOpIdx,
1479 unsigned *UseOpIdx = nullptr) const {
1480 const MachineOperand &MO = getOperand(DefOpIdx);
1481 if (!MO.isReg() || !MO.isDef() || !MO.isTied())
1482 return false;
1483 if (UseOpIdx)
1484 *UseOpIdx = findTiedOperandIdx(DefOpIdx);
1485 return true;
1486 }
1487
1488 /// Return true if the use operand of the specified index is tied to a def
1489 /// operand. It also returns the def operand index by reference if DefOpIdx
1490 /// is not null.
1491 bool isRegTiedToDefOperand(unsigned UseOpIdx,
1492 unsigned *DefOpIdx = nullptr) const {
1493 const MachineOperand &MO = getOperand(UseOpIdx);
1494 if (!MO.isReg() || !MO.isUse() || !MO.isTied())
1495 return false;
1496 if (DefOpIdx)
1497 *DefOpIdx = findTiedOperandIdx(UseOpIdx);
1498 return true;
1499 }
1500
1501 /// Clears kill flags on all operands.
1502 void clearKillInfo();
1503
1504 /// Replace all occurrences of FromReg with ToReg:SubIdx,
1505 /// properly composing subreg indices where necessary.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001506 void substituteRegister(Register FromReg, Register ToReg, unsigned SubIdx,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001507 const TargetRegisterInfo &RegInfo);
1508
1509 /// We have determined MI kills a register. Look for the
1510 /// operand that uses it and mark it as IsKill. If AddIfNotFound is true,
1511 /// add a implicit operand if it's not found. Returns true if the operand
1512 /// exists / is added.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001513 bool addRegisterKilled(Register IncomingReg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001514 const TargetRegisterInfo *RegInfo,
1515 bool AddIfNotFound = false);
1516
1517 /// Clear all kill flags affecting Reg. If RegInfo is provided, this includes
1518 /// all aliasing registers.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001519 void clearRegisterKills(Register Reg, const TargetRegisterInfo *RegInfo);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001520
1521 /// We have determined MI defined a register without a use.
1522 /// Look for the operand that defines it and mark it as IsDead. If
1523 /// AddIfNotFound is true, add a implicit operand if it's not found. Returns
1524 /// true if the operand exists / is added.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001525 bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001526 bool AddIfNotFound = false);
1527
1528 /// Clear all dead flags on operands defining register @p Reg.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001529 void clearRegisterDeads(Register Reg);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001530
1531 /// Mark all subregister defs of register @p Reg with the undef flag.
1532 /// This function is used when we determined to have a subregister def in an
1533 /// otherwise undefined super register.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001534 void setRegisterDefReadUndef(Register Reg, bool IsUndef = true);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001535
1536 /// We have determined MI defines a register. Make sure there is an operand
1537 /// defining Reg.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001538 void addRegisterDefined(Register Reg,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001539 const TargetRegisterInfo *RegInfo = nullptr);
1540
1541 /// Mark every physreg used by this instruction as
1542 /// dead except those in the UsedRegs list.
1543 ///
1544 /// On instructions with register mask operands, also add implicit-def
1545 /// operands for all registers in UsedRegs.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001546 void setPhysRegsDeadExcept(ArrayRef<Register> UsedRegs,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001547 const TargetRegisterInfo &TRI);
1548
1549 /// Return true if it is safe to move this instruction. If
1550 /// SawStore is set to true, it means that there is a store (or call) between
1551 /// the instruction's location and its intended destination.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001552 bool isSafeToMove(AAResults *AA, bool &SawStore) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001553
1554 /// Returns true if this instruction's memory access aliases the memory
1555 /// access of Other.
1556 //
1557 /// Assumes any physical registers used to compute addresses
1558 /// have the same value for both instructions. Returns false if neither
1559 /// instruction writes to memory.
1560 ///
1561 /// @param AA Optional alias analysis, used to compare memory operands.
1562 /// @param Other MachineInstr to check aliasing against.
1563 /// @param UseTBAA Whether to pass TBAA information to alias analysis.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001564 bool mayAlias(AAResults *AA, const MachineInstr &Other, bool UseTBAA) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001565
1566 /// Return true if this instruction may have an ordered
1567 /// or volatile memory reference, or if the information describing the memory
1568 /// reference is not available. Return false if it is known to have no
1569 /// ordered or volatile memory references.
1570 bool hasOrderedMemoryRef() const;
1571
1572 /// Return true if this load instruction never traps and points to a memory
1573 /// location whose value doesn't change during the execution of this function.
1574 ///
1575 /// Examples include loading a value from the constant pool or from the
1576 /// argument area of a function (if it does not change). If the instruction
1577 /// does multiple loads, this returns true only if all of the loads are
1578 /// dereferenceable and invariant.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001579 bool isDereferenceableInvariantLoad(AAResults *AA) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001580
1581 /// If the specified instruction is a PHI that always merges together the
1582 /// same virtual register, return the register, otherwise return 0.
1583 unsigned isConstantValuePHI() const;
1584
1585 /// Return true if this instruction has side effects that are not modeled
1586 /// by mayLoad / mayStore, etc.
1587 /// For all instructions, the property is encoded in MCInstrDesc::Flags
1588 /// (see MCInstrDesc::hasUnmodeledSideEffects(). The only exception is
1589 /// INLINEASM instruction, in which case the side effect property is encoded
1590 /// in one of its operands (see InlineAsm::Extra_HasSideEffect).
1591 ///
1592 bool hasUnmodeledSideEffects() const;
1593
1594 /// Returns true if it is illegal to fold a load across this instruction.
1595 bool isLoadFoldBarrier() const;
1596
1597 /// Return true if all the defs of this instruction are dead.
1598 bool allDefsAreDead() const;
1599
Andrew Walbran16937d02019-10-22 13:54:20 +01001600 /// Return a valid size if the instruction is a spill instruction.
1601 Optional<unsigned> getSpillSize(const TargetInstrInfo *TII) const;
1602
1603 /// Return a valid size if the instruction is a folded spill instruction.
1604 Optional<unsigned> getFoldedSpillSize(const TargetInstrInfo *TII) const;
1605
1606 /// Return a valid size if the instruction is a restore instruction.
1607 Optional<unsigned> getRestoreSize(const TargetInstrInfo *TII) const;
1608
1609 /// Return a valid size if the instruction is a folded restore instruction.
1610 Optional<unsigned>
1611 getFoldedRestoreSize(const TargetInstrInfo *TII) const;
1612
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001613 /// Copy implicit register operands from specified
1614 /// instruction to this instruction.
1615 void copyImplicitOps(MachineFunction &MF, const MachineInstr &MI);
1616
1617 /// Debugging support
1618 /// @{
1619 /// Determine the generic type to be printed (if needed) on uses and defs.
1620 LLT getTypeToPrint(unsigned OpIdx, SmallBitVector &PrintedTypes,
1621 const MachineRegisterInfo &MRI) const;
1622
1623 /// Return true when an instruction has tied register that can't be determined
1624 /// by the instruction's descriptor. This is useful for MIR printing, to
1625 /// determine whether we need to print the ties or not.
1626 bool hasComplexRegisterTies() const;
1627
1628 /// Print this MI to \p OS.
1629 /// Don't print information that can be inferred from other instructions if
1630 /// \p IsStandalone is false. It is usually true when only a fragment of the
1631 /// function is printed.
1632 /// Only print the defs and the opcode if \p SkipOpers is true.
1633 /// Otherwise, also print operands if \p SkipDebugLoc is true.
1634 /// Otherwise, also print the debug loc, with a terminating newline.
1635 /// \p TII is used to print the opcode name. If it's not present, but the
1636 /// MI is in a function, the opcode will be printed using the function's TII.
1637 void print(raw_ostream &OS, bool IsStandalone = true, bool SkipOpers = false,
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001638 bool SkipDebugLoc = false, bool AddNewLine = true,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001639 const TargetInstrInfo *TII = nullptr) const;
1640 void print(raw_ostream &OS, ModuleSlotTracker &MST, bool IsStandalone = true,
1641 bool SkipOpers = false, bool SkipDebugLoc = false,
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001642 bool AddNewLine = true,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001643 const TargetInstrInfo *TII = nullptr) const;
1644 void dump() const;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001645 /// Print on dbgs() the current instruction and the instructions defining its
1646 /// operands and so on until we reach \p MaxDepth.
1647 void dumpr(const MachineRegisterInfo &MRI,
1648 unsigned MaxDepth = UINT_MAX) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001649 /// @}
1650
1651 //===--------------------------------------------------------------------===//
1652 // Accessors used to build up machine instructions.
1653
1654 /// Add the specified operand to the instruction. If it is an implicit
1655 /// operand, it is added to the end of the operand list. If it is an
1656 /// explicit operand it is added at the end of the explicit operand list
1657 /// (before the first implicit operand).
1658 ///
1659 /// MF must be the machine function that was used to allocate this
1660 /// instruction.
1661 ///
1662 /// MachineInstrBuilder provides a more convenient interface for creating
1663 /// instructions and adding operands.
1664 void addOperand(MachineFunction &MF, const MachineOperand &Op);
1665
1666 /// Add an operand without providing an MF reference. This only works for
1667 /// instructions that are inserted in a basic block.
1668 ///
1669 /// MachineInstrBuilder and the two-argument addOperand(MF, MO) should be
1670 /// preferred.
1671 void addOperand(const MachineOperand &Op);
1672
1673 /// Replace the instruction descriptor (thus opcode) of
1674 /// the current instruction with a new one.
1675 void setDesc(const MCInstrDesc &tid) { MCID = &tid; }
1676
1677 /// Replace current source information with new such.
1678 /// Avoid using this, the constructor argument is preferable.
1679 void setDebugLoc(DebugLoc dl) {
1680 debugLoc = std::move(dl);
1681 assert(debugLoc.hasTrivialDestructor() && "Expected trivial destructor");
1682 }
1683
1684 /// Erase an operand from an instruction, leaving it with one
1685 /// fewer operand than it started with.
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001686 void RemoveOperand(unsigned OpNo);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001687
Andrew Scull0372a572018-11-16 15:47:06 +00001688 /// Clear this MachineInstr's memory reference descriptor list. This resets
1689 /// the memrefs to their most conservative state. This should be used only
1690 /// as a last resort since it greatly pessimizes our knowledge of the memory
1691 /// access performed by the instruction.
1692 void dropMemRefs(MachineFunction &MF);
1693
1694 /// Assign this MachineInstr's memory reference descriptor list.
1695 ///
1696 /// Unlike other methods, this *will* allocate them into a new array
1697 /// associated with the provided `MachineFunction`.
1698 void setMemRefs(MachineFunction &MF, ArrayRef<MachineMemOperand *> MemRefs);
1699
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001700 /// Add a MachineMemOperand to the machine instruction.
1701 /// This function should be used only occasionally. The setMemRefs function
1702 /// is the primary method for setting up a MachineInstr's MemRefs list.
1703 void addMemOperand(MachineFunction &MF, MachineMemOperand *MO);
1704
Andrew Scull0372a572018-11-16 15:47:06 +00001705 /// Clone another MachineInstr's memory reference descriptor list and replace
1706 /// ours with it.
1707 ///
1708 /// Note that `*this` may be the incoming MI!
1709 ///
1710 /// Prefer this API whenever possible as it can avoid allocations in common
1711 /// cases.
1712 void cloneMemRefs(MachineFunction &MF, const MachineInstr &MI);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001713
Andrew Scull0372a572018-11-16 15:47:06 +00001714 /// Clone the merge of multiple MachineInstrs' memory reference descriptors
1715 /// list and replace ours with it.
1716 ///
1717 /// Note that `*this` may be one of the incoming MIs!
1718 ///
1719 /// Prefer this API whenever possible as it can avoid allocations in common
1720 /// cases.
1721 void cloneMergedMemRefs(MachineFunction &MF,
1722 ArrayRef<const MachineInstr *> MIs);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001723
Andrew Scull0372a572018-11-16 15:47:06 +00001724 /// Set a symbol that will be emitted just prior to the instruction itself.
1725 ///
1726 /// Setting this to a null pointer will remove any such symbol.
1727 ///
1728 /// FIXME: This is not fully implemented yet.
1729 void setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol);
1730
1731 /// Set a symbol that will be emitted just after the instruction itself.
1732 ///
1733 /// Setting this to a null pointer will remove any such symbol.
1734 ///
1735 /// FIXME: This is not fully implemented yet.
1736 void setPostInstrSymbol(MachineFunction &MF, MCSymbol *Symbol);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001737
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001738 /// Clone another MachineInstr's pre- and post- instruction symbols and
1739 /// replace ours with it.
1740 void cloneInstrSymbols(MachineFunction &MF, const MachineInstr &MI);
1741
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001742 /// Set a marker on instructions that denotes where we should create and emit
1743 /// heap alloc site labels. This waits until after instruction selection and
1744 /// optimizations to create the label, so it should still work if the
1745 /// instruction is removed or duplicated.
1746 void setHeapAllocMarker(MachineFunction &MF, MDNode *MD);
1747
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001748 /// Return the MIFlags which represent both MachineInstrs. This
1749 /// should be used when merging two MachineInstrs into one. This routine does
1750 /// not modify the MIFlags of this MachineInstr.
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001751 uint16_t mergeFlagsWith(const MachineInstr& Other) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001752
Andrew Walbran16937d02019-10-22 13:54:20 +01001753 static uint16_t copyFlagsFromInstruction(const Instruction &I);
1754
Andrew Scull0372a572018-11-16 15:47:06 +00001755 /// Copy all flags to MachineInst MIFlags
1756 void copyIRFlags(const Instruction &I);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001757
1758 /// Break any tie involving OpIdx.
1759 void untieRegOperand(unsigned OpIdx) {
1760 MachineOperand &MO = getOperand(OpIdx);
1761 if (MO.isReg() && MO.isTied()) {
1762 getOperand(findTiedOperandIdx(OpIdx)).TiedTo = 0;
1763 MO.TiedTo = 0;
1764 }
1765 }
1766
1767 /// Add all implicit def and use operands to this instruction.
1768 void addImplicitDefUseOperands(MachineFunction &MF);
1769
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001770 /// Scan instructions immediately following MI and collect any matching
1771 /// DBG_VALUEs.
Andrew Scull0372a572018-11-16 15:47:06 +00001772 void collectDebugValues(SmallVectorImpl<MachineInstr *> &DbgValues);
1773
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001774 /// Find all DBG_VALUEs that point to the register def in this instruction
1775 /// and point them to \p Reg instead.
1776 void changeDebugValuesDefReg(Register Reg);
1777
1778 /// Returns the Intrinsic::ID for this instruction.
1779 /// \pre Must have an intrinsic ID operand.
1780 unsigned getIntrinsicID() const {
1781 return getOperand(getNumExplicitDefs()).getIntrinsicID();
1782 }
1783
1784 /// Sets all register debug operands in this debug value instruction to be
1785 /// undef.
1786 void setDebugValueUndef() {
1787 assert(isDebugValue() && "Must be a debug value instruction.");
1788 for (MachineOperand &MO : debug_operands()) {
1789 if (MO.isReg()) {
1790 MO.setReg(0);
1791 MO.setSubReg(0);
1792 }
1793 }
1794 }
Andrew Scull0372a572018-11-16 15:47:06 +00001795
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001796private:
1797 /// If this instruction is embedded into a MachineFunction, return the
1798 /// MachineRegisterInfo object for the current function, otherwise
1799 /// return null.
1800 MachineRegisterInfo *getRegInfo();
1801
1802 /// Unlink all of the register operands in this instruction from their
1803 /// respective use lists. This requires that the operands already be on their
1804 /// use lists.
1805 void RemoveRegOperandsFromUseLists(MachineRegisterInfo&);
1806
1807 /// Add all of the register operands in this instruction from their
1808 /// respective use lists. This requires that the operands not be on their
1809 /// use lists yet.
1810 void AddRegOperandsToUseLists(MachineRegisterInfo&);
1811
1812 /// Slow path for hasProperty when we're dealing with a bundle.
Andrew Scull0372a572018-11-16 15:47:06 +00001813 bool hasPropertyInBundle(uint64_t Mask, QueryType Type) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001814
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001815 /// Implements the logic of getRegClassConstraintEffectForVReg for the
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001816 /// this MI and the given operand index \p OpIdx.
1817 /// If the related operand does not constrained Reg, this returns CurRC.
1818 const TargetRegisterClass *getRegClassConstraintEffectForVRegImpl(
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001819 unsigned OpIdx, Register Reg, const TargetRegisterClass *CurRC,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001820 const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001821
1822 /// Stores extra instruction information inline or allocates as ExtraInfo
1823 /// based on the number of pointers.
1824 void setExtraInfo(MachineFunction &MF, ArrayRef<MachineMemOperand *> MMOs,
1825 MCSymbol *PreInstrSymbol, MCSymbol *PostInstrSymbol,
1826 MDNode *HeapAllocMarker);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001827};
1828
1829/// Special DenseMapInfo traits to compare MachineInstr* by *value* of the
1830/// instruction rather than by pointer value.
1831/// The hashing and equality testing functions ignore definitions so this is
1832/// useful for CSE, etc.
1833struct MachineInstrExpressionTrait : DenseMapInfo<MachineInstr*> {
1834 static inline MachineInstr *getEmptyKey() {
1835 return nullptr;
1836 }
1837
1838 static inline MachineInstr *getTombstoneKey() {
1839 return reinterpret_cast<MachineInstr*>(-1);
1840 }
1841
1842 static unsigned getHashValue(const MachineInstr* const &MI);
1843
1844 static bool isEqual(const MachineInstr* const &LHS,
1845 const MachineInstr* const &RHS) {
1846 if (RHS == getEmptyKey() || RHS == getTombstoneKey() ||
1847 LHS == getEmptyKey() || LHS == getTombstoneKey())
1848 return LHS == RHS;
1849 return LHS->isIdenticalTo(*RHS, MachineInstr::IgnoreVRegDefs);
1850 }
1851};
1852
1853//===----------------------------------------------------------------------===//
1854// Debugging Support
1855
1856inline raw_ostream& operator<<(raw_ostream &OS, const MachineInstr &MI) {
1857 MI.print(OS);
1858 return OS;
1859}
1860
1861} // end namespace llvm
1862
1863#endif // LLVM_CODEGEN_MACHINEINSTR_H