LLVM 23.0.0git
IRBuilder.h
Go to the documentation of this file.
1//===- llvm/IRBuilder.h - Builder for LLVM Instructions ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the IRBuilder class, which is used as a convenient way
10// to create LLVM instructions with a consistent and simplified interface.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_IR_IRBUILDER_H
15#define LLVM_IR_IRBUILDER_H
16
17#include "llvm-c/Types.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/StringRef.h"
21#include "llvm/ADT/Twine.h"
22#include "llvm/IR/BasicBlock.h"
23#include "llvm/IR/Constant.h"
25#include "llvm/IR/Constants.h"
26#include "llvm/IR/DataLayout.h"
27#include "llvm/IR/DebugLoc.h"
29#include "llvm/IR/FPEnv.h"
30#include "llvm/IR/Function.h"
32#include "llvm/IR/InstrTypes.h"
33#include "llvm/IR/Instruction.h"
35#include "llvm/IR/Intrinsics.h"
36#include "llvm/IR/LLVMContext.h"
37#include "llvm/IR/Operator.h"
38#include "llvm/IR/Type.h"
39#include "llvm/IR/Value.h"
40#include "llvm/IR/ValueHandle.h"
45#include <cassert>
46#include <cstdint>
47#include <functional>
48#include <optional>
49#include <utility>
50
51namespace llvm {
52
53class APInt;
54class Use;
55
56/// This provides the default implementation of the IRBuilder
57/// 'InsertHelper' method that is called whenever an instruction is created by
58/// IRBuilder and needs to be inserted.
59///
60/// By default, this inserts the instruction at the insertion point.
62public:
64
65 virtual void InsertHelper(Instruction *I, const Twine &Name,
66 BasicBlock::iterator InsertPt) const {
67 if (InsertPt.isValid())
68 I->insertInto(InsertPt.getNodeParent(), InsertPt);
69 I->setName(Name);
70 }
71};
72
73/// Provides an 'InsertHelper' that calls a user-provided callback after
74/// performing the default insertion.
76 std::function<void(Instruction *)> Callback;
77
78public:
80
81 IRBuilderCallbackInserter(std::function<void(Instruction *)> Callback)
82 : Callback(std::move(Callback)) {}
83
84 void InsertHelper(Instruction *I, const Twine &Name,
85 BasicBlock::iterator InsertPt) const override {
87 Callback(I);
88 }
89};
90
91/// This provides a helper for copying FMF from an instruction or setting
92/// specified flags.
93class FMFSource {
94 std::optional<FastMathFlags> FMF;
95
96public:
97 FMFSource() = default;
99 if (Source)
100 FMF = Source->getFastMathFlags();
101 }
102 FMFSource(FastMathFlags FMF) : FMF(FMF) {}
104 return FMF.value_or(Default);
105 }
106 /// Intersect the FMF from two instructions.
108 return FMFSource(cast<FPMathOperator>(A)->getFastMathFlags() &
109 cast<FPMathOperator>(B)->getFastMathFlags());
110 }
111};
112
113/// Common base class shared among various IRBuilders.
115 /// Pairs of (metadata kind, MDNode *) that should be added to all newly
116 /// created instructions, excluding !dbg metadata, which is stored in the
117 /// StoredDL field.
119 /// The DebugLoc that will be applied to instructions inserted by this
120 /// builder.
121 DebugLoc StoredDL;
122
123 /// Add or update the an entry (Kind, MD) to MetadataToCopy, if \p MD is not
124 /// null. If \p MD is null, remove the entry with \p Kind.
125 void AddOrRemoveMetadataToCopy(unsigned Kind, MDNode *MD) {
126 assert(Kind != LLVMContext::MD_dbg &&
127 "MD_dbg metadata must be stored in StoredDL");
128
129 if (!MD) {
130 erase_if(MetadataToCopy, [Kind](const std::pair<unsigned, MDNode *> &KV) {
131 return KV.first == Kind;
132 });
133 return;
134 }
135
136 for (auto &KV : MetadataToCopy)
137 if (KV.first == Kind) {
138 KV.second = MD;
139 return;
140 }
141
142 MetadataToCopy.emplace_back(Kind, MD);
143 }
144
145protected:
151
154
155 bool IsFPConstrained = false;
158
160
161public:
163 const IRBuilderDefaultInserter &Inserter, MDNode *FPMathTag,
165 : Context(context), Folder(Folder), Inserter(Inserter),
166 DefaultFPMathTag(FPMathTag), DefaultOperandBundles(OpBundles) {
168 }
169
170 /// Insert and return the specified instruction.
171 template<typename InstTy>
172 InstTy *Insert(InstTy *I, const Twine &Name = "") const {
173 Inserter.InsertHelper(I, Name, InsertPt);
175 return I;
176 }
177
178 /// No-op overload to handle constants.
179 Constant *Insert(Constant *C, const Twine& = "") const {
180 return C;
181 }
182
183 Value *Insert(Value *V, const Twine &Name = "") const {
185 return Insert(I, Name);
187 return V;
188 }
189
190 //===--------------------------------------------------------------------===//
191 // Builder configuration methods
192 //===--------------------------------------------------------------------===//
193
194 /// Clear the insertion point: created instructions will not be
195 /// inserted into a block.
197 BB = nullptr;
199 }
200
201 BasicBlock *GetInsertBlock() const { return BB; }
203 LLVMContext &getContext() const { return Context; }
204
205 /// This specifies that created instructions should be appended to the
206 /// end of the specified block.
208 BB = TheBB;
209 InsertPt = BB->end();
210 }
211
212 /// This specifies that created instructions should be inserted before
213 /// the specified instruction.
215 BB = I->getParent();
216 InsertPt = I->getIterator();
217 assert(InsertPt != BB->end() && "Can't read debug loc from end()");
218 SetCurrentDebugLocation(I->getStableDebugLoc());
219 }
220
221 /// This specifies that created instructions should be inserted at the
222 /// specified point.
224 BB = TheBB;
225 InsertPt = IP;
226 if (IP != TheBB->end())
227 SetCurrentDebugLocation(IP->getStableDebugLoc());
228 }
229
230 /// This specifies that created instructions should be inserted at
231 /// the specified point, but also requires that \p IP is dereferencable.
233 BB = IP->getParent();
234 InsertPt = IP;
235 SetCurrentDebugLocation(IP->getStableDebugLoc());
236 }
237
238 /// This specifies that created instructions should inserted at the beginning
239 /// end of the specified function, but after already existing static alloca
240 /// instructions that are at the start.
242 BB = &F->getEntryBlock();
243 InsertPt = BB->getFirstNonPHIOrDbgOrAlloca();
244 }
245
246 /// Set location information used by debugging information.
248 // For !dbg metadata attachments, we use DebugLoc instead of the raw MDNode
249 // to include optional introspection data for use in Debugify.
250 StoredDL = L;
251 }
252
253 /// Set location information used by debugging information.
255 // For !dbg metadata attachments, we use DebugLoc instead of the raw MDNode
256 // to include optional introspection data for use in Debugify.
257 StoredDL = std::move(L);
258 }
259
260 /// Set nosanitize metadata.
262 AddOrRemoveMetadataToCopy(llvm::LLVMContext::MD_nosanitize,
264 }
265
266 /// Collect metadata with IDs \p MetadataKinds from \p Src which should be
267 /// added to all created instructions. Entries present in MedataDataToCopy but
268 /// not on \p Src will be dropped from MetadataToCopy.
270 ArrayRef<unsigned> MetadataKinds) {
271 for (unsigned K : MetadataKinds) {
272 if (K == LLVMContext::MD_dbg)
273 SetCurrentDebugLocation(Src->getDebugLoc());
274 else
275 AddOrRemoveMetadataToCopy(K, Src->getMetadata(K));
276 }
277 }
278
279 /// Get location information used by debugging information.
281
282 /// If this builder has a current debug location, set it on the
283 /// specified instruction.
285
286 /// Add all entries in MetadataToCopy to \p I.
288 for (const auto &KV : MetadataToCopy)
289 I->setMetadata(KV.first, KV.second);
291 }
292
293 /// Get the return type of the current function that we're emitting
294 /// into.
296
297 /// InsertPoint - A saved insertion point.
299 BasicBlock *Block = nullptr;
301
302 public:
303 /// Creates a new insertion point which doesn't point to anything.
304 InsertPoint() = default;
305
306 /// Creates a new insertion point at the given location.
308 : Block(InsertBlock), Point(InsertPoint) {}
309
310 /// Returns true if this insert point is set.
311 bool isSet() const { return (Block != nullptr); }
312
313 BasicBlock *getBlock() const { return Block; }
314 BasicBlock::iterator getPoint() const { return Point; }
315 };
316
317 /// Returns the current insert point.
320 }
321
322 /// Returns the current insert point, clearing it in the process.
328
329 /// Sets the current insert point to a previously-saved location.
331 if (IP.isSet())
332 SetInsertPoint(IP.getBlock(), IP.getPoint());
333 else
335 }
336
337 /// Get the floating point math metadata being used.
339
340 /// Get the flags to be applied to created floating point ops
342
344
345 /// Clear the fast-math flags.
346 void clearFastMathFlags() { FMF.clear(); }
347
348 /// Set the floating point math metadata to be used.
349 void setDefaultFPMathTag(MDNode *FPMathTag) { DefaultFPMathTag = FPMathTag; }
350
351 /// Set the fast-math flags to be used with generated fp-math operators
352 void setFastMathFlags(FastMathFlags NewFMF) { FMF = NewFMF; }
353
354 /// Enable/Disable use of constrained floating point math. When
355 /// enabled the CreateF<op>() calls instead create constrained
356 /// floating point intrinsic calls. Fast math flags are unaffected
357 /// by this setting.
358 void setIsFPConstrained(bool IsCon) { IsFPConstrained = IsCon; }
359
360 /// Query for the use of constrained floating point math
362
363 /// Set the exception handling to be used with constrained floating point
365#ifndef NDEBUG
366 std::optional<StringRef> ExceptStr =
368 assert(ExceptStr && "Garbage strict exception behavior!");
369#endif
370 DefaultConstrainedExcept = NewExcept;
371 }
372
373 /// Set the rounding mode handling to be used with constrained floating point
375#ifndef NDEBUG
376 std::optional<StringRef> RoundingStr =
377 convertRoundingModeToStr(NewRounding);
378 assert(RoundingStr && "Garbage strict rounding mode!");
379#endif
380 DefaultConstrainedRounding = NewRounding;
381 }
382
383 /// Get the exception handling used with constrained floating point
387
388 /// Get the rounding mode handling used with constrained floating point
392
394 assert(BB && "Must have a basic block to set any function attributes!");
395
396 Function *F = BB->getParent();
397 if (!F->hasFnAttribute(Attribute::StrictFP)) {
398 F->addFnAttr(Attribute::StrictFP);
399 }
400 }
401
403 I->addFnAttr(Attribute::StrictFP);
404 }
405
409
410 //===--------------------------------------------------------------------===//
411 // RAII helpers.
412 //===--------------------------------------------------------------------===//
413
414 // RAII object that stores the current insertion point and restores it
415 // when the object is destroyed. This includes the debug location.
417 IRBuilderBase &Builder;
420 DebugLoc DbgLoc;
421
422 public:
424 : Builder(B), Block(B.GetInsertBlock()), Point(B.GetInsertPoint()),
425 DbgLoc(B.getCurrentDebugLocation()) {}
426
429
431 Builder.restoreIP(InsertPoint(Block, Point));
432 Builder.SetCurrentDebugLocation(DbgLoc);
433 }
434 };
435
436 // RAII object that stores the current fast math settings and restores
437 // them when the object is destroyed.
439 IRBuilderBase &Builder;
440 FastMathFlags FMF;
441 MDNode *FPMathTag;
442 bool IsFPConstrained;
443 fp::ExceptionBehavior DefaultConstrainedExcept;
444 RoundingMode DefaultConstrainedRounding;
445
446 public:
448 : Builder(B), FMF(B.FMF), FPMathTag(B.DefaultFPMathTag),
449 IsFPConstrained(B.IsFPConstrained),
450 DefaultConstrainedExcept(B.DefaultConstrainedExcept),
451 DefaultConstrainedRounding(B.DefaultConstrainedRounding) {}
452
455
457 Builder.FMF = FMF;
458 Builder.DefaultFPMathTag = FPMathTag;
459 Builder.IsFPConstrained = IsFPConstrained;
460 Builder.DefaultConstrainedExcept = DefaultConstrainedExcept;
461 Builder.DefaultConstrainedRounding = DefaultConstrainedRounding;
462 }
463 };
464
465 // RAII object that stores the current default operand bundles and restores
466 // them when the object is destroyed.
468 IRBuilderBase &Builder;
469 ArrayRef<OperandBundleDef> DefaultOperandBundles;
470
471 public:
473 : Builder(B), DefaultOperandBundles(B.DefaultOperandBundles) {}
474
477
479 Builder.DefaultOperandBundles = DefaultOperandBundles;
480 }
481 };
482
483
484 //===--------------------------------------------------------------------===//
485 // Miscellaneous creation methods.
486 //===--------------------------------------------------------------------===//
487
488 /// Make a new global variable with initializer type i8*
489 ///
490 /// Make a new global variable with an initializer that has array of i8 type
491 /// filled in with the null terminated string value specified. The new global
492 /// variable will be marked mergable with any others of the same contents. If
493 /// Name is specified, it is the name of the global variable created.
494 ///
495 /// If no module is given via \p M, it is take from the insertion point basic
496 /// block.
498 const Twine &Name = "",
499 unsigned AddressSpace = 0,
500 Module *M = nullptr,
501 bool AddNull = true);
502
503 /// Get a constant value representing either true or false.
505 return ConstantInt::get(getInt1Ty(), V);
506 }
507
508 /// Get the constant value for i1 true.
512
513 /// Get the constant value for i1 false.
517
518 /// Get a constant 8-bit value.
520 return ConstantInt::get(getInt8Ty(), C);
521 }
522
523 /// Get a constant 16-bit value.
525 return ConstantInt::get(getInt16Ty(), C);
526 }
527
528 /// Get a constant 32-bit value.
530 return ConstantInt::get(getInt32Ty(), C);
531 }
532
533 /// Get a constant 64-bit value.
535 return ConstantInt::get(getInt64Ty(), C);
536 }
537
538 /// Get a constant N-bit value, zero extended from a 64-bit value.
540 return ConstantInt::get(getIntNTy(N), C);
541 }
542
543 /// Get a constant integer value.
545 return ConstantInt::get(Context, AI);
546 }
547
548 //===--------------------------------------------------------------------===//
549 // Type creation methods
550 //===--------------------------------------------------------------------===//
551
552 /// Fetch the type representing an 8-bit byte.
554
555 /// Fetch the type representing a 16-bit byte.
557
558 /// Fetch the type representing a 32-bit byte.
560
561 /// Fetch the type representing a 64-bit byte.
563
564 /// Fetch the type representing a 128-bit byte.
566
567 /// Fetch the type representing an N-bit byte.
569
570 /// Fetch the type representing a single bit
574
575 /// Fetch the type representing an 8-bit integer.
579
580 /// Fetch the type representing a 16-bit integer.
584
585 /// Fetch the type representing a 32-bit integer.
589
590 /// Fetch the type representing a 64-bit integer.
594
595 /// Fetch the type representing a 128-bit integer.
597
598 /// Fetch the type representing an N-bit integer.
600 return Type::getIntNTy(Context, N);
601 }
602
603 /// Fetch the type representing a 16-bit floating point value.
605 return Type::getHalfTy(Context);
606 }
607
608 /// Fetch the type representing a 16-bit brain floating point value.
611 }
612
613 /// Fetch the type representing a 32-bit floating point value.
616 }
617
618 /// Fetch the type representing a 64-bit floating point value.
621 }
622
623 /// Fetch the type representing void.
625 return Type::getVoidTy(Context);
626 }
627
628 /// Fetch the type representing a pointer.
629 PointerType *getPtrTy(unsigned AddrSpace = 0) {
630 return PointerType::get(Context, AddrSpace);
631 }
632
633 /// Fetch the type of a byte with size at least as big as that of a
634 /// pointer in the given address space.
635 ByteType *getBytePtrTy(const DataLayout &DL, unsigned AddrSpace = 0) {
636 return DL.getBytePtrType(Context, AddrSpace);
637 }
638
639 /// Fetch the type of an integer with size at least as big as that of a
640 /// pointer in the given address space.
641 IntegerType *getIntPtrTy(const DataLayout &DL, unsigned AddrSpace = 0) {
642 return DL.getIntPtrType(Context, AddrSpace);
643 }
644
645 /// Fetch the type of an integer that should be used to index GEP operations
646 /// within AddressSpace.
647 IntegerType *getIndexTy(const DataLayout &DL, unsigned AddrSpace) {
648 return DL.getIndexType(Context, AddrSpace);
649 }
650
651 //===--------------------------------------------------------------------===//
652 // Intrinsic creation methods
653 //===--------------------------------------------------------------------===//
654
655 /// Create and insert a memset to the specified pointer and the
656 /// specified value.
657 ///
658 /// If the pointer isn't an i8*, it will be converted. If alias metadata is
659 /// specified, it will be added to the instruction.
661 MaybeAlign Align, bool isVolatile = false,
662 const AAMDNodes &AAInfo = AAMDNodes()) {
663 return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile, AAInfo);
664 }
665
667 MaybeAlign Align, bool isVolatile = false,
668 const AAMDNodes &AAInfo = AAMDNodes());
669
671 Value *Val, Value *Size,
672 bool IsVolatile = false,
673 const AAMDNodes &AAInfo = AAMDNodes());
674
675 /// Create and insert an element unordered-atomic memset of the region of
676 /// memory starting at the given pointer to the given value.
677 ///
678 /// If the pointer isn't an i8*, it will be converted. If alias metadata is
679 /// specified, it will be added to the instruction.
680 CallInst *
682 Align Alignment, uint32_t ElementSize,
683 const AAMDNodes &AAInfo = AAMDNodes()) {
685 Ptr, Val, getInt64(Size), Align(Alignment), ElementSize, AAInfo);
686 }
687
688 LLVM_ABI CallInst *CreateMalloc(Type *IntPtrTy, Type *AllocTy,
689 Value *AllocSize, Value *ArraySize,
691 Function *MallocF = nullptr,
692 const Twine &Name = "");
693
694 /// CreateMalloc - Generate the IR for a call to malloc:
695 /// 1. Compute the malloc call's argument as the specified type's size,
696 /// possibly multiplied by the array size if the array size is not
697 /// constant 1.
698 /// 2. Call malloc with that argument.
699 LLVM_ABI CallInst *CreateMalloc(Type *IntPtrTy, Type *AllocTy,
700 Value *AllocSize, Value *ArraySize,
701 Function *MallocF = nullptr,
702 const Twine &Name = "");
703 /// Generate the IR for a call to the builtin free function.
705 ArrayRef<OperandBundleDef> Bundles = {});
706
707 LLVM_ABI CallInst *
708 CreateElementUnorderedAtomicMemSet(Value *Ptr, Value *Val, Value *Size,
709 Align Alignment, uint32_t ElementSize,
710 const AAMDNodes &AAInfo = AAMDNodes());
711
712 /// Create and insert a memcpy between the specified pointers.
713 ///
714 /// If the pointers aren't i8*, they will be converted. If alias metadata is
715 /// specified, it will be added to the instruction.
716 /// and noalias tags.
718 MaybeAlign SrcAlign, uint64_t Size,
719 bool isVolatile = false,
720 const AAMDNodes &AAInfo = AAMDNodes()) {
721 return CreateMemCpy(Dst, DstAlign, Src, SrcAlign, getInt64(Size),
722 isVolatile, AAInfo);
723 }
724
727 Value *Src, MaybeAlign SrcAlign, Value *Size,
728 bool isVolatile = false,
729 const AAMDNodes &AAInfo = AAMDNodes());
730
732 MaybeAlign SrcAlign, Value *Size,
733 bool isVolatile = false,
734 const AAMDNodes &AAInfo = AAMDNodes()) {
735 return CreateMemTransferInst(Intrinsic::memcpy, Dst, DstAlign, Src,
736 SrcAlign, Size, isVolatile, AAInfo);
737 }
738
740 MaybeAlign SrcAlign, Value *Size,
741 bool isVolatile = false,
742 const AAMDNodes &AAInfo = AAMDNodes()) {
743 return CreateMemTransferInst(Intrinsic::memcpy_inline, Dst, DstAlign, Src,
744 SrcAlign, Size, isVolatile, AAInfo);
745 }
746
747 /// Create and insert an element unordered-atomic memcpy between the
748 /// specified pointers.
749 ///
750 /// DstAlign/SrcAlign are the alignments of the Dst/Src pointers,
751 /// respectively.
752 ///
753 /// If the pointers aren't i8*, they will be converted. If alias metadata is
754 /// specified, it will be added to the instruction.
756 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
757 uint32_t ElementSize, const AAMDNodes &AAInfo = AAMDNodes());
758
760 MaybeAlign SrcAlign, uint64_t Size,
761 bool isVolatile = false,
762 const AAMDNodes &AAInfo = AAMDNodes()) {
763 return CreateMemMove(Dst, DstAlign, Src, SrcAlign, getInt64(Size),
764 isVolatile, AAInfo);
765 }
766
768 MaybeAlign SrcAlign, Value *Size,
769 bool isVolatile = false,
770 const AAMDNodes &AAInfo = AAMDNodes()) {
771 return CreateMemTransferInst(Intrinsic::memmove, Dst, DstAlign, Src,
772 SrcAlign, Size, isVolatile, AAInfo);
773 }
774
775 /// \brief Create and insert an element unordered-atomic memmove between the
776 /// specified pointers.
777 ///
778 /// DstAlign/SrcAlign are the alignments of the Dst/Src pointers,
779 /// respectively.
780 ///
781 /// If the pointers aren't i8*, they will be converted. If alias metadata is
782 /// specified, it will be added to the instruction.
784 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
785 uint32_t ElementSize, const AAMDNodes &AAInfo = AAMDNodes());
786
787private:
788 CallInst *getReductionIntrinsic(Intrinsic::ID ID, Value *Src);
789
790public:
791 /// Create a sequential vector fadd reduction intrinsic of the source vector.
792 /// The first parameter is a scalar accumulator value. An unordered reduction
793 /// can be created by adding the reassoc fast-math flag to the resulting
794 /// sequential reduction.
796
797 /// Create a sequential vector fmul reduction intrinsic of the source vector.
798 /// The first parameter is a scalar accumulator value. An unordered reduction
799 /// can be created by adding the reassoc fast-math flag to the resulting
800 /// sequential reduction.
802
803 /// Create a vector int add reduction intrinsic of the source vector.
805
806 /// Create a vector int mul reduction intrinsic of the source vector.
808
809 /// Create a vector int AND reduction intrinsic of the source vector.
811
812 /// Create a vector int OR reduction intrinsic of the source vector.
814
815 /// Create a vector int XOR reduction intrinsic of the source vector.
817
818 /// Create a vector integer max reduction intrinsic of the source
819 /// vector.
820 LLVM_ABI CallInst *CreateIntMaxReduce(Value *Src, bool IsSigned = false);
821
822 /// Create a vector integer min reduction intrinsic of the source
823 /// vector.
824 LLVM_ABI CallInst *CreateIntMinReduce(Value *Src, bool IsSigned = false);
825
826 /// Create a vector float max reduction intrinsic of the source
827 /// vector.
829
830 /// Create a vector float min reduction intrinsic of the source
831 /// vector.
833
834 /// Create a vector float maximum reduction intrinsic of the source
835 /// vector. This variant follows the NaN and signed zero semantic of
836 /// llvm.maximum intrinsic.
838
839 /// Create a vector float minimum reduction intrinsic of the source
840 /// vector. This variant follows the NaN and signed zero semantic of
841 /// llvm.minimum intrinsic.
843
844 /// Create a lifetime.start intrinsic.
846
847 /// Create a lifetime.end intrinsic.
849
850 /// Create a call to invariant.start intrinsic.
851 ///
852 /// If the pointer isn't i8* it will be converted.
854 ConstantInt *Size = nullptr);
855
856 /// Create a call to llvm.threadlocal.address intrinsic.
858
859 /// Create a call to Masked Load intrinsic
860 LLVM_ABI CallInst *CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment,
861 Value *Mask, Value *PassThru = nullptr,
862 const Twine &Name = "");
863
864 /// Create a call to Masked Store intrinsic
865 LLVM_ABI CallInst *CreateMaskedStore(Value *Val, Value *Ptr, Align Alignment,
866 Value *Mask);
867
868 /// Create a call to Masked Gather intrinsic
869 LLVM_ABI CallInst *CreateMaskedGather(Type *Ty, Value *Ptrs, Align Alignment,
870 Value *Mask = nullptr,
871 Value *PassThru = nullptr,
872 const Twine &Name = "");
873
874 /// Create a call to Masked Scatter intrinsic
876 Align Alignment,
877 Value *Mask = nullptr);
878
879 /// Create a call to Masked Expand Load intrinsic
882 Value *Mask = nullptr,
883 Value *PassThru = nullptr,
884 const Twine &Name = "");
885
886 /// Create a call to Masked Compress Store intrinsic
889 Value *Mask = nullptr);
890
891 /// Return an all true boolean vector (mask) with \p NumElts lanes.
896
897 /// Create an assume intrinsic call that allows the optimizer to
898 /// assume that the provided condition will be true.
900
901 /// Create an assume intrinsic call that allows the optimizer to
902 /// assume that the provided operand bundles hold.
904
905 /// Create a llvm.experimental.noalias.scope.decl intrinsic call.
911
912 /// Create a call to the experimental.gc.statepoint intrinsic to
913 /// start a new statepoint sequence.
915 uint64_t ID, uint32_t NumPatchBytes, FunctionCallee ActualCallee,
916 ArrayRef<Value *> CallArgs, std::optional<ArrayRef<Value *>> DeoptArgs,
917 ArrayRef<Value *> GCArgs, const Twine &Name = "");
918
919 /// Create a call to the experimental.gc.statepoint intrinsic to
920 /// start a new statepoint sequence.
923 FunctionCallee ActualCallee, uint32_t Flags,
924 ArrayRef<Value *> CallArgs,
925 std::optional<ArrayRef<Use>> TransitionArgs,
926 std::optional<ArrayRef<Use>> DeoptArgs,
927 ArrayRef<Value *> GCArgs, const Twine &Name = "");
928
929 /// Conveninence function for the common case when CallArgs are filled
930 /// in using ArrayRef(CS.arg_begin(), CS.arg_end()); Use needs to be
931 /// .get()'ed to get the Value pointer.
934 FunctionCallee ActualCallee, ArrayRef<Use> CallArgs,
935 std::optional<ArrayRef<Value *>> DeoptArgs,
936 ArrayRef<Value *> GCArgs, const Twine &Name = "");
937
938 /// Create an invoke to the experimental.gc.statepoint intrinsic to
939 /// start a new statepoint sequence.
942 FunctionCallee ActualInvokee, BasicBlock *NormalDest,
943 BasicBlock *UnwindDest, ArrayRef<Value *> InvokeArgs,
944 std::optional<ArrayRef<Value *>> DeoptArgs,
945 ArrayRef<Value *> GCArgs, const Twine &Name = "");
946
947 /// Create an invoke to the experimental.gc.statepoint intrinsic to
948 /// start a new statepoint sequence.
950 uint64_t ID, uint32_t NumPatchBytes, FunctionCallee ActualInvokee,
951 BasicBlock *NormalDest, BasicBlock *UnwindDest, uint32_t Flags,
952 ArrayRef<Value *> InvokeArgs, std::optional<ArrayRef<Use>> TransitionArgs,
953 std::optional<ArrayRef<Use>> DeoptArgs, ArrayRef<Value *> GCArgs,
954 const Twine &Name = "");
955
956 // Convenience function for the common case when CallArgs are filled in using
957 // ArrayRef(CS.arg_begin(), CS.arg_end()); Use needs to be .get()'ed to
958 // get the Value *.
961 FunctionCallee ActualInvokee, BasicBlock *NormalDest,
962 BasicBlock *UnwindDest, ArrayRef<Use> InvokeArgs,
963 std::optional<ArrayRef<Value *>> DeoptArgs,
964 ArrayRef<Value *> GCArgs, const Twine &Name = "");
965
966 /// Create a call to the experimental.gc.result intrinsic to extract
967 /// the result from a call wrapped in a statepoint.
968 LLVM_ABI CallInst *CreateGCResult(Instruction *Statepoint, Type *ResultType,
969 const Twine &Name = "");
970
971 /// Create a call to the experimental.gc.relocate intrinsics to
972 /// project the relocated value of one pointer from the statepoint.
973 LLVM_ABI CallInst *CreateGCRelocate(Instruction *Statepoint, int BaseOffset,
974 int DerivedOffset, Type *ResultType,
975 const Twine &Name = "");
976
977 /// Create a call to the experimental.gc.pointer.base intrinsic to get the
978 /// base pointer for the specified derived pointer.
980 const Twine &Name = "");
981
982 /// Create a call to the experimental.gc.get.pointer.offset intrinsic to get
983 /// the offset of the specified derived pointer from its base.
985 const Twine &Name = "");
986
987 /// Create a call to llvm.vscale.<Ty>().
988 Value *CreateVScale(Type *Ty, const Twine &Name = "") {
989 return CreateIntrinsic(Intrinsic::vscale, {Ty}, {}, {}, Name);
990 }
991
992 /// Create an expression which evaluates to the number of elements in \p EC
993 /// at runtime. This can result in poison if type \p Ty is not big enough to
994 /// hold the value.
996
997 /// Create an expression which evaluates to the number of units in \p Size
998 /// at runtime. This works for both units of bits and bytes. This can result
999 /// in poison if type \p Ty is not big enough to hold the value.
1001
1002 /// Get allocation size of an alloca as a runtime Value* (handles both static
1003 /// and dynamic allocas and vscale factor).
1005
1006 /// Creates a vector of type \p DstType with the linear sequence <0, 1, ...>
1007 LLVM_ABI Value *CreateStepVector(Type *DstType, const Twine &Name = "");
1008
1009 /// Create a call to intrinsic \p ID with 1 operand which is mangled on its
1010 /// type.
1012 FMFSource FMFSource = {},
1013 const Twine &Name = "");
1014
1015 /// Create a call to intrinsic \p ID with 2 operands which is mangled on the
1016 /// first type.
1018 Value *RHS, FMFSource FMFSource = {},
1019 const Twine &Name = "");
1020
1021 /// Create a call to intrinsic \p ID with \p Args, mangled using
1022 /// \p OverloadTypes. If \p FMFSource is provided, copy fast-math-flags from
1023 /// that instruction to the intrinsic.
1025 ArrayRef<Type *> OverloadTypes,
1026 ArrayRef<Value *> Args,
1027 FMFSource FMFSource = {},
1028 const Twine &Name = "",
1029 ArrayRef<OperandBundleDef> OpBundles = {});
1030
1031 /// Create a call to intrinsic \p ID with \p RetTy and \p Args. If
1032 /// \p FMFSource is provided, copy fast-math-flags from that instruction to
1033 /// the intrinsic.
1034 LLVM_ABI CallInst *CreateIntrinsic(Type *RetTy, Intrinsic::ID ID,
1035 ArrayRef<Value *> Args,
1036 FMFSource FMFSource = {},
1037 const Twine &Name = "");
1038
1039 /// Create a call to non-overloaded intrinsic \p ID with \p Args. If
1040 /// \p FMFSource is provided, copy fast-math-flags from that instruction to
1041 /// the intrinsic.
1043 FMFSource FMFSource = {}, const Twine &Name = "") {
1044 return CreateIntrinsic(ID, /*Types=*/{}, Args, FMFSource, Name);
1045 }
1046
1047 /// Create call to the fabs intrinsic.
1049 const Twine &Name = "") {
1050 return CreateUnaryIntrinsic(Intrinsic::fabs, V, FMFSource, Name);
1051 }
1052
1053 /// Create call to the minnum intrinsic.
1055 const Twine &Name = "") {
1056 if (IsFPConstrained) {
1058 Intrinsic::experimental_constrained_minnum, LHS, RHS, FMFSource,
1059 Name);
1060 }
1061
1062 return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, FMFSource, Name);
1063 }
1064
1065 /// Create call to the maxnum intrinsic.
1067 const Twine &Name = "") {
1068 if (IsFPConstrained) {
1070 Intrinsic::experimental_constrained_maxnum, LHS, RHS, FMFSource,
1071 Name);
1072 }
1073
1074 return CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS, FMFSource, Name);
1075 }
1076
1077 /// Create call to the minimum intrinsic.
1078 Value *CreateMinimum(Value *LHS, Value *RHS, const Twine &Name = "") {
1079 return CreateBinaryIntrinsic(Intrinsic::minimum, LHS, RHS, nullptr, Name);
1080 }
1081
1082 /// Create call to the maximum intrinsic.
1083 Value *CreateMaximum(Value *LHS, Value *RHS, const Twine &Name = "") {
1084 return CreateBinaryIntrinsic(Intrinsic::maximum, LHS, RHS, nullptr, Name);
1085 }
1086
1087 /// Create call to the minimumnum intrinsic.
1088 Value *CreateMinimumNum(Value *LHS, Value *RHS, const Twine &Name = "") {
1089 return CreateBinaryIntrinsic(Intrinsic::minimumnum, LHS, RHS, nullptr,
1090 Name);
1091 }
1092
1093 /// Create call to the maximum intrinsic.
1094 Value *CreateMaximumNum(Value *LHS, Value *RHS, const Twine &Name = "") {
1095 return CreateBinaryIntrinsic(Intrinsic::maximumnum, LHS, RHS, nullptr,
1096 Name);
1097 }
1098
1099 /// Create call to the copysign intrinsic.
1101 const Twine &Name = "") {
1102 return CreateBinaryIntrinsic(Intrinsic::copysign, LHS, RHS, FMFSource,
1103 Name);
1104 }
1105
1106 /// Create call to the ldexp intrinsic.
1108 const Twine &Name = "") {
1109 assert(!IsFPConstrained && "TODO: Support strictfp");
1110 return CreateIntrinsic(Intrinsic::ldexp, {Src->getType(), Exp->getType()},
1111 {Src, Exp}, FMFSource, Name);
1112 }
1113
1114 /// Create call to the fma intrinsic.
1115 Value *CreateFMA(Value *Factor1, Value *Factor2, Value *Summand,
1116 FMFSource FMFSource = {}, const Twine &Name = "") {
1117 if (IsFPConstrained) {
1119 Intrinsic::experimental_constrained_fma, {Factor1->getType()},
1120 {Factor1, Factor2, Summand}, FMFSource, Name);
1121 }
1122
1123 return CreateIntrinsic(Intrinsic::fma, {Factor1->getType()},
1124 {Factor1, Factor2, Summand}, FMFSource, Name);
1125 }
1126
1127 /// Create a call to the arithmetic_fence intrinsic.
1129 const Twine &Name = "") {
1130 return CreateIntrinsic(Intrinsic::arithmetic_fence, DstType, Val, nullptr,
1131 Name);
1132 }
1133
1134 /// Create a call to the vector.extract intrinsic.
1135 CallInst *CreateExtractVector(Type *DstType, Value *SrcVec, Value *Idx,
1136 const Twine &Name = "") {
1137 return CreateIntrinsic(Intrinsic::vector_extract,
1138 {DstType, SrcVec->getType()}, {SrcVec, Idx}, nullptr,
1139 Name);
1140 }
1141
1142 /// Create a call to the vector.extract intrinsic.
1144 const Twine &Name = "") {
1145 return CreateExtractVector(DstType, SrcVec, getInt64(Idx), Name);
1146 }
1147
1148 /// Create a call to the vector.insert intrinsic.
1149 CallInst *CreateInsertVector(Type *DstType, Value *SrcVec, Value *SubVec,
1150 Value *Idx, const Twine &Name = "") {
1151 return CreateIntrinsic(Intrinsic::vector_insert,
1152 {DstType, SubVec->getType()}, {SrcVec, SubVec, Idx},
1153 nullptr, Name);
1154 }
1155
1156 /// Create a call to the vector.extract intrinsic.
1157 CallInst *CreateInsertVector(Type *DstType, Value *SrcVec, Value *SubVec,
1158 uint64_t Idx, const Twine &Name = "") {
1159 return CreateInsertVector(DstType, SrcVec, SubVec, getInt64(Idx), Name);
1160 }
1161
1162 /// Create a call to llvm.stacksave
1163 CallInst *CreateStackSave(const Twine &Name = "") {
1164 const DataLayout &DL = BB->getDataLayout();
1165 return CreateIntrinsic(Intrinsic::stacksave, {DL.getAllocaPtrType(Context)},
1166 {}, nullptr, Name);
1167 }
1168
1169 /// Create a call to llvm.stackrestore
1170 CallInst *CreateStackRestore(Value *Ptr, const Twine &Name = "") {
1171 return CreateIntrinsic(Intrinsic::stackrestore, {Ptr->getType()}, {Ptr},
1172 nullptr, Name);
1173 }
1174
1175 /// Create a call to llvm.experimental_cttz_elts
1177 bool ZeroIsPoison = true,
1178 const Twine &Name = "") {
1179 return CreateIntrinsic(Intrinsic::experimental_cttz_elts,
1180 {ResTy, Mask->getType()},
1181 {Mask, getInt1(ZeroIsPoison)}, nullptr, Name);
1182 }
1183
1184private:
1185 /// Create a call to a masked intrinsic with given Id.
1186 CallInst *CreateMaskedIntrinsic(Intrinsic::ID Id, ArrayRef<Value *> Ops,
1187 ArrayRef<Type *> OverloadedTypes,
1188 const Twine &Name = "");
1189
1190 //===--------------------------------------------------------------------===//
1191 // Instruction creation methods: Terminators
1192 //===--------------------------------------------------------------------===//
1193
1194private:
1195 /// Helper to add branch weight and unpredictable metadata onto an
1196 /// instruction.
1197 /// \returns The annotated instruction.
1198 template <typename InstTy>
1199 InstTy *addBranchMetadata(InstTy *I, MDNode *Weights, MDNode *Unpredictable) {
1200 if (Weights)
1201 I->setMetadata(LLVMContext::MD_prof, Weights);
1202 if (Unpredictable)
1203 I->setMetadata(LLVMContext::MD_unpredictable, Unpredictable);
1204 return I;
1205 }
1206
1207public:
1208 /// Create a 'ret void' instruction.
1212
1213 /// Create a 'ret <val>' instruction.
1217
1218 /// Create a sequence of N insertvalue instructions, with one Value from the
1219 /// RetVals array each, that build a aggregate return value one value at a
1220 /// time, and a ret instruction to return the resulting aggregate value.
1221 ///
1222 /// This is a convenience function for code that uses aggregate return values
1223 /// as a vehicle for having multiple return values.
1226 for (size_t i = 0, N = RetVals.size(); i != N; ++i)
1227 V = CreateInsertValue(V, RetVals[i], i, "mrv");
1228 return Insert(ReturnInst::Create(Context, V));
1229 }
1230
1231 /// Create an unconditional 'br label X' instruction.
1233 return Insert(UncondBrInst::Create(Dest));
1234 }
1235
1236 /// Create a conditional 'br Cond, TrueDest, FalseDest'
1237 /// instruction.
1239 MDNode *BranchWeights = nullptr,
1240 MDNode *Unpredictable = nullptr) {
1241 return Insert(addBranchMetadata(CondBrInst::Create(Cond, True, False),
1242 BranchWeights, Unpredictable));
1243 }
1244
1245 /// Create a conditional 'br Cond, TrueDest, FalseDest'
1246 /// instruction. Copy branch meta data if available.
1248 Instruction *MDSrc) {
1249 CondBrInst *Br = CondBrInst::Create(Cond, True, False);
1250 if (MDSrc) {
1251 unsigned WL[4] = {LLVMContext::MD_prof, LLVMContext::MD_unpredictable,
1252 LLVMContext::MD_make_implicit, LLVMContext::MD_dbg};
1253 Br->copyMetadata(*MDSrc, WL);
1254 }
1255 return Insert(Br);
1256 }
1257
1258 /// Create a switch instruction with the specified value, default dest,
1259 /// and with a hint for the number of cases that will be added (for efficient
1260 /// allocation).
1261 SwitchInst *CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases = 10,
1262 MDNode *BranchWeights = nullptr,
1263 MDNode *Unpredictable = nullptr) {
1264 return Insert(addBranchMetadata(SwitchInst::Create(V, Dest, NumCases),
1265 BranchWeights, Unpredictable));
1266 }
1267
1268 /// Create an indirect branch instruction with the specified address
1269 /// operand, with an optional hint for the number of destinations that will be
1270 /// added (for efficient allocation).
1271 IndirectBrInst *CreateIndirectBr(Value *Addr, unsigned NumDests = 10) {
1272 return Insert(IndirectBrInst::Create(Addr, NumDests));
1273 }
1274
1275 /// Create an invoke instruction.
1277 BasicBlock *NormalDest, BasicBlock *UnwindDest,
1278 ArrayRef<Value *> Args,
1280 const Twine &Name = "") {
1281 InvokeInst *II =
1282 InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args, OpBundles);
1283 if (IsFPConstrained)
1285 return Insert(II, Name);
1286 }
1288 BasicBlock *NormalDest, BasicBlock *UnwindDest,
1289 ArrayRef<Value *> Args = {},
1290 const Twine &Name = "") {
1291 InvokeInst *II =
1292 InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args);
1293 if (IsFPConstrained)
1295 return Insert(II, Name);
1296 }
1297
1299 BasicBlock *UnwindDest, ArrayRef<Value *> Args,
1301 const Twine &Name = "") {
1302 return CreateInvoke(Callee.getFunctionType(), Callee.getCallee(),
1303 NormalDest, UnwindDest, Args, OpBundles, Name);
1304 }
1305
1307 BasicBlock *UnwindDest, ArrayRef<Value *> Args = {},
1308 const Twine &Name = "") {
1309 return CreateInvoke(Callee.getFunctionType(), Callee.getCallee(),
1310 NormalDest, UnwindDest, Args, Name);
1311 }
1312
1313 /// \brief Create a callbr instruction.
1315 BasicBlock *DefaultDest,
1316 ArrayRef<BasicBlock *> IndirectDests,
1317 ArrayRef<Value *> Args = {},
1318 const Twine &Name = "") {
1319 return Insert(CallBrInst::Create(Ty, Callee, DefaultDest, IndirectDests,
1320 Args), Name);
1321 }
1323 BasicBlock *DefaultDest,
1324 ArrayRef<BasicBlock *> IndirectDests,
1325 ArrayRef<Value *> Args,
1327 const Twine &Name = "") {
1328 return Insert(
1329 CallBrInst::Create(Ty, Callee, DefaultDest, IndirectDests, Args,
1330 OpBundles), Name);
1331 }
1332
1334 ArrayRef<BasicBlock *> IndirectDests,
1335 ArrayRef<Value *> Args = {},
1336 const Twine &Name = "") {
1337 return CreateCallBr(Callee.getFunctionType(), Callee.getCallee(),
1338 DefaultDest, IndirectDests, Args, Name);
1339 }
1341 ArrayRef<BasicBlock *> IndirectDests,
1342 ArrayRef<Value *> Args,
1344 const Twine &Name = "") {
1345 return CreateCallBr(Callee.getFunctionType(), Callee.getCallee(),
1346 DefaultDest, IndirectDests, Args, Name);
1347 }
1348
1350 return Insert(ResumeInst::Create(Exn));
1351 }
1352
1354 BasicBlock *UnwindBB = nullptr) {
1355 return Insert(CleanupReturnInst::Create(CleanupPad, UnwindBB));
1356 }
1357
1359 unsigned NumHandlers,
1360 const Twine &Name = "") {
1361 return Insert(CatchSwitchInst::Create(ParentPad, UnwindBB, NumHandlers),
1362 Name);
1363 }
1364
1366 const Twine &Name = "") {
1367 return Insert(CatchPadInst::Create(ParentPad, Args), Name);
1368 }
1369
1371 ArrayRef<Value *> Args = {},
1372 const Twine &Name = "") {
1373 return Insert(CleanupPadInst::Create(ParentPad, Args), Name);
1374 }
1375
1379
1383
1384 //===--------------------------------------------------------------------===//
1385 // Instruction creation methods: Binary Operators
1386 //===--------------------------------------------------------------------===//
1387private:
1388 BinaryOperator *CreateInsertNUWNSWBinOp(BinaryOperator::BinaryOps Opc,
1389 Value *LHS, Value *RHS,
1390 const Twine &Name,
1391 bool HasNUW, bool HasNSW) {
1393 if (HasNUW) BO->setHasNoUnsignedWrap();
1394 if (HasNSW) BO->setHasNoSignedWrap();
1395 return BO;
1396 }
1397
1398 Instruction *setFPAttrs(Instruction *I, MDNode *FPMD,
1399 FastMathFlags FMF) const {
1400 if (!FPMD)
1401 FPMD = DefaultFPMathTag;
1402 if (FPMD)
1403 I->setMetadata(LLVMContext::MD_fpmath, FPMD);
1404 I->setFastMathFlags(FMF);
1405 return I;
1406 }
1407
1408 Value *getConstrainedFPRounding(std::optional<RoundingMode> Rounding) {
1410
1411 if (Rounding)
1412 UseRounding = *Rounding;
1413
1414 std::optional<StringRef> RoundingStr =
1415 convertRoundingModeToStr(UseRounding);
1416 assert(RoundingStr && "Garbage strict rounding mode!");
1417 auto *RoundingMDS = MDString::get(Context, *RoundingStr);
1418
1419 return MetadataAsValue::get(Context, RoundingMDS);
1420 }
1421
1422 Value *getConstrainedFPExcept(std::optional<fp::ExceptionBehavior> Except) {
1423 std::optional<StringRef> ExceptStr = convertExceptionBehaviorToStr(
1424 Except.value_or(DefaultConstrainedExcept));
1425 assert(ExceptStr && "Garbage strict exception behavior!");
1426 auto *ExceptMDS = MDString::get(Context, *ExceptStr);
1427
1428 return MetadataAsValue::get(Context, ExceptMDS);
1429 }
1430
1431 Value *getConstrainedFPPredicate(CmpInst::Predicate Predicate) {
1432 assert(CmpInst::isFPPredicate(Predicate) &&
1433 Predicate != CmpInst::FCMP_FALSE &&
1434 Predicate != CmpInst::FCMP_TRUE &&
1435 "Invalid constrained FP comparison predicate!");
1436
1437 StringRef PredicateStr = CmpInst::getPredicateName(Predicate);
1438 auto *PredicateMDS = MDString::get(Context, PredicateStr);
1439
1440 return MetadataAsValue::get(Context, PredicateMDS);
1441 }
1442
1443public:
1444 Value *CreateAdd(Value *LHS, Value *RHS, const Twine &Name = "",
1445 bool HasNUW = false, bool HasNSW = false) {
1446 if (Value *V =
1447 Folder.FoldNoWrapBinOp(Instruction::Add, LHS, RHS, HasNUW, HasNSW))
1448 return V;
1449 return CreateInsertNUWNSWBinOp(Instruction::Add, LHS, RHS, Name, HasNUW,
1450 HasNSW);
1451 }
1452
1453 Value *CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
1454 return CreateAdd(LHS, RHS, Name, false, true);
1455 }
1456
1457 Value *CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
1458 return CreateAdd(LHS, RHS, Name, true, false);
1459 }
1460
1461 Value *CreateSub(Value *LHS, Value *RHS, const Twine &Name = "",
1462 bool HasNUW = false, bool HasNSW = false) {
1463 if (Value *V =
1464 Folder.FoldNoWrapBinOp(Instruction::Sub, LHS, RHS, HasNUW, HasNSW))
1465 return V;
1466 return CreateInsertNUWNSWBinOp(Instruction::Sub, LHS, RHS, Name, HasNUW,
1467 HasNSW);
1468 }
1469
1470 Value *CreateNSWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
1471 return CreateSub(LHS, RHS, Name, false, true);
1472 }
1473
1474 Value *CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
1475 return CreateSub(LHS, RHS, Name, true, false);
1476 }
1477
1478 Value *CreateMul(Value *LHS, Value *RHS, const Twine &Name = "",
1479 bool HasNUW = false, bool HasNSW = false) {
1480 if (Value *V =
1481 Folder.FoldNoWrapBinOp(Instruction::Mul, LHS, RHS, HasNUW, HasNSW))
1482 return V;
1483 return CreateInsertNUWNSWBinOp(Instruction::Mul, LHS, RHS, Name, HasNUW,
1484 HasNSW);
1485 }
1486
1487 Value *CreateNSWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
1488 return CreateMul(LHS, RHS, Name, false, true);
1489 }
1490
1491 Value *CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
1492 return CreateMul(LHS, RHS, Name, true, false);
1493 }
1494
1495 Value *CreateUDiv(Value *LHS, Value *RHS, const Twine &Name = "",
1496 bool isExact = false) {
1497 if (Value *V = Folder.FoldExactBinOp(Instruction::UDiv, LHS, RHS, isExact))
1498 return V;
1499 if (!isExact)
1500 return Insert(BinaryOperator::CreateUDiv(LHS, RHS), Name);
1501 return Insert(BinaryOperator::CreateExactUDiv(LHS, RHS), Name);
1502 }
1503
1504 Value *CreateExactUDiv(Value *LHS, Value *RHS, const Twine &Name = "") {
1505 return CreateUDiv(LHS, RHS, Name, true);
1506 }
1507
1508 Value *CreateSDiv(Value *LHS, Value *RHS, const Twine &Name = "",
1509 bool isExact = false) {
1510 if (Value *V = Folder.FoldExactBinOp(Instruction::SDiv, LHS, RHS, isExact))
1511 return V;
1512 if (!isExact)
1513 return Insert(BinaryOperator::CreateSDiv(LHS, RHS), Name);
1514 return Insert(BinaryOperator::CreateExactSDiv(LHS, RHS), Name);
1515 }
1516
1517 Value *CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name = "") {
1518 return CreateSDiv(LHS, RHS, Name, true);
1519 }
1520
1521 Value *CreateURem(Value *LHS, Value *RHS, const Twine &Name = "") {
1522 if (Value *V = Folder.FoldBinOp(Instruction::URem, LHS, RHS))
1523 return V;
1524 return Insert(BinaryOperator::CreateURem(LHS, RHS), Name);
1525 }
1526
1527 Value *CreateSRem(Value *LHS, Value *RHS, const Twine &Name = "") {
1528 if (Value *V = Folder.FoldBinOp(Instruction::SRem, LHS, RHS))
1529 return V;
1530 return Insert(BinaryOperator::CreateSRem(LHS, RHS), Name);
1531 }
1532
1533 Value *CreateShl(Value *LHS, Value *RHS, const Twine &Name = "",
1534 bool HasNUW = false, bool HasNSW = false) {
1535 if (Value *V =
1536 Folder.FoldNoWrapBinOp(Instruction::Shl, LHS, RHS, HasNUW, HasNSW))
1537 return V;
1538 return CreateInsertNUWNSWBinOp(Instruction::Shl, LHS, RHS, Name,
1539 HasNUW, HasNSW);
1540 }
1541
1542 Value *CreateShl(Value *LHS, const APInt &RHS, const Twine &Name = "",
1543 bool HasNUW = false, bool HasNSW = false) {
1544 return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name,
1545 HasNUW, HasNSW);
1546 }
1547
1548 Value *CreateShl(Value *LHS, uint64_t RHS, const Twine &Name = "",
1549 bool HasNUW = false, bool HasNSW = false) {
1550 return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name,
1551 HasNUW, HasNSW);
1552 }
1553
1554 Value *CreateLShr(Value *LHS, Value *RHS, const Twine &Name = "",
1555 bool isExact = false) {
1556 if (Value *V = Folder.FoldExactBinOp(Instruction::LShr, LHS, RHS, isExact))
1557 return V;
1558 if (!isExact)
1559 return Insert(BinaryOperator::CreateLShr(LHS, RHS), Name);
1560 return Insert(BinaryOperator::CreateExactLShr(LHS, RHS), Name);
1561 }
1562
1563 Value *CreateLShr(Value *LHS, const APInt &RHS, const Twine &Name = "",
1564 bool isExact = false) {
1565 return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
1566 }
1567
1569 bool isExact = false) {
1570 return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
1571 }
1572
1573 Value *CreateAShr(Value *LHS, Value *RHS, const Twine &Name = "",
1574 bool isExact = false) {
1575 if (Value *V = Folder.FoldExactBinOp(Instruction::AShr, LHS, RHS, isExact))
1576 return V;
1577 if (!isExact)
1578 return Insert(BinaryOperator::CreateAShr(LHS, RHS), Name);
1579 return Insert(BinaryOperator::CreateExactAShr(LHS, RHS), Name);
1580 }
1581
1582 Value *CreateAShr(Value *LHS, const APInt &RHS, const Twine &Name = "",
1583 bool isExact = false) {
1584 return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
1585 }
1586
1588 bool isExact = false) {
1589 return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
1590 }
1591
1592 Value *CreateAnd(Value *LHS, Value *RHS, const Twine &Name = "") {
1593 if (auto *V = Folder.FoldBinOp(Instruction::And, LHS, RHS))
1594 return V;
1595 return Insert(BinaryOperator::CreateAnd(LHS, RHS), Name);
1596 }
1597
1598 Value *CreateAnd(Value *LHS, const APInt &RHS, const Twine &Name = "") {
1599 return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
1600 }
1601
1602 Value *CreateAnd(Value *LHS, uint64_t RHS, const Twine &Name = "") {
1603 return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
1604 }
1605
1607 assert(!Ops.empty());
1608 Value *Accum = Ops[0];
1609 for (unsigned i = 1; i < Ops.size(); i++)
1610 Accum = CreateAnd(Accum, Ops[i]);
1611 return Accum;
1612 }
1613
1614 Value *CreateOr(Value *LHS, Value *RHS, const Twine &Name = "",
1615 bool IsDisjoint = false) {
1616 if (auto *V = Folder.FoldBinOp(Instruction::Or, LHS, RHS))
1617 return V;
1618 return Insert(
1619 IsDisjoint ? BinaryOperator::CreateDisjoint(Instruction::Or, LHS, RHS)
1620 : BinaryOperator::CreateOr(LHS, RHS),
1621 Name);
1622 }
1623
1624 Value *CreateOr(Value *LHS, const APInt &RHS, const Twine &Name = "") {
1625 return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
1626 }
1627
1628 Value *CreateOr(Value *LHS, uint64_t RHS, const Twine &Name = "") {
1629 return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
1630 }
1631
1633 assert(!Ops.empty());
1634 Value *Accum = Ops[0];
1635 for (unsigned i = 1; i < Ops.size(); i++)
1636 Accum = CreateOr(Accum, Ops[i]);
1637 return Accum;
1638 }
1639
1640 Value *CreateDisjointOr(Value *LHS, Value *RHS, const Twine &Name = "") {
1641 return CreateOr(LHS, RHS, Name, true);
1642 }
1643
1644 Value *CreateXor(Value *LHS, Value *RHS, const Twine &Name = "") {
1645 if (Value *V = Folder.FoldBinOp(Instruction::Xor, LHS, RHS))
1646 return V;
1647 return Insert(BinaryOperator::CreateXor(LHS, RHS), Name);
1648 }
1649
1650 Value *CreateXor(Value *LHS, const APInt &RHS, const Twine &Name = "") {
1651 return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
1652 }
1653
1654 Value *CreateXor(Value *LHS, uint64_t RHS, const Twine &Name = "") {
1655 return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
1656 }
1657
1658 Value *CreateFAdd(Value *L, Value *R, const Twine &Name = "",
1659 MDNode *FPMD = nullptr) {
1660 return CreateFAddFMF(L, R, {}, Name, FPMD);
1661 }
1662
1664 const Twine &Name = "", MDNode *FPMD = nullptr) {
1665 if (IsFPConstrained)
1666 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fadd,
1667 L, R, FMFSource, Name, FPMD);
1668
1669 if (Value *V =
1670 Folder.FoldBinOpFMF(Instruction::FAdd, L, R, FMFSource.get(FMF)))
1671 return V;
1672 Instruction *I =
1673 setFPAttrs(BinaryOperator::CreateFAdd(L, R), FPMD, FMFSource.get(FMF));
1674 return Insert(I, Name);
1675 }
1676
1677 Value *CreateFSub(Value *L, Value *R, const Twine &Name = "",
1678 MDNode *FPMD = nullptr) {
1679 return CreateFSubFMF(L, R, {}, Name, FPMD);
1680 }
1681
1683 const Twine &Name = "", MDNode *FPMD = nullptr) {
1684 if (IsFPConstrained)
1685 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fsub,
1686 L, R, FMFSource, Name, FPMD);
1687
1688 if (Value *V =
1689 Folder.FoldBinOpFMF(Instruction::FSub, L, R, FMFSource.get(FMF)))
1690 return V;
1691 Instruction *I =
1692 setFPAttrs(BinaryOperator::CreateFSub(L, R), FPMD, FMFSource.get(FMF));
1693 return Insert(I, Name);
1694 }
1695
1696 Value *CreateFMul(Value *L, Value *R, const Twine &Name = "",
1697 MDNode *FPMD = nullptr) {
1698 return CreateFMulFMF(L, R, {}, Name, FPMD);
1699 }
1700
1702 const Twine &Name = "", MDNode *FPMD = nullptr) {
1703 if (IsFPConstrained)
1704 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fmul,
1705 L, R, FMFSource, Name, FPMD);
1706
1707 if (Value *V =
1708 Folder.FoldBinOpFMF(Instruction::FMul, L, R, FMFSource.get(FMF)))
1709 return V;
1710 Instruction *I =
1711 setFPAttrs(BinaryOperator::CreateFMul(L, R), FPMD, FMFSource.get(FMF));
1712 return Insert(I, Name);
1713 }
1714
1715 Value *CreateFDiv(Value *L, Value *R, const Twine &Name = "",
1716 MDNode *FPMD = nullptr) {
1717 return CreateFDivFMF(L, R, {}, Name, FPMD);
1718 }
1719
1721 const Twine &Name = "", MDNode *FPMD = nullptr) {
1722 if (IsFPConstrained)
1723 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fdiv,
1724 L, R, FMFSource, Name, FPMD);
1725
1726 if (Value *V =
1727 Folder.FoldBinOpFMF(Instruction::FDiv, L, R, FMFSource.get(FMF)))
1728 return V;
1729 Instruction *I =
1730 setFPAttrs(BinaryOperator::CreateFDiv(L, R), FPMD, FMFSource.get(FMF));
1731 return Insert(I, Name);
1732 }
1733
1734 Value *CreateFRem(Value *L, Value *R, const Twine &Name = "",
1735 MDNode *FPMD = nullptr) {
1736 return CreateFRemFMF(L, R, {}, Name, FPMD);
1737 }
1738
1740 const Twine &Name = "", MDNode *FPMD = nullptr) {
1741 if (IsFPConstrained)
1742 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_frem,
1743 L, R, FMFSource, Name, FPMD);
1744
1745 if (Value *V =
1746 Folder.FoldBinOpFMF(Instruction::FRem, L, R, FMFSource.get(FMF)))
1747 return V;
1748 Instruction *I =
1749 setFPAttrs(BinaryOperator::CreateFRem(L, R), FPMD, FMFSource.get(FMF));
1750 return Insert(I, Name);
1751 }
1752
1754 Value *LHS, Value *RHS, const Twine &Name = "",
1755 MDNode *FPMathTag = nullptr) {
1756 return CreateBinOpFMF(Opc, LHS, RHS, {}, Name, FPMathTag);
1757 }
1758
1760 FMFSource FMFSource, const Twine &Name = "",
1761 MDNode *FPMathTag = nullptr) {
1762 if (Value *V = Folder.FoldBinOp(Opc, LHS, RHS))
1763 return V;
1765 if (isa<FPMathOperator>(BinOp))
1766 setFPAttrs(BinOp, FPMathTag, FMFSource.get(FMF));
1767 return Insert(BinOp, Name);
1768 }
1769
1771 bool IsNUW, bool IsNSW, const Twine &Name = "") {
1772 if (Value *V = Folder.FoldNoWrapBinOp(Opc, LHS, RHS, IsNUW, IsNSW))
1773 return V;
1775 if (IsNUW)
1776 BinOp->setHasNoUnsignedWrap(IsNUW);
1777 if (IsNSW)
1778 BinOp->setHasNoSignedWrap(IsNSW);
1779 return Insert(BinOp, Name);
1780 }
1781
1783 bool IsExact, const Twine &Name = "") {
1784 if (Value *V = Folder.FoldExactBinOp(Opc, LHS, RHS, IsExact))
1785 return V;
1787 if (IsExact)
1788 BinOp->setIsExact(IsExact);
1789 return Insert(BinOp, Name);
1790 }
1791
1792 Value *CreateLogicalAnd(Value *Cond1, Value *Cond2, const Twine &Name = "",
1793 Instruction *MDFrom = nullptr) {
1794 assert(Cond2->getType()->isIntOrIntVectorTy(1));
1795 return CreateSelect(Cond1, Cond2,
1796 ConstantInt::getNullValue(Cond2->getType()), Name,
1797 MDFrom);
1798 }
1799
1800 Value *CreateLogicalOr(Value *Cond1, Value *Cond2, const Twine &Name = "",
1801 Instruction *MDFrom = nullptr) {
1802 assert(Cond2->getType()->isIntOrIntVectorTy(1));
1803 return CreateSelect(Cond1, ConstantInt::getAllOnesValue(Cond2->getType()),
1804 Cond2, Name, MDFrom);
1805 }
1806
1808 const Twine &Name = "",
1809 Instruction *MDFrom = nullptr) {
1810 switch (Opc) {
1811 case Instruction::And:
1812 return CreateLogicalAnd(Cond1, Cond2, Name, MDFrom);
1813 case Instruction::Or:
1814 return CreateLogicalOr(Cond1, Cond2, Name, MDFrom);
1815 default:
1816 break;
1817 }
1818 llvm_unreachable("Not a logical operation.");
1819 }
1820
1821 // NOTE: this is sequential, non-commutative, ordered reduction!
1823 assert(!Ops.empty());
1824 Value *Accum = Ops[0];
1825 for (unsigned i = 1; i < Ops.size(); i++)
1826 Accum = CreateLogicalOr(Accum, Ops[i]);
1827 return Accum;
1828 }
1829
1830 /// This function is like @ref CreateIntrinsic for constrained fp
1831 /// intrinsics. It sets the rounding mode and exception behavior of
1832 /// the created intrinsic call according to \p Rounding and \p
1833 /// Except and it sets \p FPMathTag as the 'fpmath' metadata, using
1834 /// defaults if a value equals nullopt/null.
1837 FMFSource FMFSource, const Twine &Name, MDNode *FPMathTag = nullptr,
1838 std::optional<RoundingMode> Rounding = std::nullopt,
1839 std::optional<fp::ExceptionBehavior> Except = std::nullopt);
1840
1843 const Twine &Name = "", MDNode *FPMathTag = nullptr,
1844 std::optional<RoundingMode> Rounding = std::nullopt,
1845 std::optional<fp::ExceptionBehavior> Except = std::nullopt);
1846
1848 Intrinsic::ID ID, Value *L, Value *R, FMFSource FMFSource = {},
1849 const Twine &Name = "", MDNode *FPMathTag = nullptr,
1850 std::optional<fp::ExceptionBehavior> Except = std::nullopt);
1851
1852 Value *CreateNeg(Value *V, const Twine &Name = "", bool HasNSW = false) {
1853 return CreateSub(Constant::getNullValue(V->getType()), V, Name,
1854 /*HasNUW=*/0, HasNSW);
1855 }
1856
1857 Value *CreateNSWNeg(Value *V, const Twine &Name = "") {
1858 return CreateNeg(V, Name, /*HasNSW=*/true);
1859 }
1860
1861 Value *CreateFNeg(Value *V, const Twine &Name = "",
1862 MDNode *FPMathTag = nullptr) {
1863 return CreateFNegFMF(V, {}, Name, FPMathTag);
1864 }
1865
1867 MDNode *FPMathTag = nullptr) {
1868 if (Value *Res =
1869 Folder.FoldUnOpFMF(Instruction::FNeg, V, FMFSource.get(FMF)))
1870 return Res;
1871 return Insert(
1872 setFPAttrs(UnaryOperator::CreateFNeg(V), FPMathTag, FMFSource.get(FMF)),
1873 Name);
1874 }
1875
1876 Value *CreateNot(Value *V, const Twine &Name = "") {
1877 return CreateXor(V, Constant::getAllOnesValue(V->getType()), Name);
1878 }
1879
1881 Value *V, const Twine &Name = "",
1882 MDNode *FPMathTag = nullptr) {
1883 if (Value *Res = Folder.FoldUnOpFMF(Opc, V, FMF))
1884 return Res;
1886 if (isa<FPMathOperator>(UnOp))
1887 setFPAttrs(UnOp, FPMathTag, FMF);
1888 return Insert(UnOp, Name);
1889 }
1890
1891 /// Create either a UnaryOperator or BinaryOperator depending on \p Opc.
1892 /// Correct number of operands must be passed accordingly.
1894 const Twine &Name = "",
1895 MDNode *FPMathTag = nullptr);
1896
1897 //===--------------------------------------------------------------------===//
1898 // Instruction creation methods: Memory Instructions
1899 //===--------------------------------------------------------------------===//
1900
1901 AllocaInst *CreateAlloca(Type *Ty, unsigned AddrSpace,
1902 Value *ArraySize = nullptr, const Twine &Name = "") {
1903 const DataLayout &DL = BB->getDataLayout();
1904 Align AllocaAlign = DL.getPrefTypeAlign(Ty);
1905 return Insert(new AllocaInst(Ty, AddrSpace, ArraySize, AllocaAlign), Name);
1906 }
1907
1908 AllocaInst *CreateAlloca(Type *Ty, Value *ArraySize = nullptr,
1909 const Twine &Name = "") {
1910 const DataLayout &DL = BB->getDataLayout();
1911 Align AllocaAlign = DL.getPrefTypeAlign(Ty);
1912 unsigned AddrSpace = DL.getAllocaAddrSpace();
1913 return Insert(new AllocaInst(Ty, AddrSpace, ArraySize, AllocaAlign), Name);
1914 }
1915
1917 const DataLayout &DL = BB->getDataLayout();
1918 PointerType *PtrTy = DL.getAllocaPtrType(Context);
1919 CallInst *Output =
1920 CreateIntrinsic(Intrinsic::structured_alloca, {PtrTy}, {}, {}, Name);
1921 Output->addRetAttr(
1922 Attribute::get(getContext(), Attribute::ElementType, BaseType));
1923 return Output;
1924 }
1925
1926 /// Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of
1927 /// converting the string to 'bool' for the isVolatile parameter.
1928 LoadInst *CreateLoad(Type *Ty, Value *Ptr, const char *Name) {
1929 return CreateAlignedLoad(Ty, Ptr, MaybeAlign(), Name);
1930 }
1931
1932 LoadInst *CreateLoad(Type *Ty, Value *Ptr, const Twine &Name = "") {
1933 return CreateAlignedLoad(Ty, Ptr, MaybeAlign(), Name);
1934 }
1935
1936 LoadInst *CreateLoad(Type *Ty, Value *Ptr, bool isVolatile,
1937 const Twine &Name = "") {
1938 return CreateAlignedLoad(Ty, Ptr, MaybeAlign(), isVolatile, Name);
1939 }
1940
1941 StoreInst *CreateStore(Value *Val, Value *Ptr, bool isVolatile = false) {
1942 return CreateAlignedStore(Val, Ptr, MaybeAlign(), isVolatile);
1943 }
1944
1946 const char *Name) {
1947 return CreateAlignedLoad(Ty, Ptr, Align, /*isVolatile*/false, Name);
1948 }
1949
1951 const Twine &Name = "") {
1952 return CreateAlignedLoad(Ty, Ptr, Align, /*isVolatile*/false, Name);
1953 }
1954
1956 bool isVolatile, const Twine &Name = "") {
1957 if (!Align) {
1958 const DataLayout &DL = BB->getDataLayout();
1959 Align = DL.getABITypeAlign(Ty);
1960 }
1961 return Insert(new LoadInst(Ty, Ptr, Twine(), isVolatile, *Align), Name);
1962 }
1963
1965 bool isVolatile = false) {
1966 if (!Align) {
1967 const DataLayout &DL = BB->getDataLayout();
1968 Align = DL.getABITypeAlign(Val->getType());
1969 }
1970 return Insert(new StoreInst(Val, Ptr, isVolatile, *Align));
1971 }
1974 const Twine &Name = "") {
1975 return Insert(new FenceInst(Context, Ordering, SSID), Name);
1976 }
1977
1980 AtomicOrdering SuccessOrdering,
1981 AtomicOrdering FailureOrdering,
1983 if (!Align) {
1984 const DataLayout &DL = BB->getDataLayout();
1985 Align = llvm::Align(DL.getTypeStoreSize(New->getType()));
1986 }
1987
1988 return Insert(new AtomicCmpXchgInst(Ptr, Cmp, New, *Align, SuccessOrdering,
1989 FailureOrdering, SSID));
1990 }
1991
1993 Value *Val, MaybeAlign Align,
1994 AtomicOrdering Ordering,
1996 bool Elementwise = false) {
1997 if (!Align) {
1998 const DataLayout &DL = BB->getDataLayout();
1999 Align = llvm::Align(DL.getTypeStoreSize(Val->getType()));
2000 }
2001
2002 return Insert(
2003 new AtomicRMWInst(Op, Ptr, Val, *Align, Ordering, SSID, Elementwise));
2004 }
2005
2007 ArrayRef<Value *> Indices,
2008 const Twine &Name = "") {
2010 Args.push_back(PtrBase);
2011 llvm::append_range(Args, Indices);
2012
2013 CallInst *Output = CreateIntrinsic(Intrinsic::structured_gep,
2014 {PtrBase->getType()}, Args, {}, Name);
2015 Output->addParamAttr(
2016 0, Attribute::get(getContext(), Attribute::ElementType, BaseType));
2017 return Output;
2018 }
2019
2021 const Twine &Name = "",
2023 if (auto *V = Folder.FoldGEP(Ty, Ptr, IdxList, NW))
2024 return V;
2025 return Insert(GetElementPtrInst::Create(Ty, Ptr, IdxList, NW), Name);
2026 }
2027
2029 const Twine &Name = "") {
2030 return CreateGEP(Ty, Ptr, IdxList, Name, GEPNoWrapFlags::inBounds());
2031 }
2032
2033 Value *CreateConstGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0,
2034 const Twine &Name = "") {
2035 Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0);
2036 return CreateGEP(Ty, Ptr, Idx, Name, GEPNoWrapFlags::none());
2037 }
2038
2039 Value *CreateConstInBoundsGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0,
2040 const Twine &Name = "") {
2041 Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0);
2042 return CreateGEP(Ty, Ptr, Idx, Name, GEPNoWrapFlags::inBounds());
2043 }
2044
2045 Value *CreateConstGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1,
2046 const Twine &Name = "",
2048 Value *Idxs[] = {
2049 ConstantInt::get(Type::getInt32Ty(Context), Idx0),
2050 ConstantInt::get(Type::getInt32Ty(Context), Idx1)
2051 };
2052 return CreateGEP(Ty, Ptr, Idxs, Name, NWFlags);
2053 }
2054
2055 Value *CreateConstInBoundsGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0,
2056 unsigned Idx1, const Twine &Name = "") {
2057 Value *Idxs[] = {
2058 ConstantInt::get(Type::getInt32Ty(Context), Idx0),
2059 ConstantInt::get(Type::getInt32Ty(Context), Idx1)
2060 };
2061 return CreateGEP(Ty, Ptr, Idxs, Name, GEPNoWrapFlags::inBounds());
2062 }
2063
2065 const Twine &Name = "") {
2066 Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0);
2067 return CreateGEP(Ty, Ptr, Idx, Name, GEPNoWrapFlags::none());
2068 }
2069
2071 const Twine &Name = "") {
2072 Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0);
2073 return CreateGEP(Ty, Ptr, Idx, Name, GEPNoWrapFlags::inBounds());
2074 }
2075
2077 const Twine &Name = "") {
2078 Value *Idxs[] = {
2079 ConstantInt::get(Type::getInt64Ty(Context), Idx0),
2080 ConstantInt::get(Type::getInt64Ty(Context), Idx1)
2081 };
2082 return CreateGEP(Ty, Ptr, Idxs, Name, GEPNoWrapFlags::none());
2083 }
2084
2086 uint64_t Idx1, const Twine &Name = "") {
2087 Value *Idxs[] = {
2088 ConstantInt::get(Type::getInt64Ty(Context), Idx0),
2089 ConstantInt::get(Type::getInt64Ty(Context), Idx1)
2090 };
2091 return CreateGEP(Ty, Ptr, Idxs, Name, GEPNoWrapFlags::inBounds());
2092 }
2093
2094 Value *CreateStructGEP(Type *Ty, Value *Ptr, unsigned Idx,
2095 const Twine &Name = "") {
2096 GEPNoWrapFlags NWFlags =
2098 return CreateConstGEP2_32(Ty, Ptr, 0, Idx, Name, NWFlags);
2099 }
2100
2101 Value *CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name = "",
2103 return CreateGEP(getInt8Ty(), Ptr, Offset, Name, NW);
2104 }
2105
2107 const Twine &Name = "") {
2108 return CreateGEP(getInt8Ty(), Ptr, Offset, Name,
2110 }
2111
2112 //===--------------------------------------------------------------------===//
2113 // Instruction creation methods: Cast/Conversion Operators
2114 //===--------------------------------------------------------------------===//
2115
2116 Value *CreateTrunc(Value *V, Type *DestTy, const Twine &Name = "",
2117 bool IsNUW = false, bool IsNSW = false) {
2118 if (V->getType() == DestTy)
2119 return V;
2120 if (Value *Folded = Folder.FoldCast(Instruction::Trunc, V, DestTy))
2121 return Folded;
2122 Instruction *I = CastInst::Create(Instruction::Trunc, V, DestTy);
2123 if (IsNUW)
2124 I->setHasNoUnsignedWrap();
2125 if (IsNSW)
2126 I->setHasNoSignedWrap();
2127 return Insert(I, Name);
2128 }
2129
2130 Value *CreateZExt(Value *V, Type *DestTy, const Twine &Name = "",
2131 bool IsNonNeg = false) {
2132 if (V->getType() == DestTy)
2133 return V;
2134 if (Value *Folded = Folder.FoldCast(Instruction::ZExt, V, DestTy))
2135 return Folded;
2136 Instruction *I = Insert(new ZExtInst(V, DestTy), Name);
2137 if (IsNonNeg)
2138 I->setNonNeg();
2139 return I;
2140 }
2141
2142 Value *CreateSExt(Value *V, Type *DestTy, const Twine &Name = "") {
2143 return CreateCast(Instruction::SExt, V, DestTy, Name);
2144 }
2145
2146 /// Create a ZExt or Trunc from the integer value V to DestTy. Return
2147 /// the value untouched if the type of V is already DestTy.
2149 const Twine &Name = "") {
2150 assert(V->getType()->isIntOrIntVectorTy() &&
2151 DestTy->isIntOrIntVectorTy() &&
2152 "Can only zero extend/truncate integers!");
2153 Type *VTy = V->getType();
2154 if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits())
2155 return CreateZExt(V, DestTy, Name);
2156 if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits())
2157 return CreateTrunc(V, DestTy, Name);
2158 return V;
2159 }
2160
2161 /// Create a SExt or Trunc from the integer value V to DestTy. Return
2162 /// the value untouched if the type of V is already DestTy.
2164 const Twine &Name = "") {
2165 assert(V->getType()->isIntOrIntVectorTy() &&
2166 DestTy->isIntOrIntVectorTy() &&
2167 "Can only sign extend/truncate integers!");
2168 Type *VTy = V->getType();
2169 if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits())
2170 return CreateSExt(V, DestTy, Name);
2171 if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits())
2172 return CreateTrunc(V, DestTy, Name);
2173 return V;
2174 }
2175
2176 Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = "") {
2177 if (IsFPConstrained)
2178 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fptoui,
2179 V, DestTy, nullptr, Name);
2180 return CreateCast(Instruction::FPToUI, V, DestTy, Name);
2181 }
2182
2183 Value *CreateFPToSI(Value *V, Type *DestTy, const Twine &Name = "") {
2184 if (IsFPConstrained)
2185 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fptosi,
2186 V, DestTy, nullptr, Name);
2187 return CreateCast(Instruction::FPToSI, V, DestTy, Name);
2188 }
2189
2190 Value *CreateUIToFP(Value *V, Type *DestTy, const Twine &Name = "",
2191 bool IsNonNeg = false, MDNode *FPMathTag = nullptr) {
2192 if (IsFPConstrained)
2193 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_uitofp,
2194 V, DestTy, nullptr, Name);
2195 Value *Val = CreateCast(Instruction::UIToFP, V, DestTy, Name, FPMathTag);
2196 if (auto *I = dyn_cast<Instruction>(Val))
2197 if (IsNonNeg)
2198 I->setNonNeg();
2199 return Val;
2200 }
2201
2202 Value *CreateSIToFP(Value *V, Type *DestTy, const Twine &Name = "",
2203 MDNode *FPMathTag = nullptr) {
2204 if (IsFPConstrained)
2205 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_sitofp,
2206 V, DestTy, nullptr, Name);
2207 return CreateCast(Instruction::SIToFP, V, DestTy, Name, FPMathTag);
2208 }
2209
2210 Value *CreateFPTrunc(Value *V, Type *DestTy, const Twine &Name = "",
2211 MDNode *FPMathTag = nullptr) {
2212 return CreateFPTruncFMF(V, DestTy, {}, Name, FPMathTag);
2213 }
2214
2216 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2217 if (IsFPConstrained)
2219 Intrinsic::experimental_constrained_fptrunc, V, DestTy, FMFSource,
2220 Name, FPMathTag);
2221 return CreateCast(Instruction::FPTrunc, V, DestTy, Name, FPMathTag,
2222 FMFSource);
2223 }
2224
2225 Value *CreateFPExt(Value *V, Type *DestTy, const Twine &Name = "",
2226 MDNode *FPMathTag = nullptr) {
2227 return CreateFPExtFMF(V, DestTy, {}, Name, FPMathTag);
2228 }
2229
2231 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2232 if (IsFPConstrained)
2233 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fpext,
2234 V, DestTy, FMFSource, Name, FPMathTag);
2235 return CreateCast(Instruction::FPExt, V, DestTy, Name, FPMathTag,
2236 FMFSource);
2237 }
2238 Value *CreatePtrToAddr(Value *V, const Twine &Name = "") {
2239 return CreateCast(Instruction::PtrToAddr, V,
2240 BB->getDataLayout().getAddressType(V->getType()), Name);
2241 }
2243 const Twine &Name = "") {
2244 return CreateCast(Instruction::PtrToInt, V, DestTy, Name);
2245 }
2246
2248 const Twine &Name = "") {
2249 return CreateCast(Instruction::IntToPtr, V, DestTy, Name);
2250 }
2251
2253 const Twine &Name = "") {
2254 return CreateCast(Instruction::BitCast, V, DestTy, Name);
2255 }
2256
2258 const Twine &Name = "") {
2259 return CreateCast(Instruction::AddrSpaceCast, V, DestTy, Name);
2260 }
2261
2262 Value *CreateZExtOrBitCast(Value *V, Type *DestTy, const Twine &Name = "") {
2263 Instruction::CastOps CastOp =
2264 V->getType()->getScalarSizeInBits() == DestTy->getScalarSizeInBits()
2265 ? Instruction::BitCast
2266 : Instruction::ZExt;
2267 return CreateCast(CastOp, V, DestTy, Name);
2268 }
2269
2270 Value *CreateSExtOrBitCast(Value *V, Type *DestTy, const Twine &Name = "") {
2271 Instruction::CastOps CastOp =
2272 V->getType()->getScalarSizeInBits() == DestTy->getScalarSizeInBits()
2273 ? Instruction::BitCast
2274 : Instruction::SExt;
2275 return CreateCast(CastOp, V, DestTy, Name);
2276 }
2277
2278 Value *CreateTruncOrBitCast(Value *V, Type *DestTy, const Twine &Name = "") {
2279 Instruction::CastOps CastOp =
2280 V->getType()->getScalarSizeInBits() == DestTy->getScalarSizeInBits()
2281 ? Instruction::BitCast
2282 : Instruction::Trunc;
2283 return CreateCast(CastOp, V, DestTy, Name);
2284 }
2285
2287 const Twine &Name = "", MDNode *FPMathTag = nullptr,
2288 FMFSource FMFSource = {}) {
2289 if (V->getType() == DestTy)
2290 return V;
2291 if (Value *Folded = Folder.FoldCast(Op, V, DestTy))
2292 return Folded;
2293 Instruction *Cast = CastInst::Create(Op, V, DestTy);
2294 if (isa<FPMathOperator>(Cast))
2295 setFPAttrs(Cast, FPMathTag, FMFSource.get(FMF));
2296 return Insert(Cast, Name);
2297 }
2298
2300 const Twine &Name = "") {
2301 if (V->getType() == DestTy)
2302 return V;
2303 if (auto *VC = dyn_cast<Constant>(V))
2304 return Insert(Folder.CreatePointerCast(VC, DestTy), Name);
2305 return Insert(CastInst::CreatePointerCast(V, DestTy), Name);
2306 }
2307
2308 // With opaque pointers enabled, this can be substituted with
2309 // CreateAddrSpaceCast.
2310 // TODO: Replace uses of this method and remove the method itself.
2312 const Twine &Name = "") {
2313 if (V->getType() == DestTy)
2314 return V;
2315
2316 if (auto *VC = dyn_cast<Constant>(V)) {
2317 return Insert(Folder.CreatePointerBitCastOrAddrSpaceCast(VC, DestTy),
2318 Name);
2319 }
2320
2322 Name);
2323 }
2324
2326 const Twine &Name = "") {
2327 Instruction::CastOps CastOp =
2328 V->getType()->getScalarSizeInBits() > DestTy->getScalarSizeInBits()
2329 ? Instruction::Trunc
2330 : (isSigned ? Instruction::SExt : Instruction::ZExt);
2331 return CreateCast(CastOp, V, DestTy, Name);
2332 }
2333
2335 const Twine &Name = "") {
2336 if (V->getType() == DestTy)
2337 return V;
2338 if (V->getType()->isPtrOrPtrVectorTy() && DestTy->isIntOrIntVectorTy())
2339 return CreatePtrToInt(V, DestTy, Name);
2340 if (V->getType()->isIntOrIntVectorTy() && DestTy->isPtrOrPtrVectorTy())
2341 return CreateIntToPtr(V, DestTy, Name);
2342
2343 return CreateBitCast(V, DestTy, Name);
2344 }
2345
2346 Value *CreateFPCast(Value *V, Type *DestTy, const Twine &Name = "",
2347 MDNode *FPMathTag = nullptr) {
2348 Instruction::CastOps CastOp =
2349 V->getType()->getScalarSizeInBits() > DestTy->getScalarSizeInBits()
2350 ? Instruction::FPTrunc
2351 : Instruction::FPExt;
2352 return CreateCast(CastOp, V, DestTy, Name, FPMathTag);
2353 }
2354
2356 Intrinsic::ID ID, Value *V, Type *DestTy, FMFSource FMFSource = {},
2357 const Twine &Name = "", MDNode *FPMathTag = nullptr,
2358 std::optional<RoundingMode> Rounding = std::nullopt,
2359 std::optional<fp::ExceptionBehavior> Except = std::nullopt);
2360
2361 // Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a
2362 // compile time error, instead of converting the string to bool for the
2363 // isSigned parameter.
2364 Value *CreateIntCast(Value *, Type *, const char *) = delete;
2365
2366 /// Cast between aggregate types that must have identical structure but may
2367 /// differ in their leaf types. The leaf values are recursively extracted,
2368 /// casted, and then reinserted into a value of type DestTy. The leaf types
2369 /// must be castable using a bitcast or ptrcast, because signedness is
2370 /// not specified.
2372
2373 /// Create a chain of casts to convert V to NewTy, preserving the bit pattern
2374 /// of V. This may involve multiple casts (e.g., ptr -> i64 -> <2 x i32>).
2375 /// The created cast instructions are inserted into the current basic block.
2376 /// If no casts are needed, V is returned.
2378 Type *NewTy);
2379
2380 //===--------------------------------------------------------------------===//
2381 // Instruction creation methods: Compare Instructions
2382 //===--------------------------------------------------------------------===//
2383
2384 Value *CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
2385 return CreateICmp(ICmpInst::ICMP_EQ, LHS, RHS, Name);
2386 }
2387
2388 Value *CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name = "") {
2389 return CreateICmp(ICmpInst::ICMP_NE, LHS, RHS, Name);
2390 }
2391
2392 Value *CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name = "") {
2393 return CreateICmp(ICmpInst::ICMP_UGT, LHS, RHS, Name);
2394 }
2395
2396 Value *CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name = "") {
2397 return CreateICmp(ICmpInst::ICMP_UGE, LHS, RHS, Name);
2398 }
2399
2400 Value *CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name = "") {
2401 return CreateICmp(ICmpInst::ICMP_ULT, LHS, RHS, Name);
2402 }
2403
2404 Value *CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name = "") {
2405 return CreateICmp(ICmpInst::ICMP_ULE, LHS, RHS, Name);
2406 }
2407
2408 Value *CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name = "") {
2409 return CreateICmp(ICmpInst::ICMP_SGT, LHS, RHS, Name);
2410 }
2411
2412 Value *CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name = "") {
2413 return CreateICmp(ICmpInst::ICMP_SGE, LHS, RHS, Name);
2414 }
2415
2416 Value *CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name = "") {
2417 return CreateICmp(ICmpInst::ICMP_SLT, LHS, RHS, Name);
2418 }
2419
2420 Value *CreateICmpSLE(Value *LHS, Value *RHS, const Twine &Name = "") {
2421 return CreateICmp(ICmpInst::ICMP_SLE, LHS, RHS, Name);
2422 }
2423
2424 Value *CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name = "",
2425 MDNode *FPMathTag = nullptr) {
2426 return CreateFCmp(FCmpInst::FCMP_OEQ, LHS, RHS, Name, FPMathTag);
2427 }
2428
2429 Value *CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name = "",
2430 MDNode *FPMathTag = nullptr) {
2431 return CreateFCmp(FCmpInst::FCMP_OGT, LHS, RHS, Name, FPMathTag);
2432 }
2433
2434 Value *CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name = "",
2435 MDNode *FPMathTag = nullptr) {
2436 return CreateFCmp(FCmpInst::FCMP_OGE, LHS, RHS, Name, FPMathTag);
2437 }
2438
2439 Value *CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name = "",
2440 MDNode *FPMathTag = nullptr) {
2441 return CreateFCmp(FCmpInst::FCMP_OLT, LHS, RHS, Name, FPMathTag);
2442 }
2443
2444 Value *CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name = "",
2445 MDNode *FPMathTag = nullptr) {
2446 return CreateFCmp(FCmpInst::FCMP_OLE, LHS, RHS, Name, FPMathTag);
2447 }
2448
2449 Value *CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name = "",
2450 MDNode *FPMathTag = nullptr) {
2451 return CreateFCmp(FCmpInst::FCMP_ONE, LHS, RHS, Name, FPMathTag);
2452 }
2453
2454 Value *CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name = "",
2455 MDNode *FPMathTag = nullptr) {
2456 return CreateFCmp(FCmpInst::FCMP_ORD, LHS, RHS, Name, FPMathTag);
2457 }
2458
2459 Value *CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name = "",
2460 MDNode *FPMathTag = nullptr) {
2461 return CreateFCmp(FCmpInst::FCMP_UNO, LHS, RHS, Name, FPMathTag);
2462 }
2463
2464 Value *CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name = "",
2465 MDNode *FPMathTag = nullptr) {
2466 return CreateFCmp(FCmpInst::FCMP_UEQ, LHS, RHS, Name, FPMathTag);
2467 }
2468
2469 Value *CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name = "",
2470 MDNode *FPMathTag = nullptr) {
2471 return CreateFCmp(FCmpInst::FCMP_UGT, LHS, RHS, Name, FPMathTag);
2472 }
2473
2474 Value *CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name = "",
2475 MDNode *FPMathTag = nullptr) {
2476 return CreateFCmp(FCmpInst::FCMP_UGE, LHS, RHS, Name, FPMathTag);
2477 }
2478
2479 Value *CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name = "",
2480 MDNode *FPMathTag = nullptr) {
2481 return CreateFCmp(FCmpInst::FCMP_ULT, LHS, RHS, Name, FPMathTag);
2482 }
2483
2484 Value *CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name = "",
2485 MDNode *FPMathTag = nullptr) {
2486 return CreateFCmp(FCmpInst::FCMP_ULE, LHS, RHS, Name, FPMathTag);
2487 }
2488
2489 Value *CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name = "",
2490 MDNode *FPMathTag = nullptr) {
2491 return CreateFCmp(FCmpInst::FCMP_UNE, LHS, RHS, Name, FPMathTag);
2492 }
2493
2495 const Twine &Name = "") {
2496 if (auto *V = Folder.FoldCmp(P, LHS, RHS))
2497 return V;
2498 return Insert(new ICmpInst(P, LHS, RHS), Name);
2499 }
2500
2501 // Create a quiet floating-point comparison (i.e. one that raises an FP
2502 // exception only in the case where an input is a signaling NaN).
2503 // Note that this differs from CreateFCmpS only if IsFPConstrained is true.
2505 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2506 return CreateFCmpHelper(P, LHS, RHS, Name, FPMathTag, {}, false);
2507 }
2508
2509 // Create a quiet floating-point comparison (i.e. one that raises an FP
2510 // exception only in the case where an input is a signaling NaN).
2511 // Note that this differs from CreateFCmpS only if IsFPConstrained is true.
2513 FMFSource FMFSource, const Twine &Name = "",
2514 MDNode *FPMathTag = nullptr) {
2515 return CreateFCmpHelper(P, LHS, RHS, Name, FPMathTag, FMFSource, false);
2516 }
2517
2519 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2520 return CmpInst::isFPPredicate(Pred)
2521 ? CreateFCmp(Pred, LHS, RHS, Name, FPMathTag)
2522 : CreateICmp(Pred, LHS, RHS, Name);
2523 }
2524
2525 // Create a signaling floating-point comparison (i.e. one that raises an FP
2526 // exception whenever an input is any NaN, signaling or quiet).
2527 // Note that this differs from CreateFCmp only if IsFPConstrained is true.
2529 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2530 return CreateFCmpHelper(P, LHS, RHS, Name, FPMathTag, {}, true);
2531 }
2532
2533private:
2534 // Helper routine to create either a signaling or a quiet FP comparison.
2535 LLVM_ABI Value *CreateFCmpHelper(CmpInst::Predicate P, Value *LHS, Value *RHS,
2536 const Twine &Name, MDNode *FPMathTag,
2537 FMFSource FMFSource, bool IsSignaling);
2538
2539public:
2542 const Twine &Name = "",
2543 std::optional<fp::ExceptionBehavior> Except = std::nullopt);
2544
2545 //===--------------------------------------------------------------------===//
2546 // Instruction creation methods: Other Instructions
2547 //===--------------------------------------------------------------------===//
2548
2549 PHINode *CreatePHI(Type *Ty, unsigned NumReservedValues,
2550 const Twine &Name = "") {
2551 PHINode *Phi = PHINode::Create(Ty, NumReservedValues);
2552 if (isa<FPMathOperator>(Phi))
2553 setFPAttrs(Phi, nullptr /* MDNode* */, FMF);
2554 return Insert(Phi, Name);
2555 }
2556
2557private:
2558 CallInst *createCallHelper(Function *Callee, ArrayRef<Value *> Ops,
2559 const Twine &Name = "", FMFSource FMFSource = {},
2560 ArrayRef<OperandBundleDef> OpBundles = {});
2561
2562public:
2564 ArrayRef<Value *> Args = {}, const Twine &Name = "",
2565 MDNode *FPMathTag = nullptr) {
2566 CallInst *CI = CallInst::Create(FTy, Callee, Args, DefaultOperandBundles);
2567 if (IsFPConstrained)
2569 if (isa<FPMathOperator>(CI))
2570 setFPAttrs(CI, FPMathTag, FMF);
2571 return Insert(CI, Name);
2572 }
2573
2576 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2577 CallInst *CI = CallInst::Create(FTy, Callee, Args, OpBundles);
2578 if (IsFPConstrained)
2580 if (isa<FPMathOperator>(CI))
2581 setFPAttrs(CI, FPMathTag, FMF);
2582 return Insert(CI, Name);
2583 }
2584
2586 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2587 return CreateCall(Callee.getFunctionType(), Callee.getCallee(), Args, Name,
2588 FPMathTag);
2589 }
2590
2593 const Twine &Name = "", MDNode *FPMathTag = nullptr) {
2594 return CreateCall(Callee.getFunctionType(), Callee.getCallee(), Args,
2595 OpBundles, Name, FPMathTag);
2596 }
2597
2599 Function *Callee, ArrayRef<Value *> Args, const Twine &Name = "",
2600 std::optional<RoundingMode> Rounding = std::nullopt,
2601 std::optional<fp::ExceptionBehavior> Except = std::nullopt);
2602
2604 Value *False,
2606 const Twine &Name = "");
2607
2609 Value *False,
2612 const Twine &Name = "");
2613
2614 LLVM_ABI Value *CreateSelect(Value *C, Value *True, Value *False,
2615 const Twine &Name = "",
2616 Instruction *MDFrom = nullptr);
2617 LLVM_ABI Value *CreateSelectFMF(Value *C, Value *True, Value *False,
2618 FMFSource FMFSource, const Twine &Name = "",
2619 Instruction *MDFrom = nullptr);
2620
2621 VAArgInst *CreateVAArg(Value *List, Type *Ty, const Twine &Name = "") {
2622 return Insert(new VAArgInst(List, Ty), Name);
2623 }
2624
2626 const Twine &Name = "") {
2627 if (Value *V = Folder.FoldExtractElement(Vec, Idx))
2628 return V;
2629 return Insert(ExtractElementInst::Create(Vec, Idx), Name);
2630 }
2631
2633 const Twine &Name = "") {
2634 return CreateExtractElement(Vec, getInt64(Idx), Name);
2635 }
2636
2637 Value *CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx,
2638 const Twine &Name = "") {
2639 return CreateInsertElement(PoisonValue::get(VecTy), NewElt, Idx, Name);
2640 }
2641
2643 const Twine &Name = "") {
2644 return CreateInsertElement(PoisonValue::get(VecTy), NewElt, Idx, Name);
2645 }
2646
2648 const Twine &Name = "") {
2649 if (Value *V = Folder.FoldInsertElement(Vec, NewElt, Idx))
2650 return V;
2651 return Insert(InsertElementInst::Create(Vec, NewElt, Idx), Name);
2652 }
2653
2655 const Twine &Name = "") {
2656 return CreateInsertElement(Vec, NewElt, getInt64(Idx), Name);
2657 }
2658
2660 const Twine &Name = "") {
2661 SmallVector<int, 16> IntMask;
2663 return CreateShuffleVector(V1, V2, IntMask, Name);
2664 }
2665
2666 /// See class ShuffleVectorInst for a description of the mask representation.
2668 const Twine &Name = "") {
2669 if (Value *V = Folder.FoldShuffleVector(V1, V2, Mask))
2670 return V;
2671 return Insert(new ShuffleVectorInst(V1, V2, Mask), Name);
2672 }
2673
2674 /// Create a unary shuffle. The second vector operand of the IR instruction
2675 /// is poison.
2677 const Twine &Name = "") {
2678 return CreateShuffleVector(V, PoisonValue::get(V->getType()), Mask, Name);
2679 }
2680
2682 const Twine &Name = "");
2683
2685 const Twine &Name = "") {
2686 if (auto *V = Folder.FoldExtractValue(Agg, Idxs))
2687 return V;
2688 return Insert(ExtractValueInst::Create(Agg, Idxs), Name);
2689 }
2690
2692 const Twine &Name = "") {
2693 if (auto *V = Folder.FoldInsertValue(Agg, Val, Idxs))
2694 return V;
2695 return Insert(InsertValueInst::Create(Agg, Val, Idxs), Name);
2696 }
2697
2698 LandingPadInst *CreateLandingPad(Type *Ty, unsigned NumClauses,
2699 const Twine &Name = "") {
2700 return Insert(LandingPadInst::Create(Ty, NumClauses), Name);
2701 }
2702
2703 Value *CreateFreeze(Value *V, const Twine &Name = "") {
2704 return Insert(new FreezeInst(V), Name);
2705 }
2706
2707 //===--------------------------------------------------------------------===//
2708 // Utility creation methods
2709 //===--------------------------------------------------------------------===//
2710
2711 /// Return a boolean value testing if \p Arg == 0.
2712 Value *CreateIsNull(Value *Arg, const Twine &Name = "") {
2713 return CreateICmpEQ(Arg, Constant::getNullValue(Arg->getType()), Name);
2714 }
2715
2716 /// Return a boolean value testing if \p Arg != 0.
2717 Value *CreateIsNotNull(Value *Arg, const Twine &Name = "") {
2718 return CreateICmpNE(Arg, Constant::getNullValue(Arg->getType()), Name);
2719 }
2720
2721 /// Return a boolean value testing if \p Arg < 0.
2722 Value *CreateIsNeg(Value *Arg, const Twine &Name = "") {
2723 return CreateICmpSLT(Arg, ConstantInt::getNullValue(Arg->getType()), Name);
2724 }
2725
2726 /// Return a boolean value testing if \p Arg > -1.
2727 Value *CreateIsNotNeg(Value *Arg, const Twine &Name = "") {
2729 Name);
2730 }
2731
2732 /// Return the difference between two pointer values. The returned value
2733 /// type is the address type of the pointers.
2734 LLVM_ABI Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = "",
2735 bool IsNUW = false);
2736
2737 /// Return the difference between two pointer values, dividing out the size
2738 /// of the pointed-to objects. The returned value type is the address type
2739 /// of the pointers.
2740 ///
2741 /// This is intended to implement C-style pointer subtraction. As such, the
2742 /// pointers must be appropriately aligned for their element types and
2743 /// pointing into the same object.
2745 const Twine &Name = "");
2746
2747 /// Create a launder.invariant.group intrinsic call. If Ptr type is
2748 /// different from pointer to i8, it's casted to pointer to i8 in the same
2749 /// address space before call and casted back to Ptr type after call.
2751
2752 /// \brief Create a strip.invariant.group intrinsic call. If Ptr type is
2753 /// different from pointer to i8, it's casted to pointer to i8 in the same
2754 /// address space before call and casted back to Ptr type after call.
2756
2757 /// Return a vector value that contains the vector V reversed
2758 LLVM_ABI Value *CreateVectorReverse(Value *V, const Twine &Name = "");
2759
2760 /// Create a vector.splice.left intrinsic call, or a shufflevector that
2761 /// produces the same result if the result type is a fixed-length vector and
2762 /// \p Offset is a constant.
2764 const Twine &Name = "");
2765
2767 const Twine &Name = "") {
2768 return CreateVectorSpliceLeft(V1, V2, getInt32(Offset), Name);
2769 }
2770
2771 /// Create a vector.splice.right intrinsic call, or a shufflevector that
2772 /// produces the same result if the result type is a fixed-length vector and
2773 /// \p Offset is a constant.
2775 const Twine &Name = "");
2776
2778 const Twine &Name = "") {
2779 return CreateVectorSpliceRight(V1, V2, getInt32(Offset), Name);
2780 }
2781
2782 /// Return a vector value that contains \arg V broadcasted to \p
2783 /// NumElts elements.
2784 LLVM_ABI Value *CreateVectorSplat(unsigned NumElts, Value *V,
2785 const Twine &Name = "");
2786
2787 /// Return a vector value that contains \arg V broadcasted to \p
2788 /// EC elements.
2790 const Twine &Name = "");
2791
2793 unsigned Dimension,
2794 unsigned LastIndex,
2795 MDNode *DbgInfo);
2796
2798 unsigned FieldIndex,
2799 MDNode *DbgInfo);
2800
2802 unsigned Index,
2803 unsigned FieldIndex,
2804 MDNode *DbgInfo);
2805
2806 LLVM_ABI Value *createIsFPClass(Value *FPNum, unsigned Test);
2807
2808private:
2809 /// Helper function that creates an assume intrinsic call that
2810 /// represents an alignment assumption on the provided pointer \p PtrValue
2811 /// with offset \p OffsetValue and alignment value \p AlignValue.
2812 CallInst *CreateAlignmentAssumptionHelper(const DataLayout &DL,
2813 Value *PtrValue, Value *AlignValue,
2814 Value *OffsetValue);
2815
2816public:
2817 /// Create an assume intrinsic call that represents an alignment
2818 /// assumption on the provided pointer.
2819 ///
2820 /// An optional offset can be provided, and if it is provided, the offset
2821 /// must be subtracted from the provided pointer to get the pointer with the
2822 /// specified alignment.
2824 Value *PtrValue,
2825 uint64_t Alignment,
2826 Value *OffsetValue = nullptr);
2827
2828 /// Create an assume intrinsic call that represents an alignment
2829 /// assumption on the provided pointer.
2830 ///
2831 /// An optional offset can be provided, and if it is provided, the offset
2832 /// must be subtracted from the provided pointer to get the pointer with the
2833 /// specified alignment.
2834 ///
2835 /// This overload handles the condition where the Alignment is dependent
2836 /// on an existing value rather than a static value.
2838 Value *PtrValue,
2839 Value *Alignment,
2840 Value *OffsetValue = nullptr);
2841
2842 /// Create an assume intrinsic call that represents a dereferencable
2843 /// assumption on the provided pointer.
2845 Value *SizeValue);
2846
2847 /// Create an assume intrinsic call that represents a nonnull assumption on
2848 /// the provided pointer.
2850};
2851
2852/// This provides a uniform API for creating instructions and inserting
2853/// them into a basic block: either at the end of a BasicBlock, or at a specific
2854/// iterator location in a block.
2855///
2856/// Note that the builder does not expose the full generality of LLVM
2857/// instructions. For access to extra instruction properties, use the mutators
2858/// (e.g. setVolatile) on the instructions after they have been
2859/// created. Convenience state exists to specify fast-math flags and fp-math
2860/// tags.
2861///
2862/// The first template argument specifies a class to use for creating constants.
2863/// This defaults to creating minimally folded constants. The second template
2864/// argument allows clients to specify custom insertion hooks that are called on
2865/// every newly created insertion.
2866template <typename FolderTy = ConstantFolder,
2867 typename InserterTy = IRBuilderDefaultInserter>
2868class IRBuilder : public IRBuilderBase {
2869private:
2870 FolderTy Folder;
2871 InserterTy Inserter;
2872
2873public:
2874 IRBuilder(LLVMContext &C, FolderTy Folder, InserterTy Inserter,
2875 MDNode *FPMathTag = nullptr,
2876 ArrayRef<OperandBundleDef> OpBundles = {})
2877 : IRBuilderBase(C, this->Folder, this->Inserter, FPMathTag, OpBundles),
2879
2880 IRBuilder(LLVMContext &C, FolderTy Folder, MDNode *FPMathTag = nullptr,
2881 ArrayRef<OperandBundleDef> OpBundles = {})
2882 : IRBuilderBase(C, this->Folder, this->Inserter, FPMathTag, OpBundles),
2883 Folder(Folder) {}
2884
2885 explicit IRBuilder(LLVMContext &C, MDNode *FPMathTag = nullptr,
2886 ArrayRef<OperandBundleDef> OpBundles = {})
2887 : IRBuilderBase(C, this->Folder, this->Inserter, FPMathTag, OpBundles) {}
2888
2889 explicit IRBuilder(BasicBlock *TheBB, FolderTy Folder,
2890 MDNode *FPMathTag = nullptr,
2891 ArrayRef<OperandBundleDef> OpBundles = {})
2892 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter,
2893 FPMathTag, OpBundles),
2894 Folder(Folder) {
2895 SetInsertPoint(TheBB);
2896 }
2897
2898 explicit IRBuilder(BasicBlock *TheBB, MDNode *FPMathTag = nullptr,
2899 ArrayRef<OperandBundleDef> OpBundles = {})
2900 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter,
2901 FPMathTag, OpBundles) {
2902 SetInsertPoint(TheBB);
2903 }
2904
2905 explicit IRBuilder(Instruction *IP, MDNode *FPMathTag = nullptr,
2906 ArrayRef<OperandBundleDef> OpBundles = {})
2907 : IRBuilderBase(IP->getContext(), this->Folder, this->Inserter, FPMathTag,
2908 OpBundles) {
2909 SetInsertPoint(IP);
2910 }
2911
2912 IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, FolderTy Folder,
2913 MDNode *FPMathTag = nullptr,
2914 ArrayRef<OperandBundleDef> OpBundles = {})
2915 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter,
2916 FPMathTag, OpBundles),
2917 Folder(Folder) {
2918 SetInsertPoint(TheBB, IP);
2919 }
2920
2922 MDNode *FPMathTag = nullptr,
2923 ArrayRef<OperandBundleDef> OpBundles = {})
2924 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter,
2925 FPMathTag, OpBundles) {
2926 SetInsertPoint(TheBB, IP);
2927 }
2928
2929 /// Avoid copying the full IRBuilder. Prefer using InsertPointGuard
2930 /// or FastMathFlagGuard instead.
2931 IRBuilder(const IRBuilder &) = delete;
2932
2933 InserterTy &getInserter() { return Inserter; }
2934 const InserterTy &getInserter() const { return Inserter; }
2935};
2936
2937template <typename FolderTy, typename InserterTy>
2938IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *,
2941template <typename FolderTy>
2946template <typename FolderTy>
2951
2952
2953// Create wrappers for C Binding types (see CBindingWrapping.h).
2955
2956} // end namespace llvm
2957
2958#endif // LLVM_IR_IRBUILDER_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)
#define LLVM_ABI
Definition Compiler.h:213
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool isSigned(unsigned Opcode)
This file contains the declarations of entities that describe floating point environment and related ...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
static const char PassName[]
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
Value handle that asserts if the Value is deleted.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
BinOp
This enumeration lists the possible modifications atomicrmw can make.
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:474
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateDisjoint(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:459
Class to represent byte types.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void addRetAttr(Attribute::AttrKind Kind)
Adds the attribute to the return value.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI CastInst * CreatePointerBitCastOrAddrSpaceCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast or an AddrSpaceCast cast instruction.
static LLVM_ABI CastInst * CreatePointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
bool isFPPredicate() const
Definition InstrTypes.h:845
static LLVM_ABI StringRef getPredicateName(Predicate P)
Conditional Branch instruction.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
A debug info location.
Definition DebugLoc.h:124
static ExtractElementInst * Create(Value *Vec, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This provides a helper for copying FMF from an instruction or setting specified flags.
Definition IRBuilder.h:93
FMFSource(Instruction *Source)
Definition IRBuilder.h:98
FMFSource()=default
FastMathFlags get(FastMathFlags Default) const
Definition IRBuilder.h:103
FMFSource(FastMathFlags FMF)
Definition IRBuilder.h:102
static FMFSource intersect(Value *A, Value *B)
Intersect the FMF from two instructions.
Definition IRBuilder.h:107
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
An instruction for ordering other memory operations.
This class represents a freeze function that returns random concrete value if an operand is either a ...
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Class to represent function types.
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags none()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
FastMathFlagGuard(const FastMathFlagGuard &)=delete
FastMathFlagGuard & operator=(const FastMathFlagGuard &)=delete
InsertPointGuard & operator=(const InsertPointGuard &)=delete
InsertPointGuard(const InsertPointGuard &)=delete
InsertPoint - A saved insertion point.
Definition IRBuilder.h:298
InsertPoint(BasicBlock *InsertBlock, BasicBlock::iterator InsertPoint)
Creates a new insertion point at the given location.
Definition IRBuilder.h:307
BasicBlock * getBlock() const
Definition IRBuilder.h:313
InsertPoint()=default
Creates a new insertion point which doesn't point to anything.
bool isSet() const
Returns true if this insert point is set.
Definition IRBuilder.h:311
BasicBlock::iterator getPoint() const
Definition IRBuilder.h:314
OperandBundlesGuard(const OperandBundlesGuard &)=delete
OperandBundlesGuard & operator=(const OperandBundlesGuard &)=delete
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1517
Value * CreateZExtOrBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2262
Value * CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2449
Value * CreateLdexp(Value *Src, Value *Exp, FMFSource FMFSource={}, const Twine &Name="")
Create call to the ldexp intrinsic.
Definition IRBuilder.h:1107
void SetCurrentDebugLocation(DebugLoc &&L)
Set location information used by debugging information.
Definition IRBuilder.h:254
ConstantInt * getInt1(bool V)
Get a constant value representing either true or false.
Definition IRBuilder.h:504
Value * CreateFCmpS(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2528
BasicBlock * BB
Definition IRBuilder.h:146
Value * CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1491
CleanupPadInst * CreateCleanupPad(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &Name="")
Definition IRBuilder.h:1370
LLVM_ABI CallInst * CreateMulReduce(Value *Src)
Create a vector int mul reduction intrinsic of the source vector.
Value * CreateFSubFMF(Value *L, Value *R, FMFSource FMFSource, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1682
LLVM_ABI CallInst * CreateFAddReduce(Value *Acc, Value *Src)
Create a sequential vector fadd reduction intrinsic of the source vector.
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2400
Value * CreateFPTruncFMF(Value *V, Type *DestTy, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2215
Value * CreateConstGEP1_64(Type *Ty, Value *Ptr, uint64_t Idx0, const Twine &Name="")
Definition IRBuilder.h:2064
RoundingMode DefaultConstrainedRounding
Definition IRBuilder.h:157
LLVM_ABI Value * CreateLaunderInvariantGroup(Value *Ptr)
Create a launder.invariant.group intrinsic call.
CallInst * CreateExtractVector(Type *DstType, Value *SrcVec, Value *Idx, const Twine &Name="")
Create a call to the vector.extract intrinsic.
Definition IRBuilder.h:1135
LLVM_ABI Value * CreateSelectFMFWithUnknownProfile(Value *C, Value *True, Value *False, FMFSource FMFSource, StringRef PassName, const Twine &Name="")
Value * CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2474
CallInst * CreateStructuredAlloca(Type *BaseType, const Twine &Name="")
Definition IRBuilder.h:1916
Value * CreateInsertElement(Type *VecTy, Value *NewElt, uint64_t Idx, const Twine &Name="")
Definition IRBuilder.h:2642
Value * CreateSRem(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1527
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const Twine &Name="")
Definition IRBuilder.h:1950
Value * CreateFSub(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1677
Value * CreateFCmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2504
CatchPadInst * CreateCatchPad(Value *ParentPad, ArrayRef< Value * > Args, const Twine &Name="")
Definition IRBuilder.h:1365
LLVM_ABI CallInst * CreateConstrainedFPUnroundedBinOp(Intrinsic::ID ID, Value *L, Value *R, FMFSource FMFSource={}, const Twine &Name="", MDNode *FPMathTag=nullptr, std::optional< fp::ExceptionBehavior > Except=std::nullopt)
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
Definition IRBuilder.h:2637
void SetNoSanitizeMetadata()
Set nosanitize metadata.
Definition IRBuilder.h:261
Value * CreateVectorSpliceLeft(Value *V1, Value *V2, uint32_t Offset, const Twine &Name="")
Definition IRBuilder.h:2766
Value * CreateLShr(Value *LHS, uint64_t RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1568
AtomicCmpXchgInst * CreateAtomicCmpXchg(Value *Ptr, Value *Cmp, Value *New, MaybeAlign Align, AtomicOrdering SuccessOrdering, AtomicOrdering FailureOrdering, SyncScope::ID SSID=SyncScope::System)
Definition IRBuilder.h:1979
LLVM_ABI CallInst * CreateThreadLocalAddress(Value *Ptr)
Create a call to llvm.threadlocal.address intrinsic.
Value * CreateConstGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0, const Twine &Name="")
Definition IRBuilder.h:2033
AllocaInst * CreateAlloca(Type *Ty, unsigned AddrSpace, Value *ArraySize=nullptr, const Twine &Name="")
Definition IRBuilder.h:1901
void setDefaultOperandBundles(ArrayRef< OperandBundleDef > OpBundles)
Definition IRBuilder.h:406
CallInst * CreateStackSave(const Twine &Name="")
Create a call to llvm.stacksave.
Definition IRBuilder.h:1163
InvokeInst * CreateInvoke(FunctionCallee Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="")
Definition IRBuilder.h:1298
IntegerType * getInt1Ty()
Fetch the type representing a single bit.
Definition IRBuilder.h:571
LLVM_ABI CallInst * CreateMaskedCompressStore(Value *Val, Value *Ptr, MaybeAlign Align, Value *Mask=nullptr)
Create a call to Masked Compress Store intrinsic.
Value * CreateInsertValue(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition IRBuilder.h:2691
Value * CreateAnd(ArrayRef< Value * > Ops)
Definition IRBuilder.h:1606
IndirectBrInst * CreateIndirectBr(Value *Addr, unsigned NumDests=10)
Create an indirect branch instruction with the specified address operand, with an optional hint for t...
Definition IRBuilder.h:1271
Value * CreateAnd(Value *LHS, const APInt &RHS, const Twine &Name="")
Definition IRBuilder.h:1598
void setDefaultFPMathTag(MDNode *FPMathTag)
Set the floating point math metadata to be used.
Definition IRBuilder.h:349
LLVM_ABI Value * CreateAllocationSize(Type *DestTy, AllocaInst *AI)
Get allocation size of an alloca as a runtime Value* (handles both static and dynamic allocas and vsc...
LLVM_ABI Type * getCurrentFunctionReturnType() const
Get the return type of the current function that we're emitting into.
Definition IRBuilder.cpp:60
ByteType * getByteNTy(unsigned N)
Fetch the type representing an N-bit byte.
Definition IRBuilder.h:568
CallInst * CreateCall(FunctionCallee Callee, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2591
LLVM_ABI CallInst * CreateGCGetPointerBase(Value *DerivedPtr, const Twine &Name="")
Create a call to the experimental.gc.pointer.base intrinsic to get the base pointer for the specified...
Value * CreateFDiv(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1715
LLVM_ABI CallInst * CreateLifetimeStart(Value *Ptr)
Create a lifetime.start intrinsic.
CallInst * CreateInsertVector(Type *DstType, Value *SrcVec, Value *SubVec, Value *Idx, const Twine &Name="")
Create a call to the vector.insert intrinsic.
Definition IRBuilder.h:1149
Value * CreateLShr(Value *LHS, const APInt &RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1563
void clearFastMathFlags()
Clear the fast-math flags.
Definition IRBuilder.h:346
LLVM_ABI CallInst * CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes, FunctionCallee ActualCallee, ArrayRef< Value * > CallArgs, std::optional< ArrayRef< Value * > > DeoptArgs, ArrayRef< Value * > GCArgs, const Twine &Name="")
Create a call to the experimental.gc.statepoint intrinsic to start a new statepoint sequence.
LLVM_ABI CallInst * CreateNonnullAssumption(Value *PtrValue)
Create an assume intrinsic call that represents a nonnull assumption on the provided pointer.
LoadInst * CreateLoad(Type *Ty, Value *Ptr, bool isVolatile, const Twine &Name="")
Definition IRBuilder.h:1936
Value * CreateLogicalOr(ArrayRef< Value * > Ops)
Definition IRBuilder.h:1822
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Definition IRBuilder.h:2625
IntegerType * getIntNTy(unsigned N)
Fetch the type representing an N-bit integer.
Definition IRBuilder.h:599
void setDefaultConstrainedExcept(fp::ExceptionBehavior NewExcept)
Set the exception handling to be used with constrained floating point.
Definition IRBuilder.h:364
Value * CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2408
LLVM_ABI Value * CreateVectorSpliceRight(Value *V1, Value *V2, Value *Offset, const Twine &Name="")
Create a vector.splice.right intrinsic call, or a shufflevector that produces the same result if the ...
LLVM_ABI CallInst * CreateLifetimeEnd(Value *Ptr)
Create a lifetime.end intrinsic.
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const char *Name)
Definition IRBuilder.h:1945
Value * CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2454
Type * getDoubleTy()
Fetch the type representing a 64-bit floating point value.
Definition IRBuilder.h:619
Value * CreateNoWrapBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, bool IsNUW, bool IsNSW, const Twine &Name="")
Definition IRBuilder.h:1770
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
Definition IRBuilder.h:2148
CallInst * CreateMemCpy(Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, uint64_t Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert a memcpy between the specified pointers.
Definition IRBuilder.h:717
CondBrInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
Definition IRBuilder.h:1238
Value * CreateFAdd(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1658
UnreachableInst * CreateUnreachable()
Definition IRBuilder.h:1380
LLVM_ABI CallInst * CreateConstrainedFPCmp(Intrinsic::ID ID, CmpInst::Predicate P, Value *L, Value *R, const Twine &Name="", std::optional< fp::ExceptionBehavior > Except=std::nullopt)
LLVM_ABI Value * CreateSelectFMF(Value *C, Value *True, Value *False, FMFSource FMFSource, const Twine &Name="", Instruction *MDFrom=nullptr)
LLVM_ABI CallInst * CreateAndReduce(Value *Src)
Create a vector int AND reduction intrinsic of the source vector.
Value * CreateFPTrunc(Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2210
Value * CreatePointerCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2299
void setDefaultConstrainedRounding(RoundingMode NewRounding)
Set the rounding mode handling to be used with constrained floating point.
Definition IRBuilder.h:374
Value * CreatePtrToAddr(Value *V, const Twine &Name="")
Definition IRBuilder.h:2238
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Value * CreateFRem(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1734
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition IRBuilder.h:2684
Value * CreateAnd(Value *LHS, uint64_t RHS, const Twine &Name="")
Definition IRBuilder.h:1602
ConstantInt * getTrue()
Get the constant value for i1 true.
Definition IRBuilder.h:509
Value * Insert(Value *V, const Twine &Name="") const
Definition IRBuilder.h:183
LandingPadInst * CreateLandingPad(Type *Ty, unsigned NumClauses, const Twine &Name="")
Definition IRBuilder.h:2698
Value * CreateFPExtFMF(Value *V, Type *DestTy, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2230
LLVM_ABI CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={})
Create a call to intrinsic ID with Args, mangled using OverloadTypes.
Value * CreateMaximum(Value *LHS, Value *RHS, const Twine &Name="")
Create call to the maximum intrinsic.
Definition IRBuilder.h:1083
LLVM_ABI Value * CreatePreserveStructAccessIndex(Type *ElTy, Value *Base, unsigned Index, unsigned FieldIndex, MDNode *DbgInfo)
LLVM_ABI CallInst * CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment, Value *Mask, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Load intrinsic.
Value * CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2412
LLVM_ABI CallInst * CreateConstrainedFPCall(Function *Callee, ArrayRef< Value * > Args, const Twine &Name="", std::optional< RoundingMode > Rounding=std::nullopt, std::optional< fp::ExceptionBehavior > Except=std::nullopt)
LLVMContext & Context
Definition IRBuilder.h:148
LLVM_ABI Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
InvokeInst * CreateInvoke(FunctionType *Ty, Value *Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="")
Create an invoke instruction.
Definition IRBuilder.h:1276
RoundingMode getDefaultConstrainedRounding()
Get the rounding mode handling used with constrained floating point.
Definition IRBuilder.h:389
Value * CreateFPToUI(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2176
Value * CreateVectorSpliceRight(Value *V1, Value *V2, uint32_t Offset, const Twine &Name="")
Definition IRBuilder.h:2777
Value * CreateConstGEP2_64(Type *Ty, Value *Ptr, uint64_t Idx0, uint64_t Idx1, const Twine &Name="")
Definition IRBuilder.h:2076
Value * CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2489
BasicBlock::iterator GetInsertPoint() const
Definition IRBuilder.h:202
Value * CreateStructGEP(Type *Ty, Value *Ptr, unsigned Idx, const Twine &Name="")
Definition IRBuilder.h:2094
FenceInst * CreateFence(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System, const Twine &Name="")
Definition IRBuilder.h:1972
IntegerType * getIndexTy(const DataLayout &DL, unsigned AddrSpace)
Fetch the type of an integer that should be used to index GEP operations within AddressSpace.
Definition IRBuilder.h:647
CallBrInst * CreateCallBr(FunctionCallee Callee, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="")
Definition IRBuilder.h:1340
LLVM_ABI CallInst * CreateGCGetPointerOffset(Value *DerivedPtr, const Twine &Name="")
Create a call to the experimental.gc.get.pointer.offset intrinsic to get the offset of the specified ...
fp::ExceptionBehavior getDefaultConstrainedExcept()
Get the exception handling used with constrained floating point.
Definition IRBuilder.h:384
Value * CreateSExt(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2142
Value * CreateSExtOrBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2270
Value * CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2469
Value * CreateIntToPtr(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2247
LLVM_ABI CallInst * CreateAddReduce(Value *Src)
Create a vector int add reduction intrinsic of the source vector.
Value * CreateFreeze(Value *V, const Twine &Name="")
Definition IRBuilder.h:2703
void SetCurrentDebugLocation(const DebugLoc &L)
Set location information used by debugging information.
Definition IRBuilder.h:247
BasicBlock::iterator InsertPt
Definition IRBuilder.h:147
ReturnInst * CreateAggregateRet(ArrayRef< Value * > RetVals)
Create a sequence of N insertvalue instructions, with one Value from the RetVals array each,...
Definition IRBuilder.h:1224
CallBrInst * CreateCallBr(FunctionType *Ty, Value *Callee, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args={}, const Twine &Name="")
Create a callbr instruction.
Definition IRBuilder.h:1314
LLVM_ABI CallInst * CreateConstrainedFPBinOp(Intrinsic::ID ID, Value *L, Value *R, FMFSource FMFSource={}, const Twine &Name="", MDNode *FPMathTag=nullptr, std::optional< RoundingMode > Rounding=std::nullopt, std::optional< fp::ExceptionBehavior > Except=std::nullopt)
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1554
IntegerType * getIntPtrTy(const DataLayout &DL, unsigned AddrSpace=0)
Fetch the type of an integer with size at least as big as that of a pointer in the given address spac...
Definition IRBuilder.h:641
IntegerType * getInt32Ty()
Fetch the type representing a 32-bit integer.
Definition IRBuilder.h:586
Value * CreateConstInBoundsGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0, const Twine &Name="")
Definition IRBuilder.h:2039
LLVM_ABI Value * CreateAggregateCast(Value *V, Type *DestTy)
Cast between aggregate types that must have identical structure but may differ in their leaf types.
Definition IRBuilder.cpp:73
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="")
Create a call to non-overloaded intrinsic ID with Args.
Definition IRBuilder.h:1042
ConstantInt * getInt8(uint8_t C)
Get a constant 8-bit value.
Definition IRBuilder.h:519
Value * CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Definition IRBuilder.h:2101
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr, FMFSource FMFSource={})
Definition IRBuilder.h:2286
Value * CreateIsNotNeg(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg > -1.
Definition IRBuilder.h:2727
CatchReturnInst * CreateCatchRet(CatchPadInst *CatchPad, BasicBlock *BB)
Definition IRBuilder.h:1376
CleanupReturnInst * CreateCleanupRet(CleanupPadInst *CleanupPad, BasicBlock *UnwindBB=nullptr)
Definition IRBuilder.h:1353
ReturnInst * CreateRet(Value *V)
Create a 'ret <val>' instruction.
Definition IRBuilder.h:1214
LLVM_ABI CallInst * CreateAssumption(Value *Cond)
Create an assume intrinsic call that allows the optimizer to assume that the provided condition will ...
Value * CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1453
bool getIsFPConstrained()
Query for the use of constrained floating point math.
Definition IRBuilder.h:361
Value * CreateUIToFP(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false, MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2190
Value * CreateVScale(Type *Ty, const Twine &Name="")
Create a call to llvm.vscale.<Ty>().
Definition IRBuilder.h:988
Value * CreateAShr(Value *LHS, uint64_t RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1587
BasicBlock * GetInsertBlock() const
Definition IRBuilder.h:201
Type * getHalfTy()
Fetch the type representing a 16-bit floating point value.
Definition IRBuilder.h:604
void setFastMathFlags(FastMathFlags NewFMF)
Set the fast-math flags to be used with generated fp-math operators.
Definition IRBuilder.h:352
Value * CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2439
void SetInsertPointPastAllocas(Function *F)
This specifies that created instructions should inserted at the beginning end of the specified functi...
Definition IRBuilder.h:241
IntegerType * getInt64Ty()
Fetch the type representing a 64-bit integer.
Definition IRBuilder.h:591
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
Definition IRBuilder.h:2028
Value * CreateNSWMul(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1487
InsertPoint saveAndClearIP()
Returns the current insert point, clearing it in the process.
Definition IRBuilder.h:323
Value * CreateOr(Value *LHS, const APInt &RHS, const Twine &Name="")
Definition IRBuilder.h:1624
LLVM_ABI CallInst * CreateElementUnorderedAtomicMemMove(Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size, uint32_t ElementSize, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert an element unordered-atomic memmove between the specified pointers.
Value * CreatePointerBitCastOrAddrSpaceCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2311
LLVM_ABI Value * CreateVectorReverse(Value *V, const Twine &Name="")
Return a vector value that contains the vector V reversed.
Value * CreateShuffleVector(Value *V, ArrayRef< int > Mask, const Twine &Name="")
Create a unary shuffle.
Definition IRBuilder.h:2676
LLVM_ABI CallInst * CreateXorReduce(Value *Src)
Create a vector int XOR reduction intrinsic of the source vector.
Value * CreateAShr(Value *LHS, const APInt &RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1582
Value * CreateUDiv(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1495
Value * CreateFAbs(Value *V, FMFSource FMFSource={}, const Twine &Name="")
Create call to the fabs intrinsic.
Definition IRBuilder.h:1048
Value * CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2484
FastMathFlags FMF
Definition IRBuilder.h:153
LLVM_ABI Value * CreateBitPreservingCastChain(const DataLayout &DL, Value *V, Type *NewTy)
Create a chain of casts to convert V to NewTy, preserving the bit pattern of V.
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2388
Value * CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1457
IntegerType * getInt16Ty()
Fetch the type representing a 16-bit integer.
Definition IRBuilder.h:581
Value * CreateFCmpFMF(CmpInst::Predicate P, Value *LHS, Value *RHS, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2512
Value * CreateGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Definition IRBuilder.h:2020
ConstantInt * getInt64(uint64_t C)
Get a constant 64-bit value.
Definition IRBuilder.h:534
CallInst * CreateMemMove(Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, uint64_t Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Definition IRBuilder.h:759
CatchSwitchInst * CreateCatchSwitch(Value *ParentPad, BasicBlock *UnwindBB, unsigned NumHandlers, const Twine &Name="")
Definition IRBuilder.h:1358
LLVM_ABI Value * CreateVectorSpliceLeft(Value *V1, Value *V2, Value *Offset, const Twine &Name="")
Create a vector.splice.left intrinsic call, or a shufflevector that produces the same result if the r...
Value * getAllOnesMask(ElementCount NumElts)
Return an all true boolean vector (mask) with NumElts lanes.
Definition IRBuilder.h:892
Value * CreateUnOp(Instruction::UnaryOps Opc, Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1880
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition IRBuilder.h:1852
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const Twine &Name="")
Definition IRBuilder.h:1932
LLVM_ABI CallInst * CreateOrReduce(Value *Src)
Create a vector int OR reduction intrinsic of the source vector.
UncondBrInst * CreateBr(BasicBlock *Dest)
Create an unconditional 'br label X' instruction.
Definition IRBuilder.h:1232
LLVM_ABI CallInst * CreateMalloc(Type *IntPtrTy, Type *AllocTy, Value *AllocSize, Value *ArraySize, ArrayRef< OperandBundleDef > OpB, Function *MallocF=nullptr, const Twine &Name="")
InsertPoint saveIP() const
Returns the current insert point.
Definition IRBuilder.h:318
void CollectMetadataToCopy(Instruction *Src, ArrayRef< unsigned > MetadataKinds)
Collect metadata with IDs MetadataKinds from Src which should be added to all created instructions.
Definition IRBuilder.h:269
Value * CreateLogicalAnd(Value *Cond1, Value *Cond2, const Twine &Name="", Instruction *MDFrom=nullptr)
Definition IRBuilder.h:1792
LLVM_ABI CallInst * CreateFPMinReduce(Value *Src)
Create a vector float min reduction intrinsic of the source vector.
void SetInsertPoint(BasicBlock::iterator IP)
This specifies that created instructions should be inserted at the specified point,...
Definition IRBuilder.h:232
LLVM_ABI CallInst * CreateFPMaximumReduce(Value *Src)
Create a vector float maximum reduction intrinsic of the source vector.
Value * CreateInsertElement(Value *Vec, Value *NewElt, uint64_t Idx, const Twine &Name="")
Definition IRBuilder.h:2654
Value * CreateShl(Value *LHS, uint64_t RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1548
LLVM_ABI Value * CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 2 operands which is mangled on the first type.
Value * CreateShuffleVector(Value *V1, Value *V2, ArrayRef< int > Mask, const Twine &Name="")
See class ShuffleVectorInst for a description of the mask representation.
Definition IRBuilder.h:2667
LLVM_ABI Value * createIsFPClass(Value *FPNum, unsigned Test)
Value * CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2444
LLVM_ABI CallInst * CreateFPMaxReduce(Value *Src)
Create a vector float max reduction intrinsic of the source vector.
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition IRBuilder.h:529
LLVM_ABI CallInst * CreateFree(Value *Source, ArrayRef< OperandBundleDef > Bundles={})
Generate the IR for a call to the builtin free function.
Value * CreateMaxNum(Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create call to the maxnum intrinsic.
Definition IRBuilder.h:1066
Value * CreateBitOrPointerCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2334
Value * CreateCmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2518
Value * CreateLogicalOp(Instruction::BinaryOps Opc, Value *Cond1, Value *Cond2, const Twine &Name="", Instruction *MDFrom=nullptr)
Definition IRBuilder.h:1807
const IRBuilderDefaultInserter & Inserter
Definition IRBuilder.h:150
Value * CreateFPCast(Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2346
Value * CreateICmpSLE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2420
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition IRBuilder.h:2549
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2574
CondBrInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, Instruction *MDSrc)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
Definition IRBuilder.h:1247
Value * CreateNot(Value *V, const Twine &Name="")
Definition IRBuilder.h:1876
SwitchInst * CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases=10, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a switch instruction with the specified value, default dest, and with a hint for the number of...
Definition IRBuilder.h:1261
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2384
InstTy * Insert(InstTy *I, const Twine &Name="") const
Insert and return the specified instruction.
Definition IRBuilder.h:172
Value * CreateBinOpFMF(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1759
Value * CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2464
void setIsFPConstrained(bool IsCon)
Enable/Disable use of constrained floating point math.
Definition IRBuilder.h:358
LLVM_ABI DebugLoc getCurrentDebugLocation() const
Get location information used by debugging information.
Definition IRBuilder.cpp:65
Value * CreateMinimum(Value *LHS, Value *RHS, const Twine &Name="")
Create call to the minimum intrinsic.
Definition IRBuilder.h:1078
IntegerType * getInt128Ty()
Fetch the type representing a 128-bit integer.
Definition IRBuilder.h:596
Value * CreateCountTrailingZeroElems(Type *ResTy, Value *Mask, bool ZeroIsPoison=true, const Twine &Name="")
Create a call to llvm.experimental_cttz_elts.
Definition IRBuilder.h:1176
Value * CreateIsNeg(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg < 0.
Definition IRBuilder.h:2722
Constant * Insert(Constant *C, const Twine &="") const
No-op overload to handle constants.
Definition IRBuilder.h:179
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1461
Value * CreateFMA(Value *Factor1, Value *Factor2, Value *Summand, FMFSource FMFSource={}, const Twine &Name="")
Create call to the fma intrinsic.
Definition IRBuilder.h:1115
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2252
ByteType * getByte128Ty()
Fetch the type representing a 128-bit byte.
Definition IRBuilder.h:565
ConstantInt * getIntN(unsigned N, uint64_t C)
Get a constant N-bit value, zero extended from a 64-bit value.
Definition IRBuilder.h:539
Value * CreateDisjointOr(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1640
IRBuilderBase(LLVMContext &context, const IRBuilderFolder &Folder, const IRBuilderDefaultInserter &Inserter, MDNode *FPMathTag, ArrayRef< OperandBundleDef > OpBundles)
Definition IRBuilder.h:162
void AddMetadataToInst(Instruction *I) const
Add all entries in MetadataToCopy to I.
Definition IRBuilder.h:287
ByteType * getByte16Ty()
Fetch the type representing a 16-bit byte.
Definition IRBuilder.h:556
Value * CreateCopySign(Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create call to the copysign intrinsic.
Definition IRBuilder.h:1100
LLVM_ABI Value * CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name="", bool IsNUW=false)
Return the difference between two pointer values.
Value * CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2392
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
Definition IRBuilder.h:1928
CallInst * CreateElementUnorderedAtomicMemSet(Value *Ptr, Value *Val, uint64_t Size, Align Alignment, uint32_t ElementSize, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert an element unordered-atomic memset of the region of memory starting at the given po...
Definition IRBuilder.h:681
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1533
FastMathFlags getFastMathFlags() const
Get the flags to be applied to created floating point ops.
Definition IRBuilder.h:341
CallInst * CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, MaybeAlign Align, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert a memset to the specified pointer and the specified value.
Definition IRBuilder.h:660
LLVM_ABI Value * CreateNAryOp(unsigned Opc, ArrayRef< Value * > Ops, const Twine &Name="", MDNode *FPMathTag=nullptr)
Create either a UnaryOperator or BinaryOperator depending on Opc.
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition IRBuilder.h:2130
LLVM_ABI CallInst * CreateConstrainedFPIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, FMFSource FMFSource, const Twine &Name, MDNode *FPMathTag=nullptr, std::optional< RoundingMode > Rounding=std::nullopt, std::optional< fp::ExceptionBehavior > Except=std::nullopt)
This function is like CreateIntrinsic for constrained fp intrinsics.
Value * CreateShuffleVector(Value *V1, Value *V2, Value *Mask, const Twine &Name="")
Definition IRBuilder.h:2659
LLVMContext & getContext() const
Definition IRBuilder.h:203
Value * CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2424
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1592
FastMathFlags & getFastMathFlags()
Definition IRBuilder.h:343
ReturnInst * CreateRetVoid()
Create a 'ret void' instruction.
Definition IRBuilder.h:1209
ByteType * getByte32Ty()
Fetch the type representing a 32-bit byte.
Definition IRBuilder.h:559
Value * CreateMaximumNum(Value *LHS, Value *RHS, const Twine &Name="")
Create call to the maximum intrinsic.
Definition IRBuilder.h:1094
Value * CreateNSWSub(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1470
Value * CreateConstInBoundsGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1, const Twine &Name="")
Definition IRBuilder.h:2055
Value * CreateConstInBoundsGEP2_64(Type *Ty, Value *Ptr, uint64_t Idx0, uint64_t Idx1, const Twine &Name="")
Definition IRBuilder.h:2085
Value * CreateMinNum(Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create call to the minnum intrinsic.
Definition IRBuilder.h:1054
InvokeInst * CreateInvoke(FunctionCallee Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value * > Args={}, const Twine &Name="")
Definition IRBuilder.h:1306
CallInst * CreateExtractVector(Type *DstType, Value *SrcVec, uint64_t Idx, const Twine &Name="")
Create a call to the vector.extract intrinsic.
Definition IRBuilder.h:1143
LLVM_ABI Value * CreatePreserveUnionAccessIndex(Value *Base, unsigned FieldIndex, MDNode *DbgInfo)
StoreInst * CreateStore(Value *Val, Value *Ptr, bool isVolatile=false)
Definition IRBuilder.h:1941
LLVM_ABI CallInst * CreateIntMaxReduce(Value *Src, bool IsSigned=false)
Create a vector integer max reduction intrinsic of the source vector.
LLVM_ABI Value * CreateSelectWithUnknownProfile(Value *C, Value *True, Value *False, StringRef PassName, const Twine &Name="")
LLVM_ABI CallInst * CreateMaskedStore(Value *Val, Value *Ptr, Align Alignment, Value *Mask)
Create a call to Masked Store intrinsic.
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1444
Value * CreateExactBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, bool IsExact, const Twine &Name="")
Definition IRBuilder.h:1782
Value * CreatePtrToInt(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2242
Value * CreateSDiv(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1508
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition IRBuilder.h:514
VAArgInst * CreateVAArg(Value *List, Type *Ty, const Twine &Name="")
Definition IRBuilder.h:2621
Value * CreateExactUDiv(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1504
Type * getFloatTy()
Fetch the type representing a 32-bit floating point value.
Definition IRBuilder.h:614
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
Definition IRBuilder.h:2717
void SetInsertPoint(BasicBlock *TheBB, BasicBlock::iterator IP)
This specifies that created instructions should be inserted at the specified point.
Definition IRBuilder.h:223
Instruction * CreateNoAliasScopeDeclaration(MDNode *ScopeTag)
Definition IRBuilder.h:907
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2563
Value * CreateShl(Value *LHS, const APInt &RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1542
ByteType * getBytePtrTy(const DataLayout &DL, unsigned AddrSpace=0)
Fetch the type of a byte with size at least as big as that of a pointer in the given address space.
Definition IRBuilder.h:635
LLVM_ABI CallInst * CreateGCResult(Instruction *Statepoint, Type *ResultType, const Twine &Name="")
Create a call to the experimental.gc.result intrinsic to extract the result from a call wrapped in a ...
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition IRBuilder.h:2116
PointerType * getPtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer.
Definition IRBuilder.h:629
LLVM_ABI CallInst * CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue, uint64_t Alignment, Value *OffsetValue=nullptr)
Create an assume intrinsic call that represents an alignment assumption on the provided pointer.
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1753
Value * CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx, const Twine &Name="")
Definition IRBuilder.h:2647
CallInst * CreateStructuredGEP(Type *BaseType, Value *PtrBase, ArrayRef< Value * > Indices, const Twine &Name="")
Definition IRBuilder.h:2006
Value * CreateConstInBoundsGEP1_64(Type *Ty, Value *Ptr, uint64_t Idx0, const Twine &Name="")
Definition IRBuilder.h:2070
fp::ExceptionBehavior DefaultConstrainedExcept
Definition IRBuilder.h:156
void ClearInsertionPoint()
Clear the insertion point: created instructions will not be inserted into a block.
Definition IRBuilder.h:196
CallBrInst * CreateCallBr(FunctionCallee Callee, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args={}, const Twine &Name="")
Definition IRBuilder.h:1333
ByteType * getByte8Ty()
Fetch the type representing an 8-bit byte.
Definition IRBuilder.h:553
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2416
ConstantInt * getInt16(uint16_t C)
Get a constant 16-bit value.
Definition IRBuilder.h:524
MDNode * DefaultFPMathTag
Definition IRBuilder.h:152
LLVM_ABI Value * CreateTypeSize(Type *Ty, TypeSize Size)
Create an expression which evaluates to the number of units in Size at runtime.
ArrayRef< OperandBundleDef > DefaultOperandBundles
Definition IRBuilder.h:159
CallBrInst * CreateCallBr(FunctionType *Ty, Value *Callee, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="")
Definition IRBuilder.h:1322
LLVM_ABI CallInst * CreateDereferenceableAssumption(Value *PtrValue, Value *SizeValue)
Create an assume intrinsic call that represents a dereferencable assumption on the provided pointer.
Value * CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2396
MDNode * getDefaultFPMathTag() const
Get the floating point math metadata being used.
Definition IRBuilder.h:338
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition IRBuilder.h:2325
Value * CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2459
void restoreIP(InsertPoint IP)
Sets the current insert point to a previously-saved location.
Definition IRBuilder.h:330
Value * CreateIsNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg == 0.
Definition IRBuilder.h:2712
CallInst * CreateMemCpy(Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, Value *Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Definition IRBuilder.h:731
Value * CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2429
CallInst * CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, Value *Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Definition IRBuilder.h:739
CallInst * CreateStackRestore(Value *Ptr, const Twine &Name="")
Create a call to llvm.stackrestore.
Definition IRBuilder.h:1170
LLVM_ABI CallInst * CreateIntMinReduce(Value *Src, bool IsSigned=false)
Create a vector integer min reduction intrinsic of the source vector.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
Type * getVoidTy()
Fetch the type representing void.
Definition IRBuilder.h:624
InvokeInst * CreateInvoke(FunctionType *Ty, Value *Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value * > Args={}, const Twine &Name="")
Definition IRBuilder.h:1287
CallInst * CreateInsertVector(Type *DstType, Value *SrcVec, Value *SubVec, uint64_t Idx, const Twine &Name="")
Create a call to the vector.extract intrinsic.
Definition IRBuilder.h:1157
LLVM_ABI CallInst * CreateElementUnorderedAtomicMemCpy(Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size, uint32_t ElementSize, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert an element unordered-atomic memcpy between the specified pointers.
Value * CreateOr(ArrayRef< Value * > Ops)
Definition IRBuilder.h:1632
Value * CreateFAddFMF(Value *L, Value *R, FMFSource FMFSource, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1663
Value * CreateLogicalOr(Value *Cond1, Value *Cond2, const Twine &Name="", Instruction *MDFrom=nullptr)
Definition IRBuilder.h:1800
AllocaInst * CreateAlloca(Type *Ty, Value *ArraySize=nullptr, const Twine &Name="")
Definition IRBuilder.h:1908
Value * CreateConstGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1, const Twine &Name="", GEPNoWrapFlags NWFlags=GEPNoWrapFlags::none())
Definition IRBuilder.h:2045
Value * CreateExtractElement(Value *Vec, uint64_t Idx, const Twine &Name="")
Definition IRBuilder.h:2632
StoreInst * CreateAlignedStore(Value *Val, Value *Ptr, MaybeAlign Align, bool isVolatile=false)
Definition IRBuilder.h:1964
Value * CreateOr(Value *LHS, uint64_t RHS, const Twine &Name="")
Definition IRBuilder.h:1628
void setConstrainedFPCallAttr(CallBase *I)
Definition IRBuilder.h:402
Value * CreateMinimumNum(Value *LHS, Value *RHS, const Twine &Name="")
Create call to the minimumnum intrinsic.
Definition IRBuilder.h:1088
LLVM_ABI InvokeInst * CreateGCStatepointInvoke(uint64_t ID, uint32_t NumPatchBytes, FunctionCallee ActualInvokee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value * > InvokeArgs, std::optional< ArrayRef< Value * > > DeoptArgs, ArrayRef< Value * > GCArgs, const Twine &Name="")
Create an invoke to the experimental.gc.statepoint intrinsic to start a new statepoint sequence.
ByteType * getByte64Ty()
Fetch the type representing a 64-bit byte.
Definition IRBuilder.h:562
LLVM_ABI CallInst * CreateMaskedExpandLoad(Type *Ty, Value *Ptr, MaybeAlign Align, Value *Mask=nullptr, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Expand Load intrinsic.
const IRBuilderFolder & Folder
Definition IRBuilder.h:149
Value * CreateInBoundsPtrAdd(Value *Ptr, Value *Offset, const Twine &Name="")
Definition IRBuilder.h:2106
Value * CreateIntCast(Value *, Type *, const char *)=delete
Value * CreateFPExt(Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2225
LLVM_ABI CallInst * CreateMemTransferInst(Intrinsic::ID IntrID, Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, Value *Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI Value * CreateVectorInterleave(ArrayRef< Value * > Ops, const Twine &Name="")
Value * CreateAShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition IRBuilder.h:1573
CallInst * CreateCall(FunctionCallee Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2585
Value * CreateFNegFMF(Value *V, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1866
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1644
LLVM_ABI CallInst * CreateFMulReduce(Value *Acc, Value *Src)
Create a sequential vector fmul reduction intrinsic of the source vector.
Value * CreateTruncOrBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2278
Value * CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2404
Value * CreateSIToFP(Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2202
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2494
LLVM_ABI CallInst * CreateMemSetInline(Value *Dst, MaybeAlign DstAlign, Value *Val, Value *Size, bool IsVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Value * CreateFMul(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1696
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, bool isVolatile, const Twine &Name="")
Definition IRBuilder.h:1955
Value * CreateFNeg(Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1861
void setConstrainedFPFunctionAttr()
Definition IRBuilder.h:393
LLVM_ABI void SetInstDebugLocation(Instruction *I) const
If this builder has a current debug location, set it on the specified instruction.
Definition IRBuilder.cpp:66
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1614
void SetInsertPoint(Instruction *I)
This specifies that created instructions should be inserted before the specified instruction.
Definition IRBuilder.h:214
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Definition IRBuilder.h:576
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:544
LLVM_ABI CallInst * CreateGCRelocate(Instruction *Statepoint, int BaseOffset, int DerivedOffset, Type *ResultType, const Twine &Name="")
Create a call to the experimental.gc.relocate intrinsics to project the relocated value of one pointe...
Value * CreateFDivFMF(Value *L, Value *R, FMFSource FMFSource, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1720
Value * CreateURem(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1521
LLVM_ABI Value * CreateStepVector(Type *DstType, const Twine &Name="")
Creates a vector of type DstType with the linear sequence <0, 1, ...>
LLVM_ABI Value * CreatePreserveArrayAccessIndex(Type *ElTy, Value *Base, unsigned Dimension, unsigned LastIndex, MDNode *DbgInfo)
Value * CreateSExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a SExt or Trunc from the integer value V to DestTy.
Definition IRBuilder.h:2163
ResumeInst * CreateResume(Value *Exn)
Definition IRBuilder.h:1349
Value * CreateAddrSpaceCast(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2257
Type * getBFloatTy()
Fetch the type representing a 16-bit brain floating point value.
Definition IRBuilder.h:609
Value * CreateFMulFMF(Value *L, Value *R, FMFSource FMFSource, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1701
Value * CreateXor(Value *LHS, const APInt &RHS, const Twine &Name="")
Definition IRBuilder.h:1650
LLVM_ABI CallInst * CreateInvariantStart(Value *Ptr, ConstantInt *Size=nullptr)
Create a call to invariant.start intrinsic.
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1478
LLVM_ABI Instruction * CreateNoAliasScopeDeclaration(Value *Scope)
Create a llvm.experimental.noalias.scope.decl intrinsic call.
LLVM_ABI CallInst * CreateMaskedScatter(Value *Val, Value *Ptrs, Align Alignment, Value *Mask=nullptr)
Create a call to Masked Scatter intrinsic.
Value * CreateFRemFMF(Value *L, Value *R, FMFSource FMFSource, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1739
Value * CreateXor(Value *LHS, uint64_t RHS, const Twine &Name="")
Definition IRBuilder.h:1654
LLVM_ABI Value * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *Op, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
AtomicRMWInst * CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val, MaybeAlign Align, AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System, bool Elementwise=false)
Definition IRBuilder.h:1992
LLVM_ABI GlobalVariable * CreateGlobalString(StringRef Str, const Twine &Name="", unsigned AddressSpace=0, Module *M=nullptr, bool AddNull=true)
Make a new global variable with initializer type i8*.
Definition IRBuilder.cpp:45
Value * CreateNSWNeg(Value *V, const Twine &Name="")
Definition IRBuilder.h:1857
LLVM_ABI Value * CreateElementCount(Type *Ty, ElementCount EC)
Create an expression which evaluates to the number of elements in EC at runtime.
LLVM_ABI CallInst * CreateFPMinimumReduce(Value *Src)
Create a vector float minimum reduction intrinsic of the source vector.
Value * CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2434
CallInst * CreateMemMove(Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, Value *Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Definition IRBuilder.h:767
LLVM_ABI CallInst * CreateConstrainedFPCast(Intrinsic::ID ID, Value *V, Type *DestTy, FMFSource FMFSource={}, const Twine &Name="", MDNode *FPMathTag=nullptr, std::optional< RoundingMode > Rounding=std::nullopt, std::optional< fp::ExceptionBehavior > Except=std::nullopt)
LLVM_ABI Value * CreateStripInvariantGroup(Value *Ptr)
Create a strip.invariant.group intrinsic call.
LLVM_ABI CallInst * CreateMaskedGather(Type *Ty, Value *Ptrs, Align Alignment, Value *Mask=nullptr, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Gather intrinsic.
Value * CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1474
Value * CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2479
CallInst * CreateArithmeticFence(Value *Val, Type *DstType, const Twine &Name="")
Create a call to the arithmetic_fence intrinsic.
Definition IRBuilder.h:1128
Value * CreateFPToSI(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2183
IRBuilderCallbackInserter(std::function< void(Instruction *)> Callback)
Definition IRBuilder.h:81
void InsertHelper(Instruction *I, const Twine &Name, BasicBlock::iterator InsertPt) const override
Definition IRBuilder.h:84
This provides the default implementation of the IRBuilder 'InsertHelper' method that is called whenev...
Definition IRBuilder.h:61
virtual void InsertHelper(Instruction *I, const Twine &Name, BasicBlock::iterator InsertPt) const
Definition IRBuilder.h:65
IRBuilderFolder - Interface for constant folding in IRBuilder.
virtual Value * FoldCast(Instruction::CastOps Op, Value *V, Type *DestTy) const =0
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2868
IRBuilder(LLVMContext &C, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2885
IRBuilder(const IRBuilder &)=delete
Avoid copying the full IRBuilder.
IRBuilder(LLVMContext &C, FolderTy Folder, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2880
IRBuilder(LLVMContext &C, FolderTy Folder, InserterTy Inserter, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2874
InserterTy & getInserter()
Definition IRBuilder.h:2933
IRBuilder(Instruction *IP, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2905
IRBuilder(BasicBlock *TheBB, FolderTy Folder, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2889
IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, FolderTy Folder, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2912
const InserterTy & getInserter() const
Definition IRBuilder.h:2934
IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2921
IRBuilder(BasicBlock *TheBB, MDNode *FPMathTag=nullptr, ArrayRef< OperandBundleDef > OpBundles={})
Definition IRBuilder.h:2898
Indirect Branch Instruction.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
Class to represent integer types.
Invoke instruction.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
The landingpad instruction holds all of the information necessary to generate correct exception handl...
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
An instruction for reading from memory.
Metadata node.
Definition Metadata.h:1075
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:614
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:110
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Class to represent pointers.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Resume the propagation of an exception.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
Return a value (possibly void), from a function.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
This instruction constructs a fixed permutation of two input vectors.
ArrayRef< int > getShuffleMask() const
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Multiway switch.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI ByteType * getByte16Ty(LLVMContext &C)
Definition Type.cpp:297
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:310
static LLVM_ABI IntegerType * getInt128Ty(LLVMContext &C)
Definition Type.cpp:311
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:263
static LLVM_ABI ByteType * getByte32Ty(LLVMContext &C)
Definition Type.cpp:298
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
Definition Type.cpp:308
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
static LLVM_ABI ByteType * getByte8Ty(LLVMContext &C)
Definition Type.cpp:296
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:306
static LLVM_ABI ByteType * getByte128Ty(LLVMContext &C)
Definition Type.cpp:300
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:285
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:313
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
Definition Type.cpp:287
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
Definition Type.cpp:286
static LLVM_ABI ByteType * getByteNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:302
static LLVM_ABI ByteType * getByte64Ty(LLVMContext &C)
Definition Type.cpp:299
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
Definition Type.cpp:285
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
Definition Type.cpp:284
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
Unconditional Branch instruction.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
This class represents zero extension of integer types.
struct LLVMOpaqueBuilder * LLVMBuilderRef
Represents an LLVM basic block builder.
Definition Types.h:110
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Rounding
Possible values of current rounding mode, which is specified in bits 23:22 of FPCR.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ System
Synchronized with respect to all concurrently executing threads.
Definition LLVMContext.h:58
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:558
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI std::optional< StringRef > convertRoundingModeToStr(RoundingMode)
For any RoundingMode enumerator, returns a string valid as input in constrained intrinsic rounding mo...
Definition FPEnv.cpp:39
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2207
LLVM_ABI std::optional< StringRef > convertExceptionBehaviorToStr(fp::ExceptionBehavior)
For any ExceptionBehavior enumerator, returns a string valid as input in constrained intrinsic except...
Definition FPEnv.cpp:68
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
AtomicOrdering
Atomic ordering for LLVM's memory model.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
DWARFExpression::Operation Op
RoundingMode
Rounding mode.
@ Dynamic
Denotes mode unknown at compile time.
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1916
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2191
@ Default
The result value is uniform if and only if all operands are uniform.
Definition Uniformity.h:20
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:861
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106