LLVM  10.0.0svn
IRBuilder.cpp
Go to the documentation of this file.
1 //===- IRBuilder.cpp - Builder for LLVM Instrs ----------------------------===//
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 implements 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 #include "llvm/IR/IRBuilder.h"
15 #include "llvm/ADT/ArrayRef.h"
16 #include "llvm/ADT/None.h"
17 #include "llvm/IR/Constant.h"
18 #include "llvm/IR/Constants.h"
19 #include "llvm/IR/DerivedTypes.h"
20 #include "llvm/IR/Function.h"
21 #include "llvm/IR/GlobalValue.h"
22 #include "llvm/IR/GlobalVariable.h"
23 #include "llvm/IR/IntrinsicInst.h"
24 #include "llvm/IR/Intrinsics.h"
25 #include "llvm/IR/LLVMContext.h"
26 #include "llvm/IR/Operator.h"
27 #include "llvm/IR/Statepoint.h"
28 #include "llvm/IR/Type.h"
29 #include "llvm/IR/Value.h"
30 #include "llvm/Support/Casting.h"
32 #include <cassert>
33 #include <cstdint>
34 #include <vector>
35 
36 using namespace llvm;
37 
38 /// CreateGlobalString - Make a new global variable with an initializer that
39 /// has array of i8 type filled in with the nul terminated string value
40 /// specified. If Name is specified, it is the name of the global variable
41 /// created.
43  const Twine &Name,
44  unsigned AddressSpace) {
45  Constant *StrConstant = ConstantDataArray::getString(Context, Str);
46  Module &M = *BB->getParent()->getParent();
47  auto *GV = new GlobalVariable(M, StrConstant->getType(), true,
48  GlobalValue::PrivateLinkage, StrConstant, Name,
50  AddressSpace);
52  GV->setAlignment(Align::None());
53  return GV;
54 }
55 
57  assert(BB && BB->getParent() && "No current function!");
58  return BB->getParent()->getReturnType();
59 }
60 
61 Value *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) {
62  auto *PT = cast<PointerType>(Ptr->getType());
63  if (PT->getElementType()->isIntegerTy(8))
64  return Ptr;
65 
66  // Otherwise, we need to insert a bitcast.
67  PT = getInt8PtrTy(PT->getAddressSpace());
68  BitCastInst *BCI = new BitCastInst(Ptr, PT, "");
69  BB->getInstList().insert(InsertPt, BCI);
71  return BCI;
72 }
73 
75  IRBuilderBase *Builder,
76  const Twine &Name = "",
77  Instruction *FMFSource = nullptr) {
78  CallInst *CI = CallInst::Create(Callee, Ops, Name);
79  if (FMFSource)
80  CI->copyFastMathFlags(FMFSource);
81  Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI);
82  Builder->SetInstDebugLocation(CI);
83  return CI;
84 }
85 
86 static InvokeInst *createInvokeHelper(Function *Invokee, BasicBlock *NormalDest,
87  BasicBlock *UnwindDest,
89  IRBuilderBase *Builder,
90  const Twine &Name = "") {
91  InvokeInst *II =
92  InvokeInst::Create(Invokee, NormalDest, UnwindDest, Ops, Name);
93  Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),
94  II);
95  Builder->SetInstDebugLocation(II);
96  return II;
97 }
98 
100 CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
101  bool isVolatile, MDNode *TBAATag, MDNode *ScopeTag,
102  MDNode *NoAliasTag) {
103  Ptr = getCastedInt8PtrValue(Ptr);
104  Value *Ops[] = {Ptr, Val, Size, getInt1(isVolatile)};
105  Type *Tys[] = { Ptr->getType(), Size->getType() };
106  Module *M = BB->getParent()->getParent();
107  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
108 
109  CallInst *CI = createCallHelper(TheFn, Ops, this);
110 
111  if (Align > 0)
112  cast<MemSetInst>(CI)->setDestAlignment(Align);
113 
114  // Set the TBAA info if present.
115  if (TBAATag)
116  CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
117 
118  if (ScopeTag)
119  CI->setMetadata(LLVMContext::MD_alias_scope, ScopeTag);
120 
121  if (NoAliasTag)
122  CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
123 
124  return CI;
125 }
126 
128  Value *Ptr, Value *Val, Value *Size, unsigned Align, uint32_t ElementSize,
129  MDNode *TBAATag, MDNode *ScopeTag, MDNode *NoAliasTag) {
130  assert(Align >= ElementSize &&
131  "Pointer alignment must be at least element size.");
132 
133  Ptr = getCastedInt8PtrValue(Ptr);
134  Value *Ops[] = {Ptr, Val, Size, getInt32(ElementSize)};
135  Type *Tys[] = {Ptr->getType(), Size->getType()};
136  Module *M = BB->getParent()->getParent();
138  M, Intrinsic::memset_element_unordered_atomic, Tys);
139 
140  CallInst *CI = createCallHelper(TheFn, Ops, this);
141 
142  cast<AtomicMemSetInst>(CI)->setDestAlignment(Align);
143 
144  // Set the TBAA info if present.
145  if (TBAATag)
146  CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
147 
148  if (ScopeTag)
149  CI->setMetadata(LLVMContext::MD_alias_scope, ScopeTag);
150 
151  if (NoAliasTag)
152  CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
153 
154  return CI;
155 }
156 
158 CreateMemCpy(Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign,
159  Value *Size, bool isVolatile, MDNode *TBAATag,
160  MDNode *TBAAStructTag, MDNode *ScopeTag, MDNode *NoAliasTag) {
161  assert((DstAlign == 0 || isPowerOf2_32(DstAlign)) && "Must be 0 or a power of 2");
162  assert((SrcAlign == 0 || isPowerOf2_32(SrcAlign)) && "Must be 0 or a power of 2");
163  Dst = getCastedInt8PtrValue(Dst);
164  Src = getCastedInt8PtrValue(Src);
165 
166  Value *Ops[] = {Dst, Src, Size, getInt1(isVolatile)};
167  Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
168  Module *M = BB->getParent()->getParent();
169  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
170 
171  CallInst *CI = createCallHelper(TheFn, Ops, this);
172 
173  auto* MCI = cast<MemCpyInst>(CI);
174  if (DstAlign > 0)
175  MCI->setDestAlignment(DstAlign);
176  if (SrcAlign > 0)
177  MCI->setSourceAlignment(SrcAlign);
178 
179  // Set the TBAA info if present.
180  if (TBAATag)
181  CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
182 
183  // Set the TBAA Struct info if present.
184  if (TBAAStructTag)
185  CI->setMetadata(LLVMContext::MD_tbaa_struct, TBAAStructTag);
186 
187  if (ScopeTag)
188  CI->setMetadata(LLVMContext::MD_alias_scope, ScopeTag);
189 
190  if (NoAliasTag)
191  CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
192 
193  return CI;
194 }
195 
197  Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign, Value *Size,
198  uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
199  MDNode *ScopeTag, MDNode *NoAliasTag) {
200  assert(DstAlign >= ElementSize &&
201  "Pointer alignment must be at least element size");
202  assert(SrcAlign >= ElementSize &&
203  "Pointer alignment must be at least element size");
204  Dst = getCastedInt8PtrValue(Dst);
205  Src = getCastedInt8PtrValue(Src);
206 
207  Value *Ops[] = {Dst, Src, Size, getInt32(ElementSize)};
208  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
209  Module *M = BB->getParent()->getParent();
211  M, Intrinsic::memcpy_element_unordered_atomic, Tys);
212 
213  CallInst *CI = createCallHelper(TheFn, Ops, this);
214 
215  // Set the alignment of the pointer args.
216  auto *AMCI = cast<AtomicMemCpyInst>(CI);
217  AMCI->setDestAlignment(DstAlign);
218  AMCI->setSourceAlignment(SrcAlign);
219 
220  // Set the TBAA info if present.
221  if (TBAATag)
222  CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
223 
224  // Set the TBAA Struct info if present.
225  if (TBAAStructTag)
226  CI->setMetadata(LLVMContext::MD_tbaa_struct, TBAAStructTag);
227 
228  if (ScopeTag)
229  CI->setMetadata(LLVMContext::MD_alias_scope, ScopeTag);
230 
231  if (NoAliasTag)
232  CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
233 
234  return CI;
235 }
236 
238 CreateMemMove(Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign,
239  Value *Size, bool isVolatile, MDNode *TBAATag, MDNode *ScopeTag,
240  MDNode *NoAliasTag) {
241  assert((DstAlign == 0 || isPowerOf2_32(DstAlign)) && "Must be 0 or a power of 2");
242  assert((SrcAlign == 0 || isPowerOf2_32(SrcAlign)) && "Must be 0 or a power of 2");
243  Dst = getCastedInt8PtrValue(Dst);
244  Src = getCastedInt8PtrValue(Src);
245 
246  Value *Ops[] = {Dst, Src, Size, getInt1(isVolatile)};
247  Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
248  Module *M = BB->getParent()->getParent();
249  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys);
250 
251  CallInst *CI = createCallHelper(TheFn, Ops, this);
252 
253  auto *MMI = cast<MemMoveInst>(CI);
254  if (DstAlign > 0)
255  MMI->setDestAlignment(DstAlign);
256  if (SrcAlign > 0)
257  MMI->setSourceAlignment(SrcAlign);
258 
259  // Set the TBAA info if present.
260  if (TBAATag)
261  CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
262 
263  if (ScopeTag)
264  CI->setMetadata(LLVMContext::MD_alias_scope, ScopeTag);
265 
266  if (NoAliasTag)
267  CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
268 
269  return CI;
270 }
271 
273  Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign, Value *Size,
274  uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
275  MDNode *ScopeTag, MDNode *NoAliasTag) {
276  assert(DstAlign >= ElementSize &&
277  "Pointer alignment must be at least element size");
278  assert(SrcAlign >= ElementSize &&
279  "Pointer alignment must be at least element size");
280  Dst = getCastedInt8PtrValue(Dst);
281  Src = getCastedInt8PtrValue(Src);
282 
283  Value *Ops[] = {Dst, Src, Size, getInt32(ElementSize)};
284  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
285  Module *M = BB->getParent()->getParent();
287  M, Intrinsic::memmove_element_unordered_atomic, Tys);
288 
289  CallInst *CI = createCallHelper(TheFn, Ops, this);
290 
291  // Set the alignment of the pointer args.
292  CI->addParamAttr(
293  0, Attribute::getWithAlignment(CI->getContext(), Align(DstAlign)));
294  CI->addParamAttr(
295  1, Attribute::getWithAlignment(CI->getContext(), Align(SrcAlign)));
296 
297  // Set the TBAA info if present.
298  if (TBAATag)
299  CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
300 
301  // Set the TBAA Struct info if present.
302  if (TBAAStructTag)
303  CI->setMetadata(LLVMContext::MD_tbaa_struct, TBAAStructTag);
304 
305  if (ScopeTag)
306  CI->setMetadata(LLVMContext::MD_alias_scope, ScopeTag);
307 
308  if (NoAliasTag)
309  CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
310 
311  return CI;
312 }
313 
315  Value *Src) {
316  Module *M = Builder->GetInsertBlock()->getParent()->getParent();
317  Value *Ops[] = {Src};
318  Type *Tys[] = { Src->getType() };
319  auto Decl = Intrinsic::getDeclaration(M, ID, Tys);
320  return createCallHelper(Decl, Ops, Builder);
321 }
322 
325  Value *Ops[] = {Acc, Src};
326  Type *Tys[] = {Acc->getType(), Src->getType()};
327  auto Decl = Intrinsic::getDeclaration(
328  M, Intrinsic::experimental_vector_reduce_v2_fadd, Tys);
329  return createCallHelper(Decl, Ops, this);
330 }
331 
334  Value *Ops[] = {Acc, Src};
335  Type *Tys[] = {Acc->getType(), Src->getType()};
336  auto Decl = Intrinsic::getDeclaration(
337  M, Intrinsic::experimental_vector_reduce_v2_fmul, Tys);
338  return createCallHelper(Decl, Ops, this);
339 }
340 
342  return getReductionIntrinsic(this, Intrinsic::experimental_vector_reduce_add,
343  Src);
344 }
345 
347  return getReductionIntrinsic(this, Intrinsic::experimental_vector_reduce_mul,
348  Src);
349 }
350 
352  return getReductionIntrinsic(this, Intrinsic::experimental_vector_reduce_and,
353  Src);
354 }
355 
357  return getReductionIntrinsic(this, Intrinsic::experimental_vector_reduce_or,
358  Src);
359 }
360 
362  return getReductionIntrinsic(this, Intrinsic::experimental_vector_reduce_xor,
363  Src);
364 }
365 
367  auto ID = IsSigned ? Intrinsic::experimental_vector_reduce_smax
368  : Intrinsic::experimental_vector_reduce_umax;
369  return getReductionIntrinsic(this, ID, Src);
370 }
371 
373  auto ID = IsSigned ? Intrinsic::experimental_vector_reduce_smin
374  : Intrinsic::experimental_vector_reduce_umin;
375  return getReductionIntrinsic(this, ID, Src);
376 }
377 
379  auto Rdx = getReductionIntrinsic(
380  this, Intrinsic::experimental_vector_reduce_fmax, Src);
381  if (NoNaN) {
383  FMF.setNoNaNs();
384  Rdx->setFastMathFlags(FMF);
385  }
386  return Rdx;
387 }
388 
390  auto Rdx = getReductionIntrinsic(
391  this, Intrinsic::experimental_vector_reduce_fmin, Src);
392  if (NoNaN) {
394  FMF.setNoNaNs();
395  Rdx->setFastMathFlags(FMF);
396  }
397  return Rdx;
398 }
399 
401  assert(isa<PointerType>(Ptr->getType()) &&
402  "lifetime.start only applies to pointers.");
403  Ptr = getCastedInt8PtrValue(Ptr);
404  if (!Size)
405  Size = getInt64(-1);
406  else
407  assert(Size->getType() == getInt64Ty() &&
408  "lifetime.start requires the size to be an i64");
409  Value *Ops[] = { Size, Ptr };
410  Module *M = BB->getParent()->getParent();
411  Function *TheFn =
412  Intrinsic::getDeclaration(M, Intrinsic::lifetime_start, {Ptr->getType()});
413  return createCallHelper(TheFn, Ops, this);
414 }
415 
417  assert(isa<PointerType>(Ptr->getType()) &&
418  "lifetime.end only applies to pointers.");
419  Ptr = getCastedInt8PtrValue(Ptr);
420  if (!Size)
421  Size = getInt64(-1);
422  else
423  assert(Size->getType() == getInt64Ty() &&
424  "lifetime.end requires the size to be an i64");
425  Value *Ops[] = { Size, Ptr };
426  Module *M = BB->getParent()->getParent();
427  Function *TheFn =
428  Intrinsic::getDeclaration(M, Intrinsic::lifetime_end, {Ptr->getType()});
429  return createCallHelper(TheFn, Ops, this);
430 }
431 
433 
434  assert(isa<PointerType>(Ptr->getType()) &&
435  "invariant.start only applies to pointers.");
436  Ptr = getCastedInt8PtrValue(Ptr);
437  if (!Size)
438  Size = getInt64(-1);
439  else
440  assert(Size->getType() == getInt64Ty() &&
441  "invariant.start requires the size to be an i64");
442 
443  Value *Ops[] = {Size, Ptr};
444  // Fill in the single overloaded type: memory object type.
445  Type *ObjectPtr[1] = {Ptr->getType()};
446  Module *M = BB->getParent()->getParent();
447  Function *TheFn =
448  Intrinsic::getDeclaration(M, Intrinsic::invariant_start, ObjectPtr);
449  return createCallHelper(TheFn, Ops, this);
450 }
451 
453  assert(Cond->getType() == getInt1Ty() &&
454  "an assumption condition must be of type i1");
455 
456  Value *Ops[] = { Cond };
457  Module *M = BB->getParent()->getParent();
458  Function *FnAssume = Intrinsic::getDeclaration(M, Intrinsic::assume);
459  return createCallHelper(FnAssume, Ops, this);
460 }
461 
462 /// Create a call to a Masked Load intrinsic.
463 /// \p Ptr - base pointer for the load
464 /// \p Align - alignment of the source location
465 /// \p Mask - vector of booleans which indicates what vector lanes should
466 /// be accessed in memory
467 /// \p PassThru - pass-through value that is used to fill the masked-off lanes
468 /// of the result
469 /// \p Name - name of the result variable
471  Value *Mask, Value *PassThru,
472  const Twine &Name) {
473  auto *PtrTy = cast<PointerType>(Ptr->getType());
474  Type *DataTy = PtrTy->getElementType();
475  assert(DataTy->isVectorTy() && "Ptr should point to a vector");
476  assert(Mask && "Mask should not be all-ones (null)");
477  if (!PassThru)
478  PassThru = UndefValue::get(DataTy);
479  Type *OverloadedTypes[] = { DataTy, PtrTy };
480  Value *Ops[] = { Ptr, getInt32(Align), Mask, PassThru};
481  return CreateMaskedIntrinsic(Intrinsic::masked_load, Ops,
482  OverloadedTypes, Name);
483 }
484 
485 /// Create a call to a Masked Store intrinsic.
486 /// \p Val - data to be stored,
487 /// \p Ptr - base pointer for the store
488 /// \p Align - alignment of the destination location
489 /// \p Mask - vector of booleans which indicates what vector lanes should
490 /// be accessed in memory
492  unsigned Align, Value *Mask) {
493  auto *PtrTy = cast<PointerType>(Ptr->getType());
494  Type *DataTy = PtrTy->getElementType();
495  assert(DataTy->isVectorTy() && "Ptr should point to a vector");
496  assert(Mask && "Mask should not be all-ones (null)");
497  Type *OverloadedTypes[] = { DataTy, PtrTy };
498  Value *Ops[] = { Val, Ptr, getInt32(Align), Mask };
499  return CreateMaskedIntrinsic(Intrinsic::masked_store, Ops, OverloadedTypes);
500 }
501 
502 /// Create a call to a Masked intrinsic, with given intrinsic Id,
503 /// an array of operands - Ops, and an array of overloaded types -
504 /// OverloadedTypes.
505 CallInst *IRBuilderBase::CreateMaskedIntrinsic(Intrinsic::ID Id,
506  ArrayRef<Value *> Ops,
507  ArrayRef<Type *> OverloadedTypes,
508  const Twine &Name) {
509  Module *M = BB->getParent()->getParent();
510  Function *TheFn = Intrinsic::getDeclaration(M, Id, OverloadedTypes);
511  return createCallHelper(TheFn, Ops, this, Name);
512 }
513 
514 /// Create a call to a Masked Gather intrinsic.
515 /// \p Ptrs - vector of pointers for loading
516 /// \p Align - alignment for one element
517 /// \p Mask - vector of booleans which indicates what vector lanes should
518 /// be accessed in memory
519 /// \p PassThru - pass-through value that is used to fill the masked-off lanes
520 /// of the result
521 /// \p Name - name of the result variable
523  Value *Mask, Value *PassThru,
524  const Twine& Name) {
525  auto PtrsTy = cast<VectorType>(Ptrs->getType());
526  auto PtrTy = cast<PointerType>(PtrsTy->getElementType());
527  unsigned NumElts = PtrsTy->getVectorNumElements();
528  Type *DataTy = VectorType::get(PtrTy->getElementType(), NumElts);
529 
530  if (!Mask)
532  NumElts));
533 
534  if (!PassThru)
535  PassThru = UndefValue::get(DataTy);
536 
537  Type *OverloadedTypes[] = {DataTy, PtrsTy};
538  Value * Ops[] = {Ptrs, getInt32(Align), Mask, PassThru};
539 
540  // We specify only one type when we create this intrinsic. Types of other
541  // arguments are derived from this type.
542  return CreateMaskedIntrinsic(Intrinsic::masked_gather, Ops, OverloadedTypes,
543  Name);
544 }
545 
546 /// Create a call to a Masked Scatter intrinsic.
547 /// \p Data - data to be stored,
548 /// \p Ptrs - the vector of pointers, where the \p Data elements should be
549 /// stored
550 /// \p Align - alignment for one element
551 /// \p Mask - vector of booleans which indicates what vector lanes should
552 /// be accessed in memory
554  unsigned Align, Value *Mask) {
555  auto PtrsTy = cast<VectorType>(Ptrs->getType());
556  auto DataTy = cast<VectorType>(Data->getType());
557  unsigned NumElts = PtrsTy->getVectorNumElements();
558 
559 #ifndef NDEBUG
560  auto PtrTy = cast<PointerType>(PtrsTy->getElementType());
561  assert(NumElts == DataTy->getVectorNumElements() &&
562  PtrTy->getElementType() == DataTy->getElementType() &&
563  "Incompatible pointer and data types");
564 #endif
565 
566  if (!Mask)
568  NumElts));
569 
570  Type *OverloadedTypes[] = {DataTy, PtrsTy};
571  Value * Ops[] = {Data, Ptrs, getInt32(Align), Mask};
572 
573  // We specify only one type when we create this intrinsic. Types of other
574  // arguments are derived from this type.
575  return CreateMaskedIntrinsic(Intrinsic::masked_scatter, Ops, OverloadedTypes);
576 }
577 
578 template <typename T0, typename T1, typename T2, typename T3>
579 static std::vector<Value *>
580 getStatepointArgs(IRBuilderBase &B, uint64_t ID, uint32_t NumPatchBytes,
581  Value *ActualCallee, uint32_t Flags, ArrayRef<T0> CallArgs,
582  ArrayRef<T1> TransitionArgs, ArrayRef<T2> DeoptArgs,
583  ArrayRef<T3> GCArgs) {
584  std::vector<Value *> Args;
585  Args.push_back(B.getInt64(ID));
586  Args.push_back(B.getInt32(NumPatchBytes));
587  Args.push_back(ActualCallee);
588  Args.push_back(B.getInt32(CallArgs.size()));
589  Args.push_back(B.getInt32(Flags));
590  Args.insert(Args.end(), CallArgs.begin(), CallArgs.end());
591  Args.push_back(B.getInt32(TransitionArgs.size()));
592  Args.insert(Args.end(), TransitionArgs.begin(), TransitionArgs.end());
593  Args.push_back(B.getInt32(DeoptArgs.size()));
594  Args.insert(Args.end(), DeoptArgs.begin(), DeoptArgs.end());
595  Args.insert(Args.end(), GCArgs.begin(), GCArgs.end());
596 
597  return Args;
598 }
599 
600 template <typename T0, typename T1, typename T2, typename T3>
602  IRBuilderBase *Builder, uint64_t ID, uint32_t NumPatchBytes,
603  Value *ActualCallee, uint32_t Flags, ArrayRef<T0> CallArgs,
604  ArrayRef<T1> TransitionArgs, ArrayRef<T2> DeoptArgs, ArrayRef<T3> GCArgs,
605  const Twine &Name) {
606  // Extract out the type of the callee.
607  auto *FuncPtrType = cast<PointerType>(ActualCallee->getType());
608  assert(isa<FunctionType>(FuncPtrType->getElementType()) &&
609  "actual callee must be a callable value");
610 
611  Module *M = Builder->GetInsertBlock()->getParent()->getParent();
612  // Fill in the one generic type'd argument (the function is also vararg)
613  Type *ArgTypes[] = { FuncPtrType };
614  Function *FnStatepoint =
615  Intrinsic::getDeclaration(M, Intrinsic::experimental_gc_statepoint,
616  ArgTypes);
617 
618  std::vector<Value *> Args =
619  getStatepointArgs(*Builder, ID, NumPatchBytes, ActualCallee, Flags,
620  CallArgs, TransitionArgs, DeoptArgs, GCArgs);
621  return createCallHelper(FnStatepoint, Args, Builder, Name);
622 }
623 
625  uint64_t ID, uint32_t NumPatchBytes, Value *ActualCallee,
626  ArrayRef<Value *> CallArgs, ArrayRef<Value *> DeoptArgs,
627  ArrayRef<Value *> GCArgs, const Twine &Name) {
628  return CreateGCStatepointCallCommon<Value *, Value *, Value *, Value *>(
629  this, ID, NumPatchBytes, ActualCallee, uint32_t(StatepointFlags::None),
630  CallArgs, None /* No Transition Args */, DeoptArgs, GCArgs, Name);
631 }
632 
634  uint64_t ID, uint32_t NumPatchBytes, Value *ActualCallee, uint32_t Flags,
635  ArrayRef<Use> CallArgs, ArrayRef<Use> TransitionArgs,
636  ArrayRef<Use> DeoptArgs, ArrayRef<Value *> GCArgs, const Twine &Name) {
637  return CreateGCStatepointCallCommon<Use, Use, Use, Value *>(
638  this, ID, NumPatchBytes, ActualCallee, Flags, CallArgs, TransitionArgs,
639  DeoptArgs, GCArgs, Name);
640 }
641 
643  uint64_t ID, uint32_t NumPatchBytes, Value *ActualCallee,
644  ArrayRef<Use> CallArgs, ArrayRef<Value *> DeoptArgs,
645  ArrayRef<Value *> GCArgs, const Twine &Name) {
646  return CreateGCStatepointCallCommon<Use, Value *, Value *, Value *>(
647  this, ID, NumPatchBytes, ActualCallee, uint32_t(StatepointFlags::None),
648  CallArgs, None, DeoptArgs, GCArgs, Name);
649 }
650 
651 template <typename T0, typename T1, typename T2, typename T3>
653  IRBuilderBase *Builder, uint64_t ID, uint32_t NumPatchBytes,
654  Value *ActualInvokee, BasicBlock *NormalDest, BasicBlock *UnwindDest,
655  uint32_t Flags, ArrayRef<T0> InvokeArgs, ArrayRef<T1> TransitionArgs,
656  ArrayRef<T2> DeoptArgs, ArrayRef<T3> GCArgs, const Twine &Name) {
657  // Extract out the type of the callee.
658  auto *FuncPtrType = cast<PointerType>(ActualInvokee->getType());
659  assert(isa<FunctionType>(FuncPtrType->getElementType()) &&
660  "actual callee must be a callable value");
661 
662  Module *M = Builder->GetInsertBlock()->getParent()->getParent();
663  // Fill in the one generic type'd argument (the function is also vararg)
664  Function *FnStatepoint = Intrinsic::getDeclaration(
665  M, Intrinsic::experimental_gc_statepoint, {FuncPtrType});
666 
667  std::vector<Value *> Args =
668  getStatepointArgs(*Builder, ID, NumPatchBytes, ActualInvokee, Flags,
669  InvokeArgs, TransitionArgs, DeoptArgs, GCArgs);
670  return createInvokeHelper(FnStatepoint, NormalDest, UnwindDest, Args, Builder,
671  Name);
672 }
673 
675  uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee,
676  BasicBlock *NormalDest, BasicBlock *UnwindDest,
677  ArrayRef<Value *> InvokeArgs, ArrayRef<Value *> DeoptArgs,
678  ArrayRef<Value *> GCArgs, const Twine &Name) {
679  return CreateGCStatepointInvokeCommon<Value *, Value *, Value *, Value *>(
680  this, ID, NumPatchBytes, ActualInvokee, NormalDest, UnwindDest,
681  uint32_t(StatepointFlags::None), InvokeArgs, None /* No Transition Args*/,
682  DeoptArgs, GCArgs, Name);
683 }
684 
686  uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee,
687  BasicBlock *NormalDest, BasicBlock *UnwindDest, uint32_t Flags,
688  ArrayRef<Use> InvokeArgs, ArrayRef<Use> TransitionArgs,
689  ArrayRef<Use> DeoptArgs, ArrayRef<Value *> GCArgs, const Twine &Name) {
690  return CreateGCStatepointInvokeCommon<Use, Use, Use, Value *>(
691  this, ID, NumPatchBytes, ActualInvokee, NormalDest, UnwindDest, Flags,
692  InvokeArgs, TransitionArgs, DeoptArgs, GCArgs, Name);
693 }
694 
696  uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee,
697  BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef<Use> InvokeArgs,
698  ArrayRef<Value *> DeoptArgs, ArrayRef<Value *> GCArgs, const Twine &Name) {
699  return CreateGCStatepointInvokeCommon<Use, Value *, Value *, Value *>(
700  this, ID, NumPatchBytes, ActualInvokee, NormalDest, UnwindDest,
701  uint32_t(StatepointFlags::None), InvokeArgs, None, DeoptArgs, GCArgs,
702  Name);
703 }
704 
706  Type *ResultType,
707  const Twine &Name) {
708  Intrinsic::ID ID = Intrinsic::experimental_gc_result;
709  Module *M = BB->getParent()->getParent();
710  Type *Types[] = {ResultType};
711  Function *FnGCResult = Intrinsic::getDeclaration(M, ID, Types);
712 
713  Value *Args[] = {Statepoint};
714  return createCallHelper(FnGCResult, Args, this, Name);
715 }
716 
718  int BaseOffset,
719  int DerivedOffset,
720  Type *ResultType,
721  const Twine &Name) {
722  Module *M = BB->getParent()->getParent();
723  Type *Types[] = {ResultType};
724  Function *FnGCRelocate =
725  Intrinsic::getDeclaration(M, Intrinsic::experimental_gc_relocate, Types);
726 
727  Value *Args[] = {Statepoint,
728  getInt32(BaseOffset),
729  getInt32(DerivedOffset)};
730  return createCallHelper(FnGCRelocate, Args, this, Name);
731 }
732 
734  Instruction *FMFSource,
735  const Twine &Name) {
736  Module *M = BB->getModule();
737  Function *Fn = Intrinsic::getDeclaration(M, ID, {V->getType()});
738  return createCallHelper(Fn, {V}, this, Name, FMFSource);
739 }
740 
742  Value *RHS,
743  Instruction *FMFSource,
744  const Twine &Name) {
745  Module *M = BB->getModule();
746  Function *Fn = Intrinsic::getDeclaration(M, ID, { LHS->getType() });
747  return createCallHelper(Fn, {LHS, RHS}, this, Name, FMFSource);
748 }
749 
751  ArrayRef<Type *> Types,
753  Instruction *FMFSource,
754  const Twine &Name) {
755  Module *M = BB->getModule();
756  Function *Fn = Intrinsic::getDeclaration(M, ID, Types);
757  return createCallHelper(Fn, Args, this, Name, FMFSource);
758 }
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:88
IntegerType * getType() const
getType - Specialize the getType() method to always return an IntegerType, which reduces the amount o...
Definition: Constants.h:171
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
void copyFastMathFlags(FastMathFlags FMF)
Convenience function for transferring all fast-math flag values to this instruction, which must be an operator which supports these flags.
static Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
Definition: Constants.cpp:2579
static IntegerType * getInt1Ty(LLVMContext &C)
Definition: Type.cpp:177
CallInst * CreateInvariantStart(Value *Ptr, ConstantInt *Size=nullptr)
Create a call to invariant.start intrinsic.
Definition: IRBuilder.cpp:432
This class represents lattice values for constants.
Definition: AllocatorList.h:23
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:66
iterator begin() const
Definition: ArrayRef.h:136
amdgpu Simplify well known AMD library false FunctionCallee Value const Twine & Name
CallInst * CreateElementUnorderedAtomicMemMove(Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign, uint64_t Size, uint32_t ElementSize, MDNode *TBAATag=nullptr, MDNode *TBAAStructTag=nullptr, MDNode *ScopeTag=nullptr, MDNode *NoAliasTag=nullptr)
Create and insert an element unordered-atomic memmove between the specified pointers.
Definition: IRBuilder.h:552
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", Instruction *InsertBefore=nullptr)
FastMathFlags FMF
Definition: IRBuilder.h:97
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...
Definition: IRBuilder.cpp:717
This class represents a function call, abstracting a target machine&#39;s calling convention.
Like Internal, but omit from symbol table.
Definition: GlobalValue.h:56
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:743
Metadata node.
Definition: Metadata.h:863
CallInst * CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, unsigned Align, bool isVolatile=false, MDNode *TBAATag=nullptr, MDNode *ScopeTag=nullptr, MDNode *NoAliasTag=nullptr)
Create and insert a memset to the specified pointer and the specified value.
Definition: IRBuilder.h:440
LLVMContext & Context
Definition: IRBuilder.h:94
const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
Definition: BasicBlock.cpp:140
static CallInst * CreateGCStatepointCallCommon(IRBuilderBase *Builder, uint64_t ID, uint32_t NumPatchBytes, Value *ActualCallee, uint32_t Flags, ArrayRef< T0 > CallArgs, ArrayRef< T1 > TransitionArgs, ArrayRef< T2 > DeoptArgs, ArrayRef< T3 > GCArgs, const Twine &Name)
Definition: IRBuilder.cpp:601
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:80
IntegerType * getInt64Ty()
Fetch the type representing a 64-bit integer.
Definition: IRBuilder.h:388
CallInst * CreateFAddReduce(Value *Acc, Value *Src)
Create a vector fadd reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:323
static Attribute getWithAlignment(LLVMContext &Context, Align Alignment)
Return a uniquified Attribute object that has the specific alignment set.
Definition: Attributes.cpp:145
CallInst * CreateMemMove(Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign, uint64_t Size, bool isVolatile=false, MDNode *TBAATag=nullptr, MDNode *ScopeTag=nullptr, MDNode *NoAliasTag=nullptr)
Create and insert a memmove between the specified pointers.
Definition: IRBuilder.h:530
CallInst * CreateMaskedGather(Value *Ptrs, unsigned Align, Value *Mask=nullptr, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Gather intrinsic.
Definition: IRBuilder.cpp:522
BasicBlock * BB
Definition: IRBuilder.h:92
CallInst * CreateFPMinReduce(Value *Src, bool NoNaN=false)
Create a vector float min reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:389
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:246
BasicBlock * GetInsertBlock() const
Definition: IRBuilder.h:126
void SetInstDebugLocation(Instruction *I) const
If this builder has a current debug location, set it on the specified instruction.
Definition: IRBuilder.h:163
This class represents a no-op cast from one type to another.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:32
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Definition: IRBuilder.cpp:733
Function * getDeclaration(Module *M, ID id, ArrayRef< Type *> Tys=None)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
Definition: Function.cpp:1093
static CallInst * createCallHelper(Function *Callee, ArrayRef< Value *> Ops, IRBuilderBase *Builder, const Twine &Name="", Instruction *FMFSource=nullptr)
Definition: IRBuilder.cpp:74
CallInst * CreateXorReduce(Value *Src)
Create a vector int XOR reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:361
CallInst * CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes, Value *ActualCallee, ArrayRef< Value *> CallArgs, ArrayRef< Value *> DeoptArgs, ArrayRef< Value *> GCArgs, const Twine &Name="")
Create a call to the experimental.gc.statepoint intrinsic to start a new statepoint sequence...
Definition: IRBuilder.cpp:624
Type * getReturnType() const
Returns the type of the ret val.
Definition: Function.h:168
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition: MathExtras.h:465
LLVM Basic Block Representation.
Definition: BasicBlock.h:57
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:148
ConstantInt * getInt1(bool V)
Get a constant value representing either true or false.
Definition: IRBuilder.h:318
This is an important base class in LLVM.
Definition: Constant.h:41
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static InvokeInst * CreateGCStatepointInvokeCommon(IRBuilderBase *Builder, uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee, BasicBlock *NormalDest, BasicBlock *UnwindDest, uint32_t Flags, ArrayRef< T0 > InvokeArgs, ArrayRef< T1 > TransitionArgs, ArrayRef< T2 > DeoptArgs, ArrayRef< T3 > GCArgs, const Twine &Name)
Definition: IRBuilder.cpp:652
InvokeInst * CreateGCStatepointInvoke(uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value *> InvokeArgs, ArrayRef< Value *> DeoptArgs, ArrayRef< Value *> GCArgs, const Twine &Name="")
Create an invoke to the experimental.gc.statepoint intrinsic to start a new statepoint sequence...
Definition: IRBuilder.cpp:674
A specialization of it&#39;s base class for read-write access to a gc.statepoint.
Definition: Statepoint.h:305
ConstantInt * getInt64(uint64_t C)
Get a constant 64-bit value.
Definition: IRBuilder.h:348
static Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:343
Type * getCurrentFunctionReturnType() const
Get the return type of the current function that we&#39;re emitting into.
Definition: IRBuilder.cpp:56
static UndefValue * get(Type *T)
Static factory methods - Return an &#39;undef&#39; object of the specified type.
Definition: Constants.cpp:1446
static constexpr const Align None()
Returns a default constructed Align which corresponds to no alignment.
Definition: Alignment.h:93
PointerType * getInt8PtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer to an 8-bit integer value.
Definition: IRBuilder.h:421
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
Definition: Metadata.cpp:1222
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:40
CallInst * CreateLifetimeEnd(Value *Ptr, ConstantInt *Size=nullptr)
Create a lifetime.end intrinsic.
Definition: IRBuilder.cpp:416
const InstListType & getInstList() const
Return the underlying instruction list container.
Definition: BasicBlock.h:338
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
Definition: InstrTypes.h:1397
CallInst * CreateAddReduce(Value *Src)
Create a vector int add reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:341
This is the shared class of boolean and integer constants.
Definition: Constants.h:83
CallInst * CreateIntMaxReduce(Value *Src, bool IsSigned=false)
Create a vector integer max reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:366
GlobalVariable * CreateGlobalString(StringRef Str, const Twine &Name="", unsigned AddressSpace=0)
Make a new global variable with initializer type i8*.
Definition: IRBuilder.cpp:42
CallInst * CreateAssumption(Value *Cond)
Create an assume intrinsic call that allows the optimizer to assume that the provided condition will ...
Definition: IRBuilder.cpp:452
CallInst * CreateElementUnorderedAtomicMemSet(Value *Ptr, Value *Val, uint64_t Size, unsigned Align, uint32_t ElementSize, MDNode *TBAATag=nullptr, MDNode *ScopeTag=nullptr, MDNode *NoAliasTag=nullptr)
Create and insert an element unordered-atomic memset of the region of memory starting at the given po...
Definition: IRBuilder.h:459
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type *> Types, ArrayRef< Value *> Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with args, mangled using Types.
Definition: IRBuilder.cpp:750
static CallInst * getReductionIntrinsic(IRBuilderBase *Builder, Intrinsic::ID ID, Value *Src)
Definition: IRBuilder.cpp:314
static InvokeInst * createInvokeHelper(Function *Invokee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value *> Ops, IRBuilderBase *Builder, const Twine &Name="")
Definition: IRBuilder.cpp:86
AddressSpace
Definition: NVPTXBaseInfo.h:21
iterator end() const
Definition: ArrayRef.h:137
CallInst * CreateMaskedStore(Value *Val, Value *Ptr, unsigned Align, Value *Mask)
Create a call to Masked Store intrinsic.
Definition: IRBuilder.cpp:491
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition: IRBuilder.h:343
CallInst * CreateMemCpy(Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign, uint64_t Size, bool isVolatile=false, MDNode *TBAATag=nullptr, MDNode *TBAAStructTag=nullptr, MDNode *ScopeTag=nullptr, MDNode *NoAliasTag=nullptr)
Create and insert a memcpy between the specified pointers.
Definition: IRBuilder.h:482
static std::vector< Value * > getStatepointArgs(IRBuilderBase &B, uint64_t ID, uint32_t NumPatchBytes, Value *ActualCallee, uint32_t Flags, ArrayRef< T0 > CallArgs, ArrayRef< T1 > TransitionArgs, ArrayRef< T2 > DeoptArgs, ArrayRef< T3 > GCArgs)
Definition: IRBuilder.cpp:580
CallInst * CreateFMulReduce(Value *Acc, Value *Src)
Create a vector fmul reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:332
CallInst * CreateMaskedLoad(Value *Ptr, unsigned Align, Value *Mask, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Load intrinsic.
Definition: IRBuilder.cpp:470
void setNoNaNs(bool B=true)
Definition: Operator.h:218
IntegerType * getInt1Ty()
Fetch the type representing a single bit.
Definition: IRBuilder.h:368
CallInst * CreateAndReduce(Value *Src)
Create a vector int AND reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:351
CallInst * CreateOrReduce(Value *Src)
Create a vector int OR reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:356
CallInst * CreateIntMinReduce(Value *Src, bool IsSigned=false)
Create a vector integer min reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:372
iterator insert(iterator where, pointer New)
Definition: ilist.h:226
void setUnnamedAddr(UnnamedAddr Val)
Definition: GlobalValue.h:219
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value *> Args, const Twine &NameStr, Instruction *InsertBefore=nullptr)
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Definition: Type.cpp:614
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:106
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 ...
Definition: IRBuilder.cpp:705
CallInst * CreateMulReduce(Value *Src)
Create a vector int mul reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:346
uint32_t Size
Definition: Profile.cpp:46
CallInst * CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 2 operands which is mangled on the first type. ...
Definition: IRBuilder.cpp:741
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
CallInst * CreateMaskedScatter(Value *Val, Value *Ptrs, unsigned Align, Value *Mask=nullptr)
Create a call to Masked Scatter intrinsic.
Definition: IRBuilder.cpp:553
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:575
LLVM Value Representation.
Definition: Value.h:74
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E&#39;s largest value.
Definition: BitmaskEnum.h:80
BasicBlock::iterator GetInsertPoint() const
Definition: IRBuilder.h:127
Invoke instruction.
CallInst * CreateLifetimeStart(Value *Ptr, ConstantInt *Size=nullptr)
Create a lifetime.start intrinsic.
Definition: IRBuilder.cpp:400
Convenience struct for specifying and reasoning about fast-math flags.
Definition: Operator.h:159
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
static bool isVolatile(Instruction *Inst)
CallInst * CreateElementUnorderedAtomicMemCpy(Value *Dst, unsigned DstAlign, Value *Src, unsigned SrcAlign, uint64_t Size, uint32_t ElementSize, MDNode *TBAATag=nullptr, MDNode *TBAAStructTag=nullptr, MDNode *ScopeTag=nullptr, MDNode *NoAliasTag=nullptr)
Create and insert an element unordered-atomic memcpy between the specified pointers.
Definition: IRBuilder.h:508
CallInst * CreateFPMaxReduce(Value *Src, bool NoNaN=false)
Create a vector float max reduction intrinsic of the source vector.
Definition: IRBuilder.cpp:378
BasicBlock::iterator InsertPt
Definition: IRBuilder.h:93
constexpr char Args[]
Key for Kernel::Metadata::mArgs.