LLVM  8.0.1
MachineIRBuilder.h
Go to the documentation of this file.
1 //===-- llvm/CodeGen/GlobalISel/MachineIRBuilder.h - MIBuilder --*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 /// \file
10 /// This file declares the MachineIRBuilder class.
11 /// This is a helper class to build MachineInstr.
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CODEGEN_GLOBALISEL_MACHINEIRBUILDER_H
15 #define LLVM_CODEGEN_GLOBALISEL_MACHINEIRBUILDER_H
16 
19 
24 #include "llvm/IR/Constants.h"
25 #include "llvm/IR/DebugLoc.h"
26 
27 
28 namespace llvm {
29 
30 // Forward declarations.
31 class MachineFunction;
32 class MachineInstr;
33 class TargetInstrInfo;
34 class GISelChangeObserver;
35 
36 /// Class which stores all the state required in a MachineIRBuilder.
37 /// Since MachineIRBuilders will only store state in this object, it allows
38 /// to transfer BuilderState between different kinds of MachineIRBuilders.
40  /// MachineFunction under construction.
42  /// Information used to access the description of the opcodes.
44  /// Information used to verify types are consistent and to create virtual registers.
46  /// Debug location to be set to any instruction we create.
48 
49  /// \name Fields describing the insertion point.
50  /// @{
53  /// @}
54 
56 
58 };
59 
60 class DstOp {
61  union {
63  unsigned Reg;
65  };
66 
67 public:
68  enum class DstType { Ty_LLT, Ty_Reg, Ty_RC };
69  DstOp(unsigned R) : Reg(R), Ty(DstType::Ty_Reg) {}
70  DstOp(const LLT &T) : LLTTy(T), Ty(DstType::Ty_LLT) {}
71  DstOp(const TargetRegisterClass *TRC) : RC(TRC), Ty(DstType::Ty_RC) {}
72 
74  switch (Ty) {
75  case DstType::Ty_Reg:
76  MIB.addDef(Reg);
77  break;
78  case DstType::Ty_LLT:
79  MIB.addDef(MRI.createGenericVirtualRegister(LLTTy));
80  break;
81  case DstType::Ty_RC:
82  MIB.addDef(MRI.createVirtualRegister(RC));
83  break;
84  }
85  }
86 
88  switch (Ty) {
89  case DstType::Ty_RC:
90  return LLT{};
91  case DstType::Ty_LLT:
92  return LLTTy;
93  case DstType::Ty_Reg:
94  return MRI.getType(Reg);
95  }
96  llvm_unreachable("Unrecognised DstOp::DstType enum");
97  }
98 
99  unsigned getReg() const {
100  assert(Ty == DstType::Ty_Reg && "Not a register");
101  return Reg;
102  }
103 
105  switch (Ty) {
106  case DstType::Ty_RC:
107  return RC;
108  default:
109  llvm_unreachable("Not a RC Operand");
110  }
111  }
112 
113  DstType getDstOpKind() const { return Ty; }
114 
115 private:
116  DstType Ty;
117 };
118 
119 class SrcOp {
120  union {
122  unsigned Reg;
124  };
125 
126 public:
127  enum class SrcType { Ty_Reg, Ty_MIB, Ty_Predicate };
128  SrcOp(unsigned R) : Reg(R), Ty(SrcType::Ty_Reg) {}
129  SrcOp(const MachineInstrBuilder &MIB) : SrcMIB(MIB), Ty(SrcType::Ty_MIB) {}
130  SrcOp(const CmpInst::Predicate P) : Pred(P), Ty(SrcType::Ty_Predicate) {}
131 
132  void addSrcToMIB(MachineInstrBuilder &MIB) const {
133  switch (Ty) {
134  case SrcType::Ty_Predicate:
135  MIB.addPredicate(Pred);
136  break;
137  case SrcType::Ty_Reg:
138  MIB.addUse(Reg);
139  break;
140  case SrcType::Ty_MIB:
141  MIB.addUse(SrcMIB->getOperand(0).getReg());
142  break;
143  }
144  }
145 
147  switch (Ty) {
148  case SrcType::Ty_Predicate:
149  llvm_unreachable("Not a register operand");
150  case SrcType::Ty_Reg:
151  return MRI.getType(Reg);
152  case SrcType::Ty_MIB:
153  return MRI.getType(SrcMIB->getOperand(0).getReg());
154  }
155  llvm_unreachable("Unrecognised SrcOp::SrcType enum");
156  }
157 
158  unsigned getReg() const {
159  switch (Ty) {
160  case SrcType::Ty_Predicate:
161  llvm_unreachable("Not a register operand");
162  case SrcType::Ty_Reg:
163  return Reg;
164  case SrcType::Ty_MIB:
165  return SrcMIB->getOperand(0).getReg();
166  }
167  llvm_unreachable("Unrecognised SrcOp::SrcType enum");
168  }
169 
171  switch (Ty) {
172  case SrcType::Ty_Predicate:
173  return Pred;
174  default:
175  llvm_unreachable("Not a register operand");
176  }
177  }
178 
179  SrcType getSrcOpKind() const { return Ty; }
180 
181 private:
182  SrcType Ty;
183 };
184 
185 class FlagsOp {
186  Optional<unsigned> Flags;
187 
188 public:
189  explicit FlagsOp(unsigned F) : Flags(F) {}
190  FlagsOp() : Flags(None) {}
191  Optional<unsigned> getFlags() const { return Flags; }
192 };
193 /// Helper class to build MachineInstr.
194 /// It keeps internally the insertion point and debug location for all
195 /// the new instructions we want to create.
196 /// This information can be modify via the related setters.
198 
199  MachineIRBuilderState State;
200 
201 protected:
202  void validateTruncExt(const LLT &Dst, const LLT &Src, bool IsExtend);
203 
204  void validateBinaryOp(const LLT &Res, const LLT &Op0, const LLT &Op1);
205 
206  void validateSelectOp(const LLT &ResTy, const LLT &TstTy, const LLT &Op0Ty,
207  const LLT &Op1Ty);
208  void recordInsertion(MachineInstr *MI) const;
209 
210 public:
211  /// Some constructors for easy use.
212  MachineIRBuilder() = default;
215  setInstr(MI);
216  }
217 
218  virtual ~MachineIRBuilder() = default;
219 
220  MachineIRBuilder(const MachineIRBuilderState &BState) : State(BState) {}
221 
223  assert(State.TII && "TargetInstrInfo is not set");
224  return *State.TII;
225  }
226 
227  /// Getter for the function we currently build.
229  assert(State.MF && "MachineFunction is not set");
230  return *State.MF;
231  }
232 
233  /// Getter for DebugLoc
234  const DebugLoc &getDL() { return State.DL; }
235 
236  /// Getter for MRI
237  MachineRegisterInfo *getMRI() { return State.MRI; }
238  const MachineRegisterInfo *getMRI() const { return State.MRI; }
239 
240  /// Getter for the State
241  MachineIRBuilderState &getState() { return State; }
242 
243  /// Getter for the basic block we currently build.
244  const MachineBasicBlock &getMBB() const {
245  assert(State.MBB && "MachineBasicBlock is not set");
246  return *State.MBB;
247  }
248 
250  return const_cast<MachineBasicBlock &>(
251  const_cast<const MachineIRBuilder *>(this)->getMBB());
252  }
253 
254  GISelCSEInfo *getCSEInfo() { return State.CSEInfo; }
255  const GISelCSEInfo *getCSEInfo() const { return State.CSEInfo; }
256 
257  /// Current insertion point for new instructions.
259 
260  /// Set the insertion point before the specified position.
261  /// \pre MBB must be in getMF().
262  /// \pre II must be a valid iterator in MBB.
264  /// @}
265 
266  void setCSEInfo(GISelCSEInfo *Info);
267 
268  /// \name Setters for the insertion point.
269  /// @{
270  /// Set the MachineFunction where to build instructions.
271  void setMF(MachineFunction &MF);
272 
273  /// Set the insertion point to the end of \p MBB.
274  /// \pre \p MBB must be contained by getMF().
275  void setMBB(MachineBasicBlock &MBB);
276 
277  /// Set the insertion point to before MI.
278  /// \pre MI must be in getMF().
279  void setInstr(MachineInstr &MI);
280  /// @}
281 
282  void setChangeObserver(GISelChangeObserver &Observer);
283  void stopObservingChanges();
284  /// @}
285 
286  /// Set the debug location to \p DL for all the next build instructions.
287  void setDebugLoc(const DebugLoc &DL) { this->State.DL = DL; }
288 
289  /// Get the current instruction's debug location.
290  DebugLoc getDebugLoc() { return State.DL; }
291 
292  /// Build and insert <empty> = \p Opcode <empty>.
293  /// The insertion point is the one set by the last call of either
294  /// setBasicBlock or setMI.
295  ///
296  /// \pre setBasicBlock or setMI must have been called.
297  ///
298  /// \return a MachineInstrBuilder for the newly created instruction.
299  MachineInstrBuilder buildInstr(unsigned Opcode);
300 
301  /// Build but don't insert <empty> = \p Opcode <empty>.
302  ///
303  /// \pre setMF, setBasicBlock or setMI must have been called.
304  ///
305  /// \return a MachineInstrBuilder for the newly created instruction.
306  MachineInstrBuilder buildInstrNoInsert(unsigned Opcode);
307 
308  /// Insert an existing instruction at the insertion point.
309  MachineInstrBuilder insertInstr(MachineInstrBuilder MIB);
310 
311  /// Build and insert a DBG_VALUE instruction expressing the fact that the
312  /// associated \p Variable lives in \p Reg (suitably modified by \p Expr).
313  MachineInstrBuilder buildDirectDbgValue(unsigned Reg, const MDNode *Variable,
314  const MDNode *Expr);
315 
316  /// Build and insert a DBG_VALUE instruction expressing the fact that the
317  /// associated \p Variable lives in memory at \p Reg (suitably modified by \p
318  /// Expr).
319  MachineInstrBuilder buildIndirectDbgValue(unsigned Reg,
320  const MDNode *Variable,
321  const MDNode *Expr);
322 
323  /// Build and insert a DBG_VALUE instruction expressing the fact that the
324  /// associated \p Variable lives in the stack slot specified by \p FI
325  /// (suitably modified by \p Expr).
326  MachineInstrBuilder buildFIDbgValue(int FI, const MDNode *Variable,
327  const MDNode *Expr);
328 
329  /// Build and insert a DBG_VALUE instructions specifying that \p Variable is
330  /// given by \p C (suitably modified by \p Expr).
331  MachineInstrBuilder buildConstDbgValue(const Constant &C,
332  const MDNode *Variable,
333  const MDNode *Expr);
334 
335  /// Build and insert a DBG_LABEL instructions specifying that \p Label is
336  /// given. Convert "llvm.dbg.label Label" to "DBG_LABEL Label".
337  MachineInstrBuilder buildDbgLabel(const MDNode *Label);
338 
339  /// Build and insert \p Res = G_FRAME_INDEX \p Idx
340  ///
341  /// G_FRAME_INDEX materializes the address of an alloca value or other
342  /// stack-based object.
343  ///
344  /// \pre setBasicBlock or setMI must have been called.
345  /// \pre \p Res must be a generic virtual register with pointer type.
346  ///
347  /// \return a MachineInstrBuilder for the newly created instruction.
348  MachineInstrBuilder buildFrameIndex(unsigned Res, int Idx);
349 
350  /// Build and insert \p Res = G_GLOBAL_VALUE \p GV
351  ///
352  /// G_GLOBAL_VALUE materializes the address of the specified global
353  /// into \p Res.
354  ///
355  /// \pre setBasicBlock or setMI must have been called.
356  /// \pre \p Res must be a generic virtual register with pointer type
357  /// in the same address space as \p GV.
358  ///
359  /// \return a MachineInstrBuilder for the newly created instruction.
360  MachineInstrBuilder buildGlobalValue(unsigned Res, const GlobalValue *GV);
361 
362 
363  /// Build and insert \p Res = G_GEP \p Op0, \p Op1
364  ///
365  /// G_GEP adds \p Op1 bytes to the pointer specified by \p Op0,
366  /// storing the resulting pointer in \p Res.
367  ///
368  /// \pre setBasicBlock or setMI must have been called.
369  /// \pre \p Res and \p Op0 must be generic virtual registers with pointer
370  /// type.
371  /// \pre \p Op1 must be a generic virtual register with scalar type.
372  ///
373  /// \return a MachineInstrBuilder for the newly created instruction.
374  MachineInstrBuilder buildGEP(unsigned Res, unsigned Op0,
375  unsigned Op1);
376 
377  /// Materialize and insert \p Res = G_GEP \p Op0, (G_CONSTANT \p Value)
378  ///
379  /// G_GEP adds \p Value bytes to the pointer specified by \p Op0,
380  /// storing the resulting pointer in \p Res. If \p Value is zero then no
381  /// G_GEP or G_CONSTANT will be created and \pre Op0 will be assigned to
382  /// \p Res.
383  ///
384  /// \pre setBasicBlock or setMI must have been called.
385  /// \pre \p Op0 must be a generic virtual register with pointer type.
386  /// \pre \p ValueTy must be a scalar type.
387  /// \pre \p Res must be 0. This is to detect confusion between
388  /// materializeGEP() and buildGEP().
389  /// \post \p Res will either be a new generic virtual register of the same
390  /// type as \p Op0 or \p Op0 itself.
391  ///
392  /// \return a MachineInstrBuilder for the newly created instruction.
393  Optional<MachineInstrBuilder> materializeGEP(unsigned &Res, unsigned Op0,
394  const LLT &ValueTy,
395  uint64_t Value);
396 
397  /// Build and insert \p Res = G_PTR_MASK \p Op0, \p NumBits
398  ///
399  /// G_PTR_MASK clears the low bits of a pointer operand without destroying its
400  /// pointer properties. This has the effect of rounding the address *down* to
401  /// a specified alignment in bits.
402  ///
403  /// \pre setBasicBlock or setMI must have been called.
404  /// \pre \p Res and \p Op0 must be generic virtual registers with pointer
405  /// type.
406  /// \pre \p NumBits must be an integer representing the number of low bits to
407  /// be cleared in \p Op0.
408  ///
409  /// \return a MachineInstrBuilder for the newly created instruction.
410  MachineInstrBuilder buildPtrMask(unsigned Res, unsigned Op0,
411  uint32_t NumBits);
412 
413  /// Build and insert \p Res, \p CarryOut = G_UADDE \p Op0,
414  /// \p Op1, \p CarryIn
415  ///
416  /// G_UADDE sets \p Res to \p Op0 + \p Op1 + \p CarryIn (truncated to the bit
417  /// width) and sets \p CarryOut to 1 if the result overflowed in unsigned
418  /// arithmetic.
419  ///
420  /// \pre setBasicBlock or setMI must have been called.
421  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
422  /// with the same scalar type.
423  /// \pre \p CarryOut and \p CarryIn must be generic virtual
424  /// registers with the same scalar type (typically s1)
425  ///
426  /// \return The newly created instruction.
427  MachineInstrBuilder buildUAdde(const DstOp &Res, const DstOp &CarryOut,
428  const SrcOp &Op0, const SrcOp &Op1,
429  const SrcOp &CarryIn);
430 
431  /// Build and insert \p Res = G_ANYEXT \p Op0
432  ///
433  /// G_ANYEXT produces a register of the specified width, with bits 0 to
434  /// sizeof(\p Ty) * 8 set to \p Op. The remaining bits are unspecified
435  /// (i.e. this is neither zero nor sign-extension). For a vector register,
436  /// each element is extended individually.
437  ///
438  /// \pre setBasicBlock or setMI must have been called.
439  /// \pre \p Res must be a generic virtual register with scalar or vector type.
440  /// \pre \p Op must be a generic virtual register with scalar or vector type.
441  /// \pre \p Op must be smaller than \p Res
442  ///
443  /// \return The newly created instruction.
444 
445  MachineInstrBuilder buildAnyExt(const DstOp &Res, const SrcOp &Op);
446 
447  /// Build and insert \p Res = G_SEXT \p Op
448  ///
449  /// G_SEXT produces a register of the specified width, with bits 0 to
450  /// sizeof(\p Ty) * 8 set to \p Op. The remaining bits are duplicated from the
451  /// high bit of \p Op (i.e. 2s-complement sign extended).
452  ///
453  /// \pre setBasicBlock or setMI must have been called.
454  /// \pre \p Res must be a generic virtual register with scalar or vector type.
455  /// \pre \p Op must be a generic virtual register with scalar or vector type.
456  /// \pre \p Op must be smaller than \p Res
457  ///
458  /// \return The newly created instruction.
459  MachineInstrBuilder buildSExt(const DstOp &Res, const SrcOp &Op);
460 
461  /// Build and insert \p Res = G_ZEXT \p Op
462  ///
463  /// G_ZEXT produces a register of the specified width, with bits 0 to
464  /// sizeof(\p Ty) * 8 set to \p Op. The remaining bits are 0. For a vector
465  /// register, each element is extended individually.
466  ///
467  /// \pre setBasicBlock or setMI must have been called.
468  /// \pre \p Res must be a generic virtual register with scalar or vector type.
469  /// \pre \p Op must be a generic virtual register with scalar or vector type.
470  /// \pre \p Op must be smaller than \p Res
471  ///
472  /// \return The newly created instruction.
473  MachineInstrBuilder buildZExt(const DstOp &Res, const SrcOp &Op);
474 
475  /// Build and insert \p Res = G_SEXT \p Op, \p Res = G_TRUNC \p Op, or
476  /// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op.
477  /// ///
478  /// \pre setBasicBlock or setMI must have been called.
479  /// \pre \p Res must be a generic virtual register with scalar or vector type.
480  /// \pre \p Op must be a generic virtual register with scalar or vector type.
481  ///
482  /// \return The newly created instruction.
483  MachineInstrBuilder buildSExtOrTrunc(const DstOp &Res, const SrcOp &Op);
484 
485  /// Build and insert \p Res = G_ZEXT \p Op, \p Res = G_TRUNC \p Op, or
486  /// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op.
487  /// ///
488  /// \pre setBasicBlock or setMI must have been called.
489  /// \pre \p Res must be a generic virtual register with scalar or vector type.
490  /// \pre \p Op must be a generic virtual register with scalar or vector type.
491  ///
492  /// \return The newly created instruction.
493  MachineInstrBuilder buildZExtOrTrunc(const DstOp &Res, const SrcOp &Op);
494 
495  // Build and insert \p Res = G_ANYEXT \p Op, \p Res = G_TRUNC \p Op, or
496  /// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op.
497  /// ///
498  /// \pre setBasicBlock or setMI must have been called.
499  /// \pre \p Res must be a generic virtual register with scalar or vector type.
500  /// \pre \p Op must be a generic virtual register with scalar or vector type.
501  ///
502  /// \return The newly created instruction.
503  MachineInstrBuilder buildAnyExtOrTrunc(const DstOp &Res, const SrcOp &Op);
504 
505  /// Build and insert \p Res = \p ExtOpc, \p Res = G_TRUNC \p
506  /// Op, or \p Res = COPY \p Op depending on the differing sizes of \p Res and
507  /// \p Op.
508  /// ///
509  /// \pre setBasicBlock or setMI must have been called.
510  /// \pre \p Res must be a generic virtual register with scalar or vector type.
511  /// \pre \p Op must be a generic virtual register with scalar or vector type.
512  ///
513  /// \return The newly created instruction.
514  MachineInstrBuilder buildExtOrTrunc(unsigned ExtOpc, const DstOp &Res,
515  const SrcOp &Op);
516 
517  /// Build and insert an appropriate cast between two registers of equal size.
518  MachineInstrBuilder buildCast(const DstOp &Dst, const SrcOp &Src);
519 
520  /// Build and insert G_BR \p Dest
521  ///
522  /// G_BR is an unconditional branch to \p Dest.
523  ///
524  /// \pre setBasicBlock or setMI must have been called.
525  ///
526  /// \return a MachineInstrBuilder for the newly created instruction.
527  MachineInstrBuilder buildBr(MachineBasicBlock &Dest);
528 
529  /// Build and insert G_BRCOND \p Tst, \p Dest
530  ///
531  /// G_BRCOND is a conditional branch to \p Dest.
532  ///
533  /// \pre setBasicBlock or setMI must have been called.
534  /// \pre \p Tst must be a generic virtual register with scalar
535  /// type. At the beginning of legalization, this will be a single
536  /// bit (s1). Targets with interesting flags registers may change
537  /// this. For a wider type, whether the branch is taken must only
538  /// depend on bit 0 (for now).
539  ///
540  /// \return The newly created instruction.
541  MachineInstrBuilder buildBrCond(unsigned Tst, MachineBasicBlock &Dest);
542 
543  /// Build and insert G_BRINDIRECT \p Tgt
544  ///
545  /// G_BRINDIRECT is an indirect branch to \p Tgt.
546  ///
547  /// \pre setBasicBlock or setMI must have been called.
548  /// \pre \p Tgt must be a generic virtual register with pointer type.
549  ///
550  /// \return a MachineInstrBuilder for the newly created instruction.
551  MachineInstrBuilder buildBrIndirect(unsigned Tgt);
552 
553  /// Build and insert \p Res = G_CONSTANT \p Val
554  ///
555  /// G_CONSTANT is an integer constant with the specified size and value. \p
556  /// Val will be extended or truncated to the size of \p Reg.
557  ///
558  /// \pre setBasicBlock or setMI must have been called.
559  /// \pre \p Res must be a generic virtual register with scalar or pointer
560  /// type.
561  ///
562  /// \return The newly created instruction.
563  virtual MachineInstrBuilder buildConstant(const DstOp &Res,
564  const ConstantInt &Val);
565 
566  /// Build and insert \p Res = G_CONSTANT \p Val
567  ///
568  /// G_CONSTANT is an integer constant with the specified size and value.
569  ///
570  /// \pre setBasicBlock or setMI must have been called.
571  /// \pre \p Res must be a generic virtual register with scalar type.
572  ///
573  /// \return The newly created instruction.
574  MachineInstrBuilder buildConstant(const DstOp &Res, int64_t Val);
575 
576  /// Build and insert \p Res = G_FCONSTANT \p Val
577  ///
578  /// G_FCONSTANT is a floating-point constant with the specified size and
579  /// value.
580  ///
581  /// \pre setBasicBlock or setMI must have been called.
582  /// \pre \p Res must be a generic virtual register with scalar type.
583  ///
584  /// \return The newly created instruction.
585  virtual MachineInstrBuilder buildFConstant(const DstOp &Res,
586  const ConstantFP &Val);
587 
588  MachineInstrBuilder buildFConstant(const DstOp &Res, double Val);
589 
590  /// Build and insert \p Res = COPY Op
591  ///
592  /// Register-to-register COPY sets \p Res to \p Op.
593  ///
594  /// \pre setBasicBlock or setMI must have been called.
595  ///
596  /// \return a MachineInstrBuilder for the newly created instruction.
597  MachineInstrBuilder buildCopy(const DstOp &Res, const SrcOp &Op);
598 
599  /// Build and insert `Res = G_LOAD Addr, MMO`.
600  ///
601  /// Loads the value stored at \p Addr. Puts the result in \p Res.
602  ///
603  /// \pre setBasicBlock or setMI must have been called.
604  /// \pre \p Res must be a generic virtual register.
605  /// \pre \p Addr must be a generic virtual register with pointer type.
606  ///
607  /// \return a MachineInstrBuilder for the newly created instruction.
608  MachineInstrBuilder buildLoad(unsigned Res, unsigned Addr,
609  MachineMemOperand &MMO);
610 
611  /// Build and insert `Res = <opcode> Addr, MMO`.
612  ///
613  /// Loads the value stored at \p Addr. Puts the result in \p Res.
614  ///
615  /// \pre setBasicBlock or setMI must have been called.
616  /// \pre \p Res must be a generic virtual register.
617  /// \pre \p Addr must be a generic virtual register with pointer type.
618  ///
619  /// \return a MachineInstrBuilder for the newly created instruction.
620  MachineInstrBuilder buildLoadInstr(unsigned Opcode, unsigned Res,
621  unsigned Addr, MachineMemOperand &MMO);
622 
623  /// Build and insert `G_STORE Val, Addr, MMO`.
624  ///
625  /// Stores the value \p Val to \p Addr.
626  ///
627  /// \pre setBasicBlock or setMI must have been called.
628  /// \pre \p Val must be a generic virtual register.
629  /// \pre \p Addr must be a generic virtual register with pointer type.
630  ///
631  /// \return a MachineInstrBuilder for the newly created instruction.
632  MachineInstrBuilder buildStore(unsigned Val, unsigned Addr,
633  MachineMemOperand &MMO);
634 
635  /// Build and insert `Res0, ... = G_EXTRACT Src, Idx0`.
636  ///
637  /// \pre setBasicBlock or setMI must have been called.
638  /// \pre \p Res and \p Src must be generic virtual registers.
639  ///
640  /// \return a MachineInstrBuilder for the newly created instruction.
641  MachineInstrBuilder buildExtract(unsigned Res, unsigned Src, uint64_t Index);
642 
643  /// Build and insert \p Res = IMPLICIT_DEF.
644  MachineInstrBuilder buildUndef(const DstOp &Res);
645 
646  /// Build and insert instructions to put \p Ops together at the specified p
647  /// Indices to form a larger register.
648  ///
649  /// If the types of the input registers are uniform and cover the entirity of
650  /// \p Res then a G_MERGE_VALUES will be produced. Otherwise an IMPLICIT_DEF
651  /// followed by a sequence of G_INSERT instructions.
652  ///
653  /// \pre setBasicBlock or setMI must have been called.
654  /// \pre The final element of the sequence must not extend past the end of the
655  /// destination register.
656  /// \pre The bits defined by each Op (derived from index and scalar size) must
657  /// not overlap.
658  /// \pre \p Indices must be in ascending order of bit position.
659  void buildSequence(unsigned Res, ArrayRef<unsigned> Ops,
660  ArrayRef<uint64_t> Indices);
661 
662  /// Build and insert \p Res = G_MERGE_VALUES \p Op0, ...
663  ///
664  /// G_MERGE_VALUES combines the input elements contiguously into a larger
665  /// register.
666  ///
667  /// \pre setBasicBlock or setMI must have been called.
668  /// \pre The entire register \p Res (and no more) must be covered by the input
669  /// registers.
670  /// \pre The type of all \p Ops registers must be identical.
671  ///
672  /// \return a MachineInstrBuilder for the newly created instruction.
673  MachineInstrBuilder buildMerge(const DstOp &Res, ArrayRef<unsigned> Ops);
674 
675  /// Build and insert \p Res0, ... = G_UNMERGE_VALUES \p Op
676  ///
677  /// G_UNMERGE_VALUES splits contiguous bits of the input into multiple
678  ///
679  /// \pre setBasicBlock or setMI must have been called.
680  /// \pre The entire register \p Res (and no more) must be covered by the input
681  /// registers.
682  /// \pre The type of all \p Res registers must be identical.
683  ///
684  /// \return a MachineInstrBuilder for the newly created instruction.
685  MachineInstrBuilder buildUnmerge(ArrayRef<LLT> Res, const SrcOp &Op);
686  MachineInstrBuilder buildUnmerge(ArrayRef<unsigned> Res, const SrcOp &Op);
687 
688  /// Build and insert \p Res = G_BUILD_VECTOR \p Op0, ...
689  ///
690  /// G_BUILD_VECTOR creates a vector value from multiple scalar registers.
691  /// \pre setBasicBlock or setMI must have been called.
692  /// \pre The entire register \p Res (and no more) must be covered by the
693  /// input scalar registers.
694  /// \pre The type of all \p Ops registers must be identical.
695  ///
696  /// \return a MachineInstrBuilder for the newly created instruction.
697  MachineInstrBuilder buildBuildVector(const DstOp &Res,
698  ArrayRef<unsigned> Ops);
699 
700  /// Build and insert \p Res = G_BUILD_VECTOR_TRUNC \p Op0, ...
701  ///
702  /// G_BUILD_VECTOR_TRUNC creates a vector value from multiple scalar registers
703  /// which have types larger than the destination vector element type, and
704  /// truncates the values to fit.
705  ///
706  /// If the operands given are already the same size as the vector elt type,
707  /// then this method will instead create a G_BUILD_VECTOR instruction.
708  ///
709  /// \pre setBasicBlock or setMI must have been called.
710  /// \pre The type of all \p Ops registers must be identical.
711  ///
712  /// \return a MachineInstrBuilder for the newly created instruction.
713  MachineInstrBuilder buildBuildVectorTrunc(const DstOp &Res,
714  ArrayRef<unsigned> Ops);
715 
716  /// Build and insert \p Res = G_CONCAT_VECTORS \p Op0, ...
717  ///
718  /// G_CONCAT_VECTORS creates a vector from the concatenation of 2 or more
719  /// vectors.
720  ///
721  /// \pre setBasicBlock or setMI must have been called.
722  /// \pre The entire register \p Res (and no more) must be covered by the input
723  /// registers.
724  /// \pre The type of all source operands must be identical.
725  ///
726  /// \return a MachineInstrBuilder for the newly created instruction.
727  MachineInstrBuilder buildConcatVectors(const DstOp &Res,
728  ArrayRef<unsigned> Ops);
729 
730  MachineInstrBuilder buildInsert(unsigned Res, unsigned Src,
731  unsigned Op, unsigned Index);
732 
733  /// Build and insert either a G_INTRINSIC (if \p HasSideEffects is false) or
734  /// G_INTRINSIC_W_SIDE_EFFECTS instruction. Its first operand will be the
735  /// result register definition unless \p Reg is NoReg (== 0). The second
736  /// operand will be the intrinsic's ID.
737  ///
738  /// Callers are expected to add the required definitions and uses afterwards.
739  ///
740  /// \pre setBasicBlock or setMI must have been called.
741  ///
742  /// \return a MachineInstrBuilder for the newly created instruction.
743  MachineInstrBuilder buildIntrinsic(Intrinsic::ID ID, unsigned Res,
744  bool HasSideEffects);
745 
746  /// Build and insert \p Res = G_FPTRUNC \p Op
747  ///
748  /// G_FPTRUNC converts a floating-point value into one with a smaller type.
749  ///
750  /// \pre setBasicBlock or setMI must have been called.
751  /// \pre \p Res must be a generic virtual register with scalar or vector type.
752  /// \pre \p Op must be a generic virtual register with scalar or vector type.
753  /// \pre \p Res must be smaller than \p Op
754  ///
755  /// \return The newly created instruction.
756  MachineInstrBuilder buildFPTrunc(const DstOp &Res, const SrcOp &Op);
757 
758  /// Build and insert \p Res = G_TRUNC \p Op
759  ///
760  /// G_TRUNC extracts the low bits of a type. For a vector type each element is
761  /// truncated independently before being packed into the destination.
762  ///
763  /// \pre setBasicBlock or setMI must have been called.
764  /// \pre \p Res must be a generic virtual register with scalar or vector type.
765  /// \pre \p Op must be a generic virtual register with scalar or vector type.
766  /// \pre \p Res must be smaller than \p Op
767  ///
768  /// \return The newly created instruction.
769  MachineInstrBuilder buildTrunc(const DstOp &Res, const SrcOp &Op);
770 
771  /// Build and insert a \p Res = G_ICMP \p Pred, \p Op0, \p Op1
772  ///
773  /// \pre setBasicBlock or setMI must have been called.
774 
775  /// \pre \p Res must be a generic virtual register with scalar or
776  /// vector type. Typically this starts as s1 or <N x s1>.
777  /// \pre \p Op0 and Op1 must be generic virtual registers with the
778  /// same number of elements as \p Res. If \p Res is a scalar,
779  /// \p Op0 must be either a scalar or pointer.
780  /// \pre \p Pred must be an integer predicate.
781  ///
782  /// \return a MachineInstrBuilder for the newly created instruction.
783  MachineInstrBuilder buildICmp(CmpInst::Predicate Pred, const DstOp &Res,
784  const SrcOp &Op0, const SrcOp &Op1);
785 
786  /// Build and insert a \p Res = G_FCMP \p Pred\p Op0, \p Op1
787  ///
788  /// \pre setBasicBlock or setMI must have been called.
789 
790  /// \pre \p Res must be a generic virtual register with scalar or
791  /// vector type. Typically this starts as s1 or <N x s1>.
792  /// \pre \p Op0 and Op1 must be generic virtual registers with the
793  /// same number of elements as \p Res (or scalar, if \p Res is
794  /// scalar).
795  /// \pre \p Pred must be a floating-point predicate.
796  ///
797  /// \return a MachineInstrBuilder for the newly created instruction.
798  MachineInstrBuilder buildFCmp(CmpInst::Predicate Pred, const DstOp &Res,
799  const SrcOp &Op0, const SrcOp &Op1);
800 
801  /// Build and insert a \p Res = G_SELECT \p Tst, \p Op0, \p Op1
802  ///
803  /// \pre setBasicBlock or setMI must have been called.
804  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
805  /// with the same type.
806  /// \pre \p Tst must be a generic virtual register with scalar, pointer or
807  /// vector type. If vector then it must have the same number of
808  /// elements as the other parameters.
809  ///
810  /// \return a MachineInstrBuilder for the newly created instruction.
811  MachineInstrBuilder buildSelect(const DstOp &Res, const SrcOp &Tst,
812  const SrcOp &Op0, const SrcOp &Op1);
813 
814  /// Build and insert \p Res = G_INSERT_VECTOR_ELT \p Val,
815  /// \p Elt, \p Idx
816  ///
817  /// \pre setBasicBlock or setMI must have been called.
818  /// \pre \p Res and \p Val must be a generic virtual register
819  // with the same vector type.
820  /// \pre \p Elt and \p Idx must be a generic virtual register
821  /// with scalar type.
822  ///
823  /// \return The newly created instruction.
824  MachineInstrBuilder buildInsertVectorElement(const DstOp &Res,
825  const SrcOp &Val,
826  const SrcOp &Elt,
827  const SrcOp &Idx);
828 
829  /// Build and insert \p Res = G_EXTRACT_VECTOR_ELT \p Val, \p Idx
830  ///
831  /// \pre setBasicBlock or setMI must have been called.
832  /// \pre \p Res must be a generic virtual register with scalar type.
833  /// \pre \p Val must be a generic virtual register with vector type.
834  /// \pre \p Idx must be a generic virtual register with scalar type.
835  ///
836  /// \return The newly created instruction.
837  MachineInstrBuilder buildExtractVectorElement(const DstOp &Res,
838  const SrcOp &Val,
839  const SrcOp &Idx);
840 
841  /// Build and insert `OldValRes<def>, SuccessRes<def> =
842  /// G_ATOMIC_CMPXCHG_WITH_SUCCESS Addr, CmpVal, NewVal, MMO`.
843  ///
844  /// Atomically replace the value at \p Addr with \p NewVal if it is currently
845  /// \p CmpVal otherwise leaves it unchanged. Puts the original value from \p
846  /// Addr in \p Res, along with an s1 indicating whether it was replaced.
847  ///
848  /// \pre setBasicBlock or setMI must have been called.
849  /// \pre \p OldValRes must be a generic virtual register of scalar type.
850  /// \pre \p SuccessRes must be a generic virtual register of scalar type. It
851  /// will be assigned 0 on failure and 1 on success.
852  /// \pre \p Addr must be a generic virtual register with pointer type.
853  /// \pre \p OldValRes, \p CmpVal, and \p NewVal must be generic virtual
854  /// registers of the same type.
855  ///
856  /// \return a MachineInstrBuilder for the newly created instruction.
858  buildAtomicCmpXchgWithSuccess(unsigned OldValRes, unsigned SuccessRes,
859  unsigned Addr, unsigned CmpVal, unsigned NewVal,
860  MachineMemOperand &MMO);
861 
862  /// Build and insert `OldValRes<def> = G_ATOMIC_CMPXCHG Addr, CmpVal, NewVal,
863  /// MMO`.
864  ///
865  /// Atomically replace the value at \p Addr with \p NewVal if it is currently
866  /// \p CmpVal otherwise leaves it unchanged. Puts the original value from \p
867  /// Addr in \p Res.
868  ///
869  /// \pre setBasicBlock or setMI must have been called.
870  /// \pre \p OldValRes must be a generic virtual register of scalar type.
871  /// \pre \p Addr must be a generic virtual register with pointer type.
872  /// \pre \p OldValRes, \p CmpVal, and \p NewVal must be generic virtual
873  /// registers of the same type.
874  ///
875  /// \return a MachineInstrBuilder for the newly created instruction.
876  MachineInstrBuilder buildAtomicCmpXchg(unsigned OldValRes, unsigned Addr,
877  unsigned CmpVal, unsigned NewVal,
878  MachineMemOperand &MMO);
879 
880  /// Build and insert `OldValRes<def> = G_ATOMICRMW_<Opcode> Addr, Val, MMO`.
881  ///
882  /// Atomically read-modify-update the value at \p Addr with \p Val. Puts the
883  /// original value from \p Addr in \p OldValRes. The modification is
884  /// determined by the opcode.
885  ///
886  /// \pre setBasicBlock or setMI must have been called.
887  /// \pre \p OldValRes must be a generic virtual register.
888  /// \pre \p Addr must be a generic virtual register with pointer type.
889  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
890  /// same type.
891  ///
892  /// \return a MachineInstrBuilder for the newly created instruction.
893  MachineInstrBuilder buildAtomicRMW(unsigned Opcode, unsigned OldValRes,
894  unsigned Addr, unsigned Val,
895  MachineMemOperand &MMO);
896 
897  /// Build and insert `OldValRes<def> = G_ATOMICRMW_XCHG Addr, Val, MMO`.
898  ///
899  /// Atomically replace the value at \p Addr with \p Val. Puts the original
900  /// value from \p Addr in \p OldValRes.
901  ///
902  /// \pre setBasicBlock or setMI must have been called.
903  /// \pre \p OldValRes must be a generic virtual register.
904  /// \pre \p Addr must be a generic virtual register with pointer type.
905  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
906  /// same type.
907  ///
908  /// \return a MachineInstrBuilder for the newly created instruction.
909  MachineInstrBuilder buildAtomicRMWXchg(unsigned OldValRes, unsigned Addr,
910  unsigned Val, MachineMemOperand &MMO);
911 
912  /// Build and insert `OldValRes<def> = G_ATOMICRMW_ADD Addr, Val, MMO`.
913  ///
914  /// Atomically replace the value at \p Addr with the addition of \p Val and
915  /// the original value. Puts the original value from \p Addr in \p OldValRes.
916  ///
917  /// \pre setBasicBlock or setMI must have been called.
918  /// \pre \p OldValRes must be a generic virtual register.
919  /// \pre \p Addr must be a generic virtual register with pointer type.
920  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
921  /// same type.
922  ///
923  /// \return a MachineInstrBuilder for the newly created instruction.
924  MachineInstrBuilder buildAtomicRMWAdd(unsigned OldValRes, unsigned Addr,
925  unsigned Val, MachineMemOperand &MMO);
926 
927  /// Build and insert `OldValRes<def> = G_ATOMICRMW_SUB Addr, Val, MMO`.
928  ///
929  /// Atomically replace the value at \p Addr with the subtraction of \p Val and
930  /// the original value. Puts the original value from \p Addr in \p OldValRes.
931  ///
932  /// \pre setBasicBlock or setMI must have been called.
933  /// \pre \p OldValRes must be a generic virtual register.
934  /// \pre \p Addr must be a generic virtual register with pointer type.
935  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
936  /// same type.
937  ///
938  /// \return a MachineInstrBuilder for the newly created instruction.
939  MachineInstrBuilder buildAtomicRMWSub(unsigned OldValRes, unsigned Addr,
940  unsigned Val, MachineMemOperand &MMO);
941 
942  /// Build and insert `OldValRes<def> = G_ATOMICRMW_AND Addr, Val, MMO`.
943  ///
944  /// Atomically replace the value at \p Addr with the bitwise and of \p Val and
945  /// the original value. Puts the original value from \p Addr in \p OldValRes.
946  ///
947  /// \pre setBasicBlock or setMI must have been called.
948  /// \pre \p OldValRes must be a generic virtual register.
949  /// \pre \p Addr must be a generic virtual register with pointer type.
950  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
951  /// same type.
952  ///
953  /// \return a MachineInstrBuilder for the newly created instruction.
954  MachineInstrBuilder buildAtomicRMWAnd(unsigned OldValRes, unsigned Addr,
955  unsigned Val, MachineMemOperand &MMO);
956 
957  /// Build and insert `OldValRes<def> = G_ATOMICRMW_NAND Addr, Val, MMO`.
958  ///
959  /// Atomically replace the value at \p Addr with the bitwise nand of \p Val
960  /// and the original value. Puts the original value from \p Addr in \p
961  /// OldValRes.
962  ///
963  /// \pre setBasicBlock or setMI must have been called.
964  /// \pre \p OldValRes must be a generic virtual register.
965  /// \pre \p Addr must be a generic virtual register with pointer type.
966  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
967  /// same type.
968  ///
969  /// \return a MachineInstrBuilder for the newly created instruction.
970  MachineInstrBuilder buildAtomicRMWNand(unsigned OldValRes, unsigned Addr,
971  unsigned Val, MachineMemOperand &MMO);
972 
973  /// Build and insert `OldValRes<def> = G_ATOMICRMW_OR Addr, Val, MMO`.
974  ///
975  /// Atomically replace the value at \p Addr with the bitwise or of \p Val and
976  /// the original value. Puts the original value from \p Addr in \p OldValRes.
977  ///
978  /// \pre setBasicBlock or setMI must have been called.
979  /// \pre \p OldValRes must be a generic virtual register.
980  /// \pre \p Addr must be a generic virtual register with pointer type.
981  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
982  /// same type.
983  ///
984  /// \return a MachineInstrBuilder for the newly created instruction.
985  MachineInstrBuilder buildAtomicRMWOr(unsigned OldValRes, unsigned Addr,
986  unsigned Val, MachineMemOperand &MMO);
987 
988  /// Build and insert `OldValRes<def> = G_ATOMICRMW_XOR Addr, Val, MMO`.
989  ///
990  /// Atomically replace the value at \p Addr with the bitwise xor of \p Val and
991  /// the original value. Puts the original value from \p Addr in \p OldValRes.
992  ///
993  /// \pre setBasicBlock or setMI must have been called.
994  /// \pre \p OldValRes must be a generic virtual register.
995  /// \pre \p Addr must be a generic virtual register with pointer type.
996  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
997  /// same type.
998  ///
999  /// \return a MachineInstrBuilder for the newly created instruction.
1000  MachineInstrBuilder buildAtomicRMWXor(unsigned OldValRes, unsigned Addr,
1001  unsigned Val, MachineMemOperand &MMO);
1002 
1003  /// Build and insert `OldValRes<def> = G_ATOMICRMW_MAX Addr, Val, MMO`.
1004  ///
1005  /// Atomically replace the value at \p Addr with the signed maximum of \p
1006  /// Val and the original value. Puts the original value from \p Addr in \p
1007  /// OldValRes.
1008  ///
1009  /// \pre setBasicBlock or setMI must have been called.
1010  /// \pre \p OldValRes must be a generic virtual register.
1011  /// \pre \p Addr must be a generic virtual register with pointer type.
1012  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
1013  /// same type.
1014  ///
1015  /// \return a MachineInstrBuilder for the newly created instruction.
1016  MachineInstrBuilder buildAtomicRMWMax(unsigned OldValRes, unsigned Addr,
1017  unsigned Val, MachineMemOperand &MMO);
1018 
1019  /// Build and insert `OldValRes<def> = G_ATOMICRMW_MIN Addr, Val, MMO`.
1020  ///
1021  /// Atomically replace the value at \p Addr with the signed minimum of \p
1022  /// Val and the original value. Puts the original value from \p Addr in \p
1023  /// OldValRes.
1024  ///
1025  /// \pre setBasicBlock or setMI must have been called.
1026  /// \pre \p OldValRes must be a generic virtual register.
1027  /// \pre \p Addr must be a generic virtual register with pointer type.
1028  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
1029  /// same type.
1030  ///
1031  /// \return a MachineInstrBuilder for the newly created instruction.
1032  MachineInstrBuilder buildAtomicRMWMin(unsigned OldValRes, unsigned Addr,
1033  unsigned Val, MachineMemOperand &MMO);
1034 
1035  /// Build and insert `OldValRes<def> = G_ATOMICRMW_UMAX Addr, Val, MMO`.
1036  ///
1037  /// Atomically replace the value at \p Addr with the unsigned maximum of \p
1038  /// Val and the original value. Puts the original value from \p Addr in \p
1039  /// OldValRes.
1040  ///
1041  /// \pre setBasicBlock or setMI must have been called.
1042  /// \pre \p OldValRes must be a generic virtual register.
1043  /// \pre \p Addr must be a generic virtual register with pointer type.
1044  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
1045  /// same type.
1046  ///
1047  /// \return a MachineInstrBuilder for the newly created instruction.
1048  MachineInstrBuilder buildAtomicRMWUmax(unsigned OldValRes, unsigned Addr,
1049  unsigned Val, MachineMemOperand &MMO);
1050 
1051  /// Build and insert `OldValRes<def> = G_ATOMICRMW_UMIN Addr, Val, MMO`.
1052  ///
1053  /// Atomically replace the value at \p Addr with the unsigned minimum of \p
1054  /// Val and the original value. Puts the original value from \p Addr in \p
1055  /// OldValRes.
1056  ///
1057  /// \pre setBasicBlock or setMI must have been called.
1058  /// \pre \p OldValRes must be a generic virtual register.
1059  /// \pre \p Addr must be a generic virtual register with pointer type.
1060  /// \pre \p OldValRes, and \p Val must be generic virtual registers of the
1061  /// same type.
1062  ///
1063  /// \return a MachineInstrBuilder for the newly created instruction.
1064  MachineInstrBuilder buildAtomicRMWUmin(unsigned OldValRes, unsigned Addr,
1065  unsigned Val, MachineMemOperand &MMO);
1066 
1067  /// Build and insert \p Res = G_BLOCK_ADDR \p BA
1068  ///
1069  /// G_BLOCK_ADDR computes the address of a basic block.
1070  ///
1071  /// \pre setBasicBlock or setMI must have been called.
1072  /// \pre \p Res must be a generic virtual register of a pointer type.
1073  ///
1074  /// \return The newly created instruction.
1075  MachineInstrBuilder buildBlockAddress(unsigned Res, const BlockAddress *BA);
1076 
1077  /// Build and insert \p Res = G_ADD \p Op0, \p Op1
1078  ///
1079  /// G_ADD sets \p Res to the sum of integer parameters \p Op0 and \p Op1,
1080  /// truncated to their width.
1081  ///
1082  /// \pre setBasicBlock or setMI must have been called.
1083  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
1084  /// with the same (scalar or vector) type).
1085  ///
1086  /// \return a MachineInstrBuilder for the newly created instruction.
1087 
1088  MachineInstrBuilder buildAdd(const DstOp &Dst, const SrcOp &Src0,
1089  const SrcOp &Src1,
1090  Optional<unsigned> Flags = None) {
1091  return buildInstr(TargetOpcode::G_ADD, {Dst}, {Src0, Src1}, Flags);
1092  }
1093 
1094  /// Build and insert \p Res = G_SUB \p Op0, \p Op1
1095  ///
1096  /// G_SUB sets \p Res to the sum of integer parameters \p Op0 and \p Op1,
1097  /// truncated to their width.
1098  ///
1099  /// \pre setBasicBlock or setMI must have been called.
1100  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
1101  /// with the same (scalar or vector) type).
1102  ///
1103  /// \return a MachineInstrBuilder for the newly created instruction.
1104 
1105  MachineInstrBuilder buildSub(const DstOp &Dst, const SrcOp &Src0,
1106  const SrcOp &Src1,
1107  Optional<unsigned> Flags = None) {
1108  return buildInstr(TargetOpcode::G_SUB, {Dst}, {Src0, Src1}, Flags);
1109  }
1110 
1111  /// Build and insert \p Res = G_MUL \p Op0, \p Op1
1112  ///
1113  /// G_MUL sets \p Res to the sum of integer parameters \p Op0 and \p Op1,
1114  /// truncated to their width.
1115  ///
1116  /// \pre setBasicBlock or setMI must have been called.
1117  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
1118  /// with the same (scalar or vector) type).
1119  ///
1120  /// \return a MachineInstrBuilder for the newly created instruction.
1121  MachineInstrBuilder buildMul(const DstOp &Dst, const SrcOp &Src0,
1122  const SrcOp &Src1,
1123  Optional<unsigned> Flags = None) {
1124  return buildInstr(TargetOpcode::G_MUL, {Dst}, {Src0, Src1}, Flags);
1125  }
1126 
1127  /// Build and insert \p Res = G_AND \p Op0, \p Op1
1128  ///
1129  /// G_AND sets \p Res to the bitwise and of integer parameters \p Op0 and \p
1130  /// Op1.
1131  ///
1132  /// \pre setBasicBlock or setMI must have been called.
1133  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
1134  /// with the same (scalar or vector) type).
1135  ///
1136  /// \return a MachineInstrBuilder for the newly created instruction.
1137 
1138  MachineInstrBuilder buildAnd(const DstOp &Dst, const SrcOp &Src0,
1139  const SrcOp &Src1) {
1140  return buildInstr(TargetOpcode::G_AND, {Dst}, {Src0, Src1});
1141  }
1142 
1143  /// Build and insert \p Res = G_OR \p Op0, \p Op1
1144  ///
1145  /// G_OR sets \p Res to the bitwise or of integer parameters \p Op0 and \p
1146  /// Op1.
1147  ///
1148  /// \pre setBasicBlock or setMI must have been called.
1149  /// \pre \p Res, \p Op0 and \p Op1 must be generic virtual registers
1150  /// with the same (scalar or vector) type).
1151  ///
1152  /// \return a MachineInstrBuilder for the newly created instruction.
1153  MachineInstrBuilder buildOr(const DstOp &Dst, const SrcOp &Src0,
1154  const SrcOp &Src1) {
1155  return buildInstr(TargetOpcode::G_OR, {Dst}, {Src0, Src1});
1156  }
1157 
1158  virtual MachineInstrBuilder buildInstr(unsigned Opc, ArrayRef<DstOp> DstOps,
1159  ArrayRef<SrcOp> SrcOps,
1160  Optional<unsigned> Flags = None);
1161 };
1162 
1163 } // End namespace llvm.
1164 #endif // LLVM_CODEGEN_GLOBALISEL_MACHINEIRBUILDER_H
MachineBasicBlock & getMBB()
uint64_t CallInst * C
const TargetRegisterClass * RC
void addDefToMIB(MachineRegisterInfo &MRI, MachineInstrBuilder &MIB) const
The CSE Analysis object.
Definition: CSEInfo.h:69
CmpInst::Predicate Pred
unsigned getReg() const
This class represents lattice values for constants.
Definition: AllocatorList.h:24
DstType getDstOpKind() const
MachineIRBuilder(const MachineIRBuilderState &BState)
GISelChangeObserver * Observer
unsigned Reg
void setDebugLoc(const DebugLoc &DL)
Set the debug location to DL for all the next build instructions.
MachineInstrBuilder buildOr(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1)
Build and insert Res = G_OR Op0, Op1.
LLT getType(unsigned Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register...
void addSrcToMIB(MachineInstrBuilder &MIB) const
const MachineInstrBuilder & addPredicate(CmpInst::Predicate Pred) const
A debug info location.
Definition: DebugLoc.h:34
Metadata node.
Definition: Metadata.h:864
F(f)
MachineIRBuilder(MachineInstr &MI)
The address of a basic block.
Definition: Constants.h:840
A description of a memory reference used in the backend.
GISelCSEInfo * getCSEInfo()
const MachineInstrBuilder & addUse(unsigned RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register use operand.
MachineBasicBlock::iterator II
SrcType getSrcOpKind() const
DstOp(const TargetRegisterClass *TRC)
DstOp(unsigned R)
SrcOp(const CmpInst::Predicate P)
MachineFunction & getMF()
Getter for the function we currently build.
MachineInstrBuilder buildSub(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, Optional< unsigned > Flags=None)
Build and insert Res = G_SUB Op0, Op1.
Analysis containing CSE Info
Definition: CSEInfo.cpp:21
Optional< unsigned > getFlags() const
TargetInstrInfo - Interface to description of machine instruction set.
MachineBasicBlock::iterator getInsertPt()
Current insertion point for new instructions.
#define P(N)
MachineRegisterInfo * getMRI()
Getter for MRI.
Abstract class that contains various methods for clients to notify about changes. ...
const TargetInstrInfo * TII
Information used to access the description of the opcodes.
FlagsOp(unsigned F)
unsigned getReg() const
This is an important base class in LLVM.
Definition: Constant.h:42
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Class which stores all the state required in a MachineIRBuilder.
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:264
Helper class to build MachineInstr.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:646
DebugLoc DL
Debug location to be set to any instruction we create.
MachineIRBuilder(MachineFunction &MF)
SrcOp(const MachineInstrBuilder &MIB)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned createGenericVirtualRegister(LLT Ty, StringRef Name="")
Create and return a new generic virtual register with low-level type Ty.
const MachineRegisterInfo * getMRI() const
MachineInstrBuilder buildMul(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, Optional< unsigned > Flags=None)
Build and insert Res = G_MUL Op0, Op1.
This is the shared class of boolean and integer constants.
Definition: Constants.h:84
const GISelCSEInfo * getCSEInfo() const
const TargetInstrInfo & getTII()
DebugLoc getDebugLoc()
Get the current instruction&#39;s debug location.
LLT getLLTTy(const MachineRegisterInfo &MRI) const
This file describes high level types that are used by several passes or APIs involved in the GlobalIS...
LLT getLLTTy(const MachineRegisterInfo &MRI) const
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
DstOp(const LLT &T)
Representation of each machine instruction.
Definition: MachineInstr.h:64
MachineIRBuilderState & getState()
Getter for the State.
SrcOp(unsigned R)
const TargetRegisterClass * getRegClass() const
MachineInstrBuilder buildAdd(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, Optional< unsigned > Flags=None)
Build and insert Res = G_ADD Op0, Op1.
const MachineBasicBlock & getMBB() const
Getter for the basic block we currently build.
CmpInst::Predicate getPredicate() const
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
Definition: Value.h:73
static Value * buildGEP(IRBuilderTy &IRB, Value *BasePtr, SmallVectorImpl< Value *> &Indices, Twine NamePrefix)
Build a GEP out of a base pointer and indices.
Definition: SROA.cpp:1372
MachineInstrBuilder buildAnd(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1)
Build and insert Res = G_AND Op0, Op1.
IRTranslator LLVM IR MI
const MachineInstrBuilder & addDef(unsigned RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
MachineFunction * MF
MachineFunction under construction.
const DebugLoc & getDL()
Getter for DebugLoc.
MachineInstrBuilder SrcMIB
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
MachineRegisterInfo * MRI
Information used to verify types are consistent and to create virtual registers.